Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 677b732

Browse files
committed
mass update
1 parent f60f07a commit 677b732

7 files changed

+341
-106
lines changed

A_star_vs_RBFS.ipynb

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 9,
6+
"id": "6fa86ef3-f46e-48fb-ad79-18c359742eb2",
7+
"metadata": {},
8+
"outputs": [
9+
{
10+
"name": "stdout",
11+
"output_type": "stream",
12+
"text": [
13+
"(<B>, 0)\n",
14+
"['A', 'S', 'R', 'P', 'B']\n"
15+
]
16+
}
17+
],
18+
"source": [
19+
"from search_2 import *\n",
20+
"import math\n",
21+
"\n",
22+
"def h(n):\n",
23+
" return 0\n",
24+
"\n",
25+
"def recursive_best_first_search(problem):\n",
26+
" return RBFS(problem, Node(problem.initial), math.inf)\n",
27+
"\n",
28+
"def RBFS(problem, node, f_limit):\n",
29+
" if problem.is_goal(node.state):\n",
30+
" return node, 0\n",
31+
" successors = []\n",
32+
" for child in expand(problem, node):\n",
33+
" successors.append(child)\n",
34+
" if not successors:\n",
35+
" return failure, math.inf\n",
36+
" for s in successors:\n",
37+
" s.f = max(g(s) + h(s), g(node) + h(node))\n",
38+
" while True:\n",
39+
" successors.sort(key = lambda x: x.f)\n",
40+
" best = successors[0]\n",
41+
" if best.f > f_limit:\n",
42+
" return failure, best.f\n",
43+
" if len(successors) > 1:\n",
44+
" alternative = successors[1].f\n",
45+
" else:\n",
46+
" alternative = math.inf\n",
47+
" result, best.f = RBFS(problem, best, min(f_limit, alternative))\n",
48+
" if result is not failure:\n",
49+
" return result, best.f\n",
50+
" \n",
51+
"\n",
52+
"\n",
53+
"romania = Map(\n",
54+
" {('O', 'Z'): 71, ('O', 'S'): 151, ('A', 'Z'): 75, ('A', 'S'): 140, ('A', 'T'): 118, \n",
55+
" ('L', 'T'): 111, ('L', 'M'): 70, ('D', 'M'): 75, ('C', 'D'): 120, ('C', 'R'): 146, \n",
56+
" ('C', 'P'): 138, ('R', 'S'): 80, ('F', 'S'): 99, ('B', 'F'): 211, ('B', 'P'): 101, \n",
57+
" ('B', 'G'): 90, ('B', 'U'): 85, ('H', 'U'): 98, ('E', 'H'): 86, ('U', 'V'): 142, \n",
58+
" ('I', 'V'): 92, ('I', 'N'): 87, ('P', 'R'): 97},\n",
59+
" {'A': ( 76, 497), 'B': (400, 327), 'C': (246, 285), 'D': (160, 296), 'E': (558, 294), \n",
60+
" 'F': (285, 460), 'G': (368, 257), 'H': (548, 355), 'I': (488, 535), 'L': (162, 379),\n",
61+
" 'M': (160, 343), 'N': (407, 561), 'O': (117, 580), 'P': (311, 372), 'R': (227, 412),\n",
62+
" 'S': (187, 463), 'T': ( 83, 414), 'U': (471, 363), 'V': (535, 473), 'Z': (92, 539)})\n",
63+
"\n",
64+
"\n",
65+
"r1 = RouteProblem('A', 'B', map=romania)\n",
66+
"sol = recursive_best_first_search(r1)\n",
67+
"print(sol)\n",
68+
"print(path_states(sol[0]))"
69+
]
70+
},
71+
{
72+
"cell_type": "code",
73+
"execution_count": null,
74+
"id": "d164c550-188f-46d8-85b4-7f79d0db9ea6",
75+
"metadata": {},
76+
"outputs": [],
77+
"source": []
78+
},
79+
{
80+
"cell_type": "code",
81+
"execution_count": null,
82+
"id": "540136fc-7dad-44e2-8526-04fca350e846",
83+
"metadata": {},
84+
"outputs": [],
85+
"source": []
86+
},
87+
{
88+
"cell_type": "code",
89+
"execution_count": null,
90+
"id": "3237f8a2-ff08-4087-8c4c-44c4d445ff26",
91+
"metadata": {},
92+
"outputs": [],
93+
"source": []
94+
}
95+
],
96+
"metadata": {
97+
"kernelspec": {
98+
"display_name": "Python 3 (ipykernel)",
99+
"language": "python",
100+
"name": "python3"
101+
},
102+
"language_info": {
103+
"codemirror_mode": {
104+
"name": "ipython",
105+
"version": 3
106+
},
107+
"file_extension": ".py",
108+
"mimetype": "text/x-python",
109+
"name": "python",
110+
"nbconvert_exporter": "python",
111+
"pygments_lexer": "ipython3",
112+
"version": "3.11.2"
113+
}
114+
},
115+
"nbformat": 4,
116+
"nbformat_minor": 5
117+
}

