Skip to content

Commit a690882

Browse files
nvinayvarma189norvig
authored andcommitted
added Best First search in search.ipynb (aimacode#708)
* added Best First search * fixed minor conflicts * minor changes
1 parent 0a0d646 commit a690882

File tree

1 file changed

+125
-2
lines changed

1 file changed

+125
-2
lines changed

search.ipynb

Lines changed: 125 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"* Breadth-First Search\n",
4242
"* Uniform Cost Search\n",
4343
"* A\\* Search\n",
44+
"* Best First Search\n",
4445
"* Genetic Algorithm"
4546
]
4647
},
@@ -447,7 +448,7 @@
447448
"2. Depth First Tree Search - Implemented\n",
448449
"3. Depth First Graph Search - Implemented\n",
449450
"4. Breadth First Search - Implemented\n",
450-
"5. Best First Graph Search\n",
451+
"5. Best First Graph Search - Implemented\n",
451452
"6. Uniform Cost Search - Implemented\n",
452453
"7. Depth Limited Search\n",
453454
"8. Iterative Deepening Search\n",
@@ -1190,7 +1191,7 @@
11901191
],
11911192
"source": [
11921193
"all_node_colors = []\n",
1193-
"romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)\n",
1194+
"romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)\n",
11941195
"display_visual(user_input = False, algorithm = astar_search, problem = romania_problem)"
11951196
]
11961197
},
@@ -1253,6 +1254,128 @@
12531254
"display_visual(user_input = True)"
12541255
]
12551256
},
1257+
{
1258+
"cell_type": "markdown",
1259+
"metadata": {},
1260+
"source": [
1261+
"## BEST FIRST SEARCH\n",
1262+
"Let's change all the node_colors to starting position and define a different problem statement."
1263+
]
1264+
},
1265+
{
1266+
"cell_type": "code",
1267+
"execution_count": 23,
1268+
"metadata": {},
1269+
"outputs": [],
1270+
"source": [
1271+
"def best_first_graph_search(problem, f):\n",
1272+
" \"\"\"Search the nodes with the lowest f scores first.\n",
1273+
" You specify the function f(node) that you want to minimize; for example,\n",
1274+
" if f is a heuristic estimate to the goal, then we have greedy best\n",
1275+
" first search; if f is node.depth then we have breadth-first search.\n",
1276+
" There is a subtlety: the line \"f = memoize(f, 'f')\" means that the f\n",
1277+
" values will be cached on the nodes as they are computed. So after doing\n",
1278+
" a best first search you can examine the f values of the path returned.\"\"\"\n",
1279+
" \n",
1280+
" # we use these two variables at the time of visualisations\n",
1281+
" iterations = 0\n",
1282+
" all_node_colors = []\n",
1283+
" node_colors = dict(initial_node_colors)\n",
1284+
" \n",
1285+
" f = memoize(f, 'f')\n",
1286+
" node = Node(problem.initial)\n",
1287+
" \n",
1288+
" node_colors[node.state] = \"red\"\n",
1289+
" iterations += 1\n",
1290+
" all_node_colors.append(dict(node_colors))\n",
1291+
" \n",
1292+
" if problem.goal_test(node.state):\n",
1293+
" node_colors[node.state] = \"green\"\n",
1294+
" iterations += 1\n",
1295+
" all_node_colors.append(dict(node_colors))\n",
1296+
" return(iterations, all_node_colors, node)\n",
1297+
" \n",
1298+
" frontier = PriorityQueue(min, f)\n",
1299+
" frontier.append(node)\n",
1300+
" \n",
1301+
" node_colors[node.state] = \"orange\"\n",
1302+
" iterations += 1\n",
1303+
" all_node_colors.append(dict(node_colors))\n",
1304+
" \n",
1305+
" explored = set()\n",
1306+
" while frontier:\n",
1307+
" node = frontier.pop()\n",
1308+
" \n",
1309+
" node_colors[node.state] = \"red\"\n",
1310+
" iterations += 1\n",
1311+
" all_node_colors.append(dict(node_colors))\n",
1312+
" \n",
1313+
" if problem.goal_test(node.state):\n",
1314+
" node_colors[node.state] = \"green\"\n",
1315+
" iterations += 1\n",
1316+
" all_node_colors.append(dict(node_colors))\n",
1317+
" return(iterations, all_node_colors, node)\n",
1318+
" \n",
1319+
" explored.add(node.state)\n",
1320+
" for child in node.expand(problem):\n",
1321+
" if child.state not in explored and child not in frontier:\n",
1322+
" frontier.append(child)\n",
1323+
" node_colors[child.state] = \"orange\"\n",
1324+
" iterations += 1\n",
1325+
" all_node_colors.append(dict(node_colors))\n",
1326+
" elif child in frontier:\n",
1327+
" incumbent = frontier[child]\n",
1328+
" if f(child) < f(incumbent):\n",
1329+
" del frontier[incumbent]\n",
1330+
" frontier.append(child)\n",
1331+
" node_colors[child.state] = \"orange\"\n",
1332+
" iterations += 1\n",
1333+
" all_node_colors.append(dict(node_colors))\n",
1334+
"\n",
1335+
" node_colors[node.state] = \"gray\"\n",
1336+
" iterations += 1\n",
1337+
" all_node_colors.append(dict(node_colors))\n",
1338+
" return None\n",
1339+
"\n",
1340+
"def best_first_search(problem, h=None):\n",
1341+
" \"\"\"Best-first graph search is an informative searching algorithm with f(n) = h(n).\n",
1342+
" You need to specify the h function when you call best_first_search, or\n",
1343+
" else in your Problem subclass.\"\"\"\n",
1344+
" h = memoize(h or problem.h, 'h')\n",
1345+
" iterations, all_node_colors, node = best_first_graph_search(problem, lambda n: h(n))\n",
1346+
" return(iterations, all_node_colors, node)"
1347+
]
1348+
},
1349+
{
1350+
"cell_type": "code",
1351+
"execution_count": 39,
1352+
"metadata": {},
1353+
"outputs": [
1354+
{
1355+
"data": {
1356+
"application/vnd.jupyter.widget-view+json": {
1357+
"model_id": "5ae2d521b74743afa988c462a851c269"
1358+
}
1359+
},
1360+
"metadata": {},
1361+
"output_type": "display_data"
1362+
},
1363+
{
1364+
"data": {
1365+
"application/vnd.jupyter.widget-view+json": {
1366+
"model_id": "559c20b044a4469db7f0ab8c3fae1022"
1367+
}
1368+
},
1369+
"metadata": {},
1370+
"output_type": "display_data"
1371+
}
1372+
],
1373+
"source": [
1374+
"all_node_colors = []\n",
1375+
"romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)\n",
1376+
"display_visual(user_input = False, algorithm = best_first_search, problem = romania_problem)"
1377+
]
1378+
},
12561379
{
12571380
"cell_type": "markdown",
12581381
"metadata": {},

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy