|
2 | 2 | "cells": [
|
3 | 3 | {
|
4 | 4 | "cell_type": "code",
|
5 |
| - "execution_count": 123, |
| 5 | + "execution_count": 4, |
6 | 6 | "id": "4b3f41d2-acc8-42eb-ab23-468b3f020416",
|
7 | 7 | "metadata": {},
|
8 | 8 | "outputs": [
|
9 | 9 | {
|
10 | 10 | "name": "stdout",
|
11 | 11 | "output_type": "stream",
|
12 | 12 | "text": [
|
13 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O')\n", |
14 |
| - "4962.250202429876\n", |
15 |
| - "STATE ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O')\n", |
16 |
| - "NSTATE ('E', 'B', 'F', 'S', 'D', 'L', 'T', 'P', 'H', 'R', 'Z', 'N', 'I', 'G', 'M', 'V', 'A', 'C', 'U', 'O')\n", |
17 |
| - "new_state ('E', 'B', 'F', 'S', 'D', 'L', 'T', 'P', 'H', 'R', 'Z', 'N', 'I', 'G', 'M', 'V', 'A', 'C', 'U', 'O')\n", |
18 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') E\n", |
19 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') E E\n", |
20 |
| - "4962.250202429876\n", |
21 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') B\n", |
22 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') B B\n", |
23 |
| - "4962.250202429876\n", |
24 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') F\n", |
25 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') F F\n", |
26 |
| - "4962.250202429876\n", |
27 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') S\n", |
28 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') S S\n", |
29 |
| - "4962.250202429876\n", |
30 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') D\n", |
31 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') D D\n", |
32 |
| - "4962.250202429876\n", |
33 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') L\n", |
34 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') L L\n", |
35 |
| - "4962.250202429876\n", |
36 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') T\n", |
37 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') T T\n", |
38 |
| - "4962.250202429876\n", |
39 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') P\n", |
40 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') P P\n", |
41 |
| - "4962.250202429876\n", |
42 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') H\n", |
43 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') H H\n", |
44 |
| - "4962.250202429876\n", |
45 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') R\n", |
46 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') R R\n", |
47 |
| - "4962.250202429876\n", |
48 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') Z\n", |
49 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') Z Z\n", |
50 |
| - "4962.250202429876\n", |
51 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') N\n", |
52 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') N N\n", |
53 |
| - "4962.250202429876\n", |
54 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') I\n", |
55 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') I I\n", |
56 |
| - "4962.250202429876\n", |
57 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') G\n", |
58 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') G G\n", |
59 |
| - "4962.250202429876\n", |
60 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') M\n", |
61 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') M M\n", |
62 |
| - "4962.250202429876\n", |
63 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') V\n", |
64 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') V V\n", |
65 |
| - "4962.250202429876\n", |
66 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') A\n", |
67 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') A A\n", |
68 |
| - "4962.250202429876\n", |
69 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') C\n", |
70 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') C C\n", |
71 |
| - "4962.250202429876\n", |
72 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') U\n", |
73 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') U U\n", |
74 |
| - "4962.250202429876\n", |
75 |
| - "('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') O\n", |
76 |
| - "action cost ('E', 'B', 'F', 'S', 'M', 'G', 'I', 'N', 'Z', 'R', 'H', 'P', 'T', 'L', 'D', 'V', 'A', 'C', 'U', 'O') O O\n", |
77 |
| - "4962.250202429876\n", |
78 |
| - "STATE E\n", |
79 |
| - "NSTATE ('E',)\n", |
80 |
| - "new_state ('E',)\n", |
81 |
| - "E E\n", |
82 |
| - "action cost E E E\n" |
| 13 | + "optimal route 1715.211603318795\n", |
| 14 | + "initial route ('A', 'T', 'L', 'S', 'D', 'C', 'P', 'G', 'B', 'U', 'E', 'H', 'V', 'I', 'N', 'F', 'R', 'M', 'O', 'Z')\n", |
| 15 | + "initial route cost 2024.8555347300094\n" |
83 | 16 | ]
|
84 | 17 | },
|
85 | 18 | {
|
86 |
| - "ename": "TypeError", |
87 |
| - "evalue": "unsupported operand type(s) for +: 'float' and 'NoneType'", |
88 |
| - "output_type": "error", |
89 |
| - "traceback": [ |
90 |
| - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", |
91 |
| - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", |
92 |
| - "Cell \u001b[0;32mIn[123], line 76\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28mprint\u001b[39m(cost(initial_route))\n\u001b[1;32m 75\u001b[0m r0 \u001b[38;5;241m=\u001b[39m TSP(initial \u001b[38;5;241m=\u001b[39m initial_route)\n\u001b[0;32m---> 76\u001b[0m path_states(\u001b[43muniform_cost_search\u001b[49m\u001b[43m(\u001b[49m\u001b[43mr0\u001b[49m\u001b[43m)\u001b[49m) \n", |
93 |
| - "File \u001b[0;32m~/aima-python/search_2.py:151\u001b[0m, in \u001b[0;36muniform_cost_search\u001b[0;34m(problem)\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21muniform_cost_search\u001b[39m(problem):\n\u001b[1;32m 150\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSearch nodes with minimum path cost first.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 151\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbest_first_search\u001b[49m\u001b[43m(\u001b[49m\u001b[43mproblem\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mg\u001b[49m\u001b[43m)\u001b[49m\n", |
94 |
| - "File \u001b[0;32m~/aima-python/search_2.py:101\u001b[0m, in \u001b[0;36mbest_first_search\u001b[0;34m(problem, f)\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m problem\u001b[38;5;241m.\u001b[39mis_goal(node\u001b[38;5;241m.\u001b[39mstate):\n\u001b[1;32m 100\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m node\n\u001b[0;32m--> 101\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchild\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mexpand\u001b[49m\u001b[43m(\u001b[49m\u001b[43mproblem\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnode\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 102\u001b[0m \u001b[43m \u001b[49m\u001b[43ms\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mchild\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstate\u001b[49m\n\u001b[1;32m 103\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43ms\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mreached\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchild\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath_cost\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m<\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mreached\u001b[49m\u001b[43m[\u001b[49m\u001b[43ms\u001b[49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath_cost\u001b[49m\u001b[43m:\u001b[49m\n", |
95 |
| - "File \u001b[0;32m~/aima-python/search_2.py:49\u001b[0m, in \u001b[0;36mexpand\u001b[0;34m(problem, node)\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m action \u001b[38;5;129;01min\u001b[39;00m problem\u001b[38;5;241m.\u001b[39mactions(s):\n\u001b[1;32m 48\u001b[0m s1 \u001b[38;5;241m=\u001b[39m problem\u001b[38;5;241m.\u001b[39mresult(s, action)\n\u001b[0;32m---> 49\u001b[0m cost \u001b[38;5;241m=\u001b[39m \u001b[43mnode\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath_cost\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mproblem\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maction_cost\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maction\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43ms1\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m Node(s1, node, action, cost)\n", |
96 |
| - "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'float' and 'NoneType'" |
| 19 | + "name": "stderr", |
| 20 | + "output_type": "stream", |
| 21 | + "text": [ |
| 22 | + "Exception ignored in: <bound method IPythonKernel._clean_thread_parent_frames of <ipykernel.ipkernel.IPythonKernel object at 0x7fd35e1c6190>>\n", |
| 23 | + "Traceback (most recent call last):\n", |
| 24 | + " File \"/usr/local/lib/python3.11/dist-packages/ipykernel/ipkernel.py\", line 775, in _clean_thread_parent_frames\n", |
| 25 | + " def _clean_thread_parent_frames(\n", |
| 26 | + "\n", |
| 27 | + "KeyboardInterrupt: \n", |
| 28 | + "\n", |
| 29 | + "KeyboardInterrupt\n", |
| 30 | + "\n" |
97 | 31 | ]
|
98 | 32 | }
|
99 | 33 | ],
|
|
108 | 42 | "\n",
|
109 | 43 | "distances = {}\n",
|
110 | 44 | "\n",
|
| 45 | + "correct_route = ['A', 'T', 'L', 'M', 'D', 'C', 'P',\n", |
| 46 | + " 'G', 'B', 'U', 'E', 'H', 'V', 'I', \n", |
| 47 | + " 'N', 'F', 'R', 'S', 'O', 'Z']\n", |
| 48 | + "\n", |
111 | 49 | "for city in romania.keys():\n",
|
112 | 50 | " distances[city] = {}\n",
|
113 | 51 | "\n",
|
|
125 | 63 | " c += distances[route[0]][route[-1]]\n",
|
126 | 64 | " return c\n",
|
127 | 65 | "\n",
|
| 66 | + "print(\"optimal route\", cost(correct_route))\n", |
| 67 | + "\n", |
128 | 68 | "class TSP(Problem):\n",
|
129 | 69 | " \n",
|
130 | 70 | " def two_opt(self, state):\n",
|
131 |
| - " \"\"\" Neighbour generating function for Traveling Salesman Problem \"\"\"\n", |
132 |
| - " print(\"STATE\", state)\n", |
133 | 71 | " neighbour_state = state[:]\n",
|
134 | 72 | " left = random.randint(0, len(neighbour_state) - 1)\n",
|
135 | 73 | " right = random.randint(0, len(neighbour_state) - 1)\n",
|
136 | 74 | " if left > right:\n",
|
137 | 75 | " left, right = right, left\n",
|
138 |
| - "\n", |
139 | 76 | " neighbour_list = list(neighbour_state)\n",
|
140 | 77 | " x = neighbour_list[left: right + 1]\n",
|
141 | 78 | " neighbour_list[left: right + 1] = x[::-1]\n",
|
142 | 79 | " neighbour_state = tuple(neighbour_list)\n",
|
143 |
| - " print(\"NSTATE\", neighbour_state)\n", |
144 | 80 | " return neighbour_state\n",
|
145 | 81 | " \n",
|
146 | 82 | " def is_goal(self, state):\n",
|
147 |
| - " return False\n", |
| 83 | + " return cost(state) < 2000\n", |
148 | 84 | " \n",
|
149 | 85 | " def actions(self, state): \n",
|
150 | 86 | " \"\"\"The places neighboring `state`.\"\"\"\n",
|
151 |
| - " new_state = self.two_opt(state)\n", |
152 |
| - " print(\"new_state\", new_state)\n", |
153 |
| - " return new_state\n", |
| 87 | + " new_states = set()\n", |
| 88 | + " for i in range(6):\n", |
| 89 | + " new_state = self.two_opt(state)\n", |
| 90 | + " new_states.add(new_state)\n", |
| 91 | + " return new_states\n", |
154 | 92 | " \n",
|
155 | 93 | " def result(self, state, action):\n",
|
156 | 94 | " \"\"\"Go to the `action` place, if the map says that is possible.\"\"\"\n",
|
157 |
| - " print(state, action)\n", |
158 | 95 | " return action\n",
|
159 | 96 | " \n",
|
160 | 97 | " def action_cost(self, s, action, s1):\n",
|
161 | 98 | " \"\"\"The distance (cost) to go from s to s1.\"\"\"\n",
|
162 |
| - " print(\"action cost\", s, action, s1)\n", |
163 |
| - " if(type(s) == tuple):\n", |
164 |
| - " print(cost(s))\n", |
165 |
| - " return cost(s)\n", |
| 99 | + " if(type(action) == tuple):\n", |
| 100 | + " return cost(action)\n", |
166 | 101 | "\n",
|
167 | 102 | "\n",
|
168 | 103 | "initial_route = list(romania.keys())\n",
|
169 | 104 | "random.shuffle(initial_route)\n",
|
| 105 | + "\n", |
| 106 | + "initial_route = ['A', 'T', 'L', 'S', 'D', 'C', 'P',\n", |
| 107 | + " 'G', 'B', 'U', 'E', 'H', 'V', 'I', \n", |
| 108 | + " 'N', 'F', 'R', 'M', 'O', 'Z']\n", |
| 109 | + "\n", |
| 110 | + "\n", |
170 | 111 | "initial_route = tuple(initial_route)\n",
|
171 | 112 | "\n",
|
172 |
| - "print(initial_route)\n", |
173 |
| - "print(cost(initial_route))\n", |
| 113 | + "print(\"initial route\", initial_route)\n", |
| 114 | + "print(\"initial route cost\", cost(initial_route))\n", |
174 | 115 | "\n",
|
175 | 116 | "r0 = TSP(initial = initial_route)\n",
|
176 |
| - "path_states(uniform_cost_search(r0)) " |
| 117 | + "path = path_states(uniform_cost_search(r0)) \n", |
| 118 | + "print(cost(path[-1]))\n", |
| 119 | + "print(path[-1])" |
177 | 120 | ]
|
178 | 121 | },
|
179 | 122 | {
|
|
0 commit comments