Cannibals.html

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7514,7 +7514,7 @@
75147514
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
75157515
</div>
75167516
<div class="jp-InputArea jp-Cell-inputArea">
7517-
<div class="jp-InputPrompt jp-InputArea-prompt">In [19]:</div>
7517+
<div class="jp-InputPrompt jp-InputArea-prompt">In [4]:</div>
75187518
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
75197519
<div class="cm-editor cm-s-jupyter">
75207520
<div class="highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">search_2</span> <span class="kn">import</span> <span class="o">*</span>
@@ -7528,7 +7528,7 @@
75287528
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
75297529
</div>
75307530
<div class="jp-InputArea jp-Cell-inputArea">
7531-
<div class="jp-InputPrompt jp-InputArea-prompt">In [46]:</div>
7531+
<div class="jp-InputPrompt jp-InputArea-prompt">In [45]:</div>
75327532
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
75337533
<div class="cm-editor cm-s-jupyter">
75347534
<div class="highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">xs</span><span class="p">,</span><span class="n">ys</span><span class="p">):</span>
@@ -7553,24 +7553,33 @@
75537553
<span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)]</span>
75547554

75557555
<span class="k">def</span> <span class="nf">result</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
7556-
<span class="k">return</span> <span class="n">add</span><span class="p">(</span><span class="n">action</span><span class="p">,</span><span class="n">state</span><span class="p">)</span>
7556+
<span class="k">return</span> <span class="n">add</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">state</span><span class="p">)</span>
75577557

75587558
<span class="k">def</span> <span class="nf">actions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">):</span>
75597559
<span class="n">legit_directions</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
75607560
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">directions</span><span class="p">:</span>
7561-
<span class="n">result</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">d</span><span class="p">,</span><span class="n">state</span><span class="p">)</span>
7562-
<span class="c1"># if more cannibals than missionaries</span>
7563-
<span class="k">if</span><span class="p">(</span><span class="n">state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">state</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">or</span> <span class="n">state</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">state</span><span class="p">[</span><span class="mi">4</span><span class="p">]):</span>
7561+
<span class="n">result</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">state</span><span class="p">)</span>
7562+
<span class="c1"># if more cannibals than missionaries, but if there are no missionaries </span>
7563+
<span class="c1"># we can have as many cannibals as we like :)</span>
7564+
<span class="k">if</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">):</span>
7565+
<span class="k">if</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">result</span><span class="p">[</span><span class="mi">1</span><span class="p">]):</span>
7566+
<span class="k">continue</span>
7567+
<span class="k">if</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">):</span>
7568+
<span class="k">if</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">result</span><span class="p">[</span><span class="mi">5</span><span class="p">]):</span>
7569+
<span class="k">continue</span>
7570+
<span class="c1"># if there are negative numbers / more than 3 of each cannibals/missionaries</span>
7571+
<span class="c1"># on the left hand side</span>
7572+
<span class="k">if</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">result</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="ow">or</span> <span class="n">result</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">):</span>
75647573
<span class="k">continue</span>
7565-
<span class="c1"># if there are negative numbers / more than 3</span>
7566-
<span class="c1"># of each canns missionaries</span>
7567-
<span class="k">if</span><span class="p">(</span><span class="n">state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">state</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="ow">or</span> <span class="n">state</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">):</span>
7574+
<span class="c1"># if there are negative numbers / more than 3 of each cannibals/missionaries</span>
7575+
<span class="c1"># on the right hand side</span>
7576+
<span class="k">if</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">result</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">result</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="ow">or</span> <span class="n">result</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">):</span>
75687577
<span class="k">continue</span>
7569-
<span class="c1"># now we need to check boat status</span>
7570-
<span class="n">b1</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
7578+
<span class="c1"># now we need to check boat status - bit spagetti :)</span>
7579+
<span class="n">b1</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
75717580
<span class="k">if</span><span class="p">(</span><span class="n">b1</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">b1</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">):</span>
75727581
<span class="k">continue</span>
7573-
<span class="n">b2</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
7582+
<span class="n">b2</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
75747583
<span class="k">if</span><span class="p">(</span><span class="n">b2</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">b2</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">):</span>
75757584
<span class="k">continue</span>
75767585
<span class="k">if</span><span class="p">(</span><span class="n">b1</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span>
@@ -7592,11 +7601,13 @@
75927601
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
75937602
</div>
75947603
<div class="jp-InputArea jp-Cell-inputArea">
7595-
<div class="jp-InputPrompt jp-InputArea-prompt">In [47]:</div>
7604+
<div class="jp-InputPrompt jp-InputArea-prompt">In [46]:</div>
75967605
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
75977606
<div class="cm-editor cm-s-jupyter">
75987607
<div class="highlight hl-ipython3"><pre><span></span><span class="n">problem</span> <span class="o">=</span> <span class="n">Cannibals</span><span class="p">()</span>
7599-
<span class="nb">print</span><span class="p">(</span><span class="n">path_states</span><span class="p">(</span><span class="n">astar_search</span><span class="p">(</span><span class="n">problem</span><span class="p">)))</span>
7608+
<span class="n">states</span> <span class="o">=</span> <span class="n">path_states</span><span class="p">(</span><span class="n">breadth_first_search</span><span class="p">(</span><span class="n">problem</span><span class="p">))</span>
7609+
<span class="nb">print</span><span class="p">(</span><span class="n">states</span><span class="p">)</span>
7610+
<span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">states</span><span class="p">))</span>
76007611
</pre></div>
76017612
</div>
76027613
</div>
@@ -7609,13 +7620,25 @@
76097620
<div class="jp-OutputArea-child">
76107621
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
76117622
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0">
7612-
<pre>[(3, 3, 1, 0, 0, 0), (2, 2, 0, 1, 1, 1), (2, 3, 1, 0, 1, 0), (1, 2, 0, 1, 2, 1), (2, 2, 1, 0, 1, 1), (0, 2, 0, 1, 3, 1), (1, 2, 1, 0, 2, 1), (0, 1, 0, 1, 3, 2), (1, 1, 1, 0, 2, 2), (0, 0, 0, 1, 3, 3)]
7623+
<pre>[(3, 3, 1, 0, 0, 0), (1, 3, 0, 1, 2, 0), (2, 3, 1, 0, 1, 0), (0, 3, 0, 1, 3, 0), (1, 3, 1, 0, 2, 0), (1, 1, 0, 1, 2, 2), (2, 2, 1, 0, 1, 1), (2, 0, 0, 1, 1, 3), (3, 0, 1, 0, 0, 3), (1, 0, 0, 1, 2, 3), (2, 0, 1, 0, 1, 3), (0, 0, 0, 1, 3, 3)]
7624+
12
76137625
</pre>
76147626
</div>
76157627
</div>
76167628
</div>
76177629
</div>
76187630
</div>
7631+
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=39f17a48-dd26-435f-8535-e67555abfa7c">
7632+
<div class="jp-Cell-inputWrapper" tabindex="0">
7633+
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
7634+
</div>
7635+
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
7636+
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
7637+
<p>We don't need fancy algorithms for this. Step costs are identical, so breadth first search is optimal and complete.</p>
7638+
</div>
7639+
</div>
7640+
</div>
7641+
</div>
76197642
</main>
76207643
</body>
76217644
</html>

Cannibals.ipynb

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"cells": [
33
{
44
"cell_type": "code",
5-
"execution_count": 19,
5+
"execution_count": 4,
66
"id": "dc5a163b-a0c6-46ac-a6b8-3d896331c6f4",
77
"metadata": {},
88
"outputs": [],
@@ -12,7 +12,7 @@
1212
},
1313
{
1414
"cell_type": "code",
15-
"execution_count": 46,
15+
"execution_count": 45,
1616
"id": "15f03785-bd50-4326-bd47-99a202c8e1e0",
1717
"metadata": {},
1818
"outputs": [],
@@ -39,24 +39,33 @@
3939
" (0, 1, 1, -1, 0, -1)]\n",
4040
" \n",
4141
" def result(self, state, action):\n",
42-
" return add(action,state)\n",
42+
" return add(action, state)\n",
4343
" \n",
4444
" def actions(self, state):\n",
4545
" legit_directions = set()\n",
4646
" for d in self.directions:\n",
47-
" result = add(d,state)\n",
48-
" # if more cannibals than missionaries\n",
49-
" if(state[0] > state[1] or state[3] > state[4]):\n",
47+
" result = add(d, state)\n",
48+
" # if more cannibals than missionaries, but if there are no missionaries \n",
49+
" # we can have as many cannibals as we like :)\n",
50+
" if(result[1] > 0):\n",
51+
" if(result[0] > result[1]):\n",
52+
" continue\n",
53+
" if(result[5] > 0):\n",
54+
" if(result[4] > result[5]):\n",
55+
" continue\n",
56+
" # if there are negative numbers / more than 3 of each cannibals/missionaries\n",
57+
" # on the left hand side\n",
58+
" if(result[0] < 0 or result[1] < 0 or result[0] > 3 or result[1] > 3):\n",
5059
" continue\n",
51-
" # if there are negative numbers / more than 3\n",
52-
" # of each canns missionaries\n",
53-
" if(state[0] < 0 or state[1] < 0 or state[0] > 3 or state[1] > 3):\n",
60+
" # if there are negative numbers / more than 3 of each cannibals/missionaries\n",
61+
" # on the right hand side\n",
62+
" if(result[4] < 0 or result[5] < 0 or result[4] > 3 or result[5] > 3):\n",
5463
" continue\n",
55-
" # now we need to check boat status\n",
56-
" b1 = state[2]\n",
64+
" # now we need to check boat status - bit spagetti :)\n",
65+
" b1 = result[2]\n",
5766
" if(b1 < 0 or b1 > 1):\n",
5867
" continue\n",
59-
" b2 = state[3]\n",
68+
" b2 = result[3]\n",
6069
" if(b2 < 0 or b2 > 1):\n",
6170
" continue \n",
6271
" if(b1 == 1):\n",
@@ -72,21 +81,32 @@
7281
},
7382
{
7483
"cell_type": "code",
75-
"execution_count": 47,
84+
"execution_count": 46,
7685
"id": "6d591417-9225-4eba-bea5-9bb87268f2e0",
7786
"metadata": {},
7887
"outputs": [
7988
{
8089
"name": "stdout",
8190
"output_type": "stream",
8291
"text": [
83-
"[(3, 3, 1, 0, 0, 0), (2, 2, 0, 1, 1, 1), (2, 3, 1, 0, 1, 0), (1, 2, 0, 1, 2, 1), (2, 2, 1, 0, 1, 1), (0, 2, 0, 1, 3, 1), (1, 2, 1, 0, 2, 1), (0, 1, 0, 1, 3, 2), (1, 1, 1, 0, 2, 2), (0, 0, 0, 1, 3, 3)]\n"
92+
"[(3, 3, 1, 0, 0, 0), (1, 3, 0, 1, 2, 0), (2, 3, 1, 0, 1, 0), (0, 3, 0, 1, 3, 0), (1, 3, 1, 0, 2, 0), (1, 1, 0, 1, 2, 2), (2, 2, 1, 0, 1, 1), (2, 0, 0, 1, 1, 3), (3, 0, 1, 0, 0, 3), (1, 0, 0, 1, 2, 3), (2, 0, 1, 0, 1, 3), (0, 0, 0, 1, 3, 3)]\n",
93+
"12\n"
8494
]
8595
}
8696
],
8797
"source": [
8898
"problem = Cannibals()\n",
89-
"print(path_states(astar_search(problem)))"
99+
"states = path_states(breadth_first_search(problem))\n",
100+
"print(states)\n",
101+
"print(len(states))"
102+
]
103+
},
104+
{
105+
"cell_type": "markdown",
106+
"id": "39f17a48-dd26-435f-8535-e67555abfa7c",
107+
"metadata": {},
108+
"source": [
109+
"We don't need fancy algorithms for this. Step costs are identical, so breadth first search is optimal and complete. "
90110
]
91111
}
92112
],

0 commit comments

Comments
 (0)