Newer
Older
"A gene's value in an individual `q` denotes the queen's column, and the position of the gene denotes its row. We can check if the aforementioned values between two genes are the same. We also need to check for diagonals. A queen *a* is in the diagonal of another queen, *b*, if the difference of the rows between them is equal to either their difference in columns (for the diagonal on the right of *a*) or equal to the negative difference of their columns (for the left diagonal of *a*). Below is given the fitness function."
Aman Deep Singh
a validé
]
},
{
"cell_type": "code",
Aman Deep Singh
a validé
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def fitness(q):\n",
" non_attacking = 0\n",
" for row1 in range(len(q)):\n",
" for row2 in range(row1+1, len(q)):\n",
" col1 = int(q[row1])\n",
" col2 = int(q[row2])\n",
" row_diff = row1 - row2\n",
" col_diff = col1 - col2\n",
"\n",
" if col1 != col2 and row_diff != col_diff and row_diff != -col_diff:\n",
" non_attacking += 1\n",
"\n",
" return non_attacking"
Aman Deep Singh
a validé
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that the best score achievable is 28. That is because for each queen we only check for the queens after her. For the first queen we check 7 other queens, for the second queen 6 others and so on. In short, the number of checks we make is the sum 7+6+5+...+1. Which is equal to 7\\*(7+1)/2 = 28.\n",
"\n",
"Because it is very hard and will take long to find a perfect solution, we will set the fitness threshold at 25. If we find an individual with a score greater or equal to that, we will halt. Let's see how the genetic algorithm will fare."
Aman Deep Singh
a validé
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2, 5, 7, 1, 3, 6, 4, 6]\n",
"25\n"
Aman Deep Singh
a validé
"source": [
"solution = genetic_algorithm(population, fitness, f_thres=25, gene_pool=range(8))\n",
"print(solution)\n",
"print(fitness(solution))"
Aman Deep Singh
a validé
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Above you can see the solution and its fitness score, which should be no less than 25."
Aman Deep Singh
a validé
]
},
{
"cell_type": "markdown",
"This is where we conclude Genetic Algorithms."
]
},
{
"cell_type": "markdown",
"### N-Queens Problem\n",
"Here, we will look at the generalized cae of the Eight Queens problem.\n",
"<br>\n",
"We are given a `N` x `N` chessboard, with `N` queens, and we need to place them in such a way that no two queens can attack each other.\n",
"<br>\n",
"We will solve this problem using search algorithms.\n",
"To do this, we already have a `NQueensProblem` class in `search.py`."
Aman Deep Singh
a validé
]
},
{
"cell_type": "code",
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n",
" \"http://www.w3.org/TR/html4/strict.dtd\">\n",
"\n",
"<html>\n",
"<head>\n",
" <title></title>\n",
" <meta http-equiv=\"content-type\" content=\"text/html; charset=None\">\n",
" <style type=\"text/css\">\n",
"td.linenos { background-color: #f0f0f0; padding-right: 10px; }\n",
"span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\n",
"pre { line-height: 125%; }\n",
"body .hll { background-color: #ffffcc }\n",
"body { background: #f8f8f8; }\n",
"body .c { color: #408080; font-style: italic } /* Comment */\n",
"body .err { border: 1px solid #FF0000 } /* Error */\n",
"body .k { color: #008000; font-weight: bold } /* Keyword */\n",
"body .o { color: #666666 } /* Operator */\n",
"body .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n",
"body .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n",
"body .cp { color: #BC7A00 } /* Comment.Preproc */\n",
"body .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n",
"body .c1 { color: #408080; font-style: italic } /* Comment.Single */\n",
"body .cs { color: #408080; font-style: italic } /* Comment.Special */\n",
"body .gd { color: #A00000 } /* Generic.Deleted */\n",
"body .ge { font-style: italic } /* Generic.Emph */\n",
"body .gr { color: #FF0000 } /* Generic.Error */\n",
"body .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n",
"body .gi { color: #00A000 } /* Generic.Inserted */\n",
"body .go { color: #888888 } /* Generic.Output */\n",
"body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n",
"body .gs { font-weight: bold } /* Generic.Strong */\n",
"body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n",
"body .gt { color: #0044DD } /* Generic.Traceback */\n",
"body .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n",
"body .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n",
"body .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n",
"body .kp { color: #008000 } /* Keyword.Pseudo */\n",
"body .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n",
"body .kt { color: #B00040 } /* Keyword.Type */\n",
"body .m { color: #666666 } /* Literal.Number */\n",
"body .s { color: #BA2121 } /* Literal.String */\n",
"body .na { color: #7D9029 } /* Name.Attribute */\n",
"body .nb { color: #008000 } /* Name.Builtin */\n",
"body .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n",
"body .no { color: #880000 } /* Name.Constant */\n",
"body .nd { color: #AA22FF } /* Name.Decorator */\n",
"body .ni { color: #999999; font-weight: bold } /* Name.Entity */\n",
"body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n",
"body .nf { color: #0000FF } /* Name.Function */\n",
"body .nl { color: #A0A000 } /* Name.Label */\n",
"body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n",
"body .nt { color: #008000; font-weight: bold } /* Name.Tag */\n",
"body .nv { color: #19177C } /* Name.Variable */\n",
"body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n",
"body .w { color: #bbbbbb } /* Text.Whitespace */\n",
"body .mb { color: #666666 } /* Literal.Number.Bin */\n",
"body .mf { color: #666666 } /* Literal.Number.Float */\n",
"body .mh { color: #666666 } /* Literal.Number.Hex */\n",
"body .mi { color: #666666 } /* Literal.Number.Integer */\n",
"body .mo { color: #666666 } /* Literal.Number.Oct */\n",
"body .sa { color: #BA2121 } /* Literal.String.Affix */\n",
"body .sb { color: #BA2121 } /* Literal.String.Backtick */\n",
"body .sc { color: #BA2121 } /* Literal.String.Char */\n",
"body .dl { color: #BA2121 } /* Literal.String.Delimiter */\n",
"body .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n",
"body .s2 { color: #BA2121 } /* Literal.String.Double */\n",
"body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n",
"body .sh { color: #BA2121 } /* Literal.String.Heredoc */\n",
"body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n",
"body .sx { color: #008000 } /* Literal.String.Other */\n",
"body .sr { color: #BB6688 } /* Literal.String.Regex */\n",
"body .s1 { color: #BA2121 } /* Literal.String.Single */\n",
"body .ss { color: #19177C } /* Literal.String.Symbol */\n",
"body .bp { color: #008000 } /* Name.Builtin.Pseudo */\n",
"body .fm { color: #0000FF } /* Name.Function.Magic */\n",
"body .vc { color: #19177C } /* Name.Variable.Class */\n",
"body .vg { color: #19177C } /* Name.Variable.Global */\n",
"body .vi { color: #19177C } /* Name.Variable.Instance */\n",
"body .vm { color: #19177C } /* Name.Variable.Magic */\n",
"body .il { color: #666666 } /* Literal.Number.Integer.Long */\n",
"\n",
" </style>\n",
"</head>\n",
"<body>\n",
"<h2></h2>\n",
"\n",
"<div class=\"highlight\"><pre><span></span><span class=\"k\">class</span> <span class=\"nc\">NQueensProblem</span><span class=\"p\">(</span><span class=\"n\">Problem</span><span class=\"p\">):</span>\n",
" <span class=\"sd\">"""The problem of placing N queens on an NxN board with none attacking</span>\n",
"<span class=\"sd\"> each other. A state is represented as an N-element array, where</span>\n",
"<span class=\"sd\"> a value of r in the c-th entry means there is a queen at column c,</span>\n",
"<span class=\"sd\"> row r, and a value of -1 means that the c-th column has not been</span>\n",
"<span class=\"sd\"> filled in yet. We fill in columns left to right.</span>\n",
"<span class=\"sd\"> >>> depth_first_tree_search(NQueensProblem(8))</span>\n",
"<span class=\"sd\"> <Node (7, 3, 0, 2, 5, 1, 6, 4)></span>\n",
"<span class=\"sd\"> """</span>\n",
" <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">N</span><span class=\"p\">):</span>\n",
" <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">N</span> <span class=\"o\">=</span> <span class=\"n\">N</span>\n",
" <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">([</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">N</span><span class=\"p\">)</span>\n",
" <span class=\"n\">Problem</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial</span><span class=\"p\">)</span>\n",
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
" <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>\n",
" <span class=\"sd\">"""In the leftmost empty column, try all non-conflicting rows."""</span>\n",
" <span class=\"k\">if</span> <span class=\"n\">state</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">:</span>\n",
" <span class=\"k\">return</span> <span class=\"p\">[]</span> <span class=\"c1\"># All columns filled; no successors</span>\n",
" <span class=\"k\">else</span><span class=\"p\">:</span>\n",
" <span class=\"n\">col</span> <span class=\"o\">=</span> <span class=\"n\">state</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n",
" <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">row</span> <span class=\"k\">for</span> <span class=\"n\">row</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">N</span><span class=\"p\">)</span>\n",
" <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">conflicted</span><span class=\"p\">(</span><span class=\"n\">state</span><span class=\"p\">,</span> <span class=\"n\">row</span><span class=\"p\">,</span> <span class=\"n\">col</span><span class=\"p\">)]</span>\n",
"\n",
" <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\">row</span><span class=\"p\">):</span>\n",
" <span class=\"sd\">"""Place the next queen at the given row."""</span>\n",
" <span class=\"n\">col</span> <span class=\"o\">=</span> <span class=\"n\">state</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n",
" <span class=\"n\">new</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">state</span><span class=\"p\">[:])</span>\n",
" <span class=\"n\">new</span><span class=\"p\">[</span><span class=\"n\">col</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">row</span>\n",
" <span class=\"k\">return</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"n\">new</span><span class=\"p\">)</span>\n",
"\n",
" <span class=\"k\">def</span> <span class=\"nf\">conflicted</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\">row</span><span class=\"p\">,</span> <span class=\"n\">col</span><span class=\"p\">):</span>\n",
" <span class=\"sd\">"""Would placing a queen at (row, col) conflict with anything?"""</span>\n",
" <span class=\"k\">return</span> <span class=\"nb\">any</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">conflict</span><span class=\"p\">(</span><span class=\"n\">row</span><span class=\"p\">,</span> <span class=\"n\">col</span><span class=\"p\">,</span> <span class=\"n\">state</span><span class=\"p\">[</span><span class=\"n\">c</span><span class=\"p\">],</span> <span class=\"n\">c</span><span class=\"p\">)</span>\n",
" <span class=\"k\">for</span> <span class=\"n\">c</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">col</span><span class=\"p\">))</span>\n",
"\n",
" <span class=\"k\">def</span> <span class=\"nf\">conflict</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">row1</span><span class=\"p\">,</span> <span class=\"n\">col1</span><span class=\"p\">,</span> <span class=\"n\">row2</span><span class=\"p\">,</span> <span class=\"n\">col2</span><span class=\"p\">):</span>\n",
" <span class=\"sd\">"""Would putting two queens in (row1, col1) and (row2, col2) conflict?"""</span>\n",
" <span class=\"k\">return</span> <span class=\"p\">(</span><span class=\"n\">row1</span> <span class=\"o\">==</span> <span class=\"n\">row2</span> <span class=\"ow\">or</span> <span class=\"c1\"># same row</span>\n",
" <span class=\"n\">col1</span> <span class=\"o\">==</span> <span class=\"n\">col2</span> <span class=\"ow\">or</span> <span class=\"c1\"># same column</span>\n",
" <span class=\"n\">row1</span> <span class=\"o\">-</span> <span class=\"n\">col1</span> <span class=\"o\">==</span> <span class=\"n\">row2</span> <span class=\"o\">-</span> <span class=\"n\">col2</span> <span class=\"ow\">or</span> <span class=\"c1\"># same \\ diagonal</span>\n",
" <span class=\"n\">row1</span> <span class=\"o\">+</span> <span class=\"n\">col1</span> <span class=\"o\">==</span> <span class=\"n\">row2</span> <span class=\"o\">+</span> <span class=\"n\">col2</span><span class=\"p\">)</span> <span class=\"c1\"># same / diagonal</span>\n",
"\n",
" <span class=\"k\">def</span> <span class=\"nf\">goal_test</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">state</span><span class=\"p\">):</span>\n",
" <span class=\"sd\">"""Check if all columns filled, no conflicts."""</span>\n",
" <span class=\"k\">if</span> <span class=\"n\">state</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">:</span>\n",
" <span class=\"k\">return</span> <span class=\"bp\">False</span>\n",
" <span class=\"k\">return</span> <span class=\"ow\">not</span> <span class=\"nb\">any</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">conflicted</span><span class=\"p\">(</span><span class=\"n\">state</span><span class=\"p\">,</span> <span class=\"n\">state</span><span class=\"p\">[</span><span class=\"n\">col</span><span class=\"p\">],</span> <span class=\"n\">col</span><span class=\"p\">)</span>\n",
" <span class=\"k\">for</span> <span class=\"n\">col</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">state</span><span class=\"p\">)))</span>\n",
"\n",
" <span class=\"k\">def</span> <span class=\"nf\">h</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">node</span><span class=\"p\">):</span>\n",
" <span class=\"sd\">"""Return number of conflicting queens for a given node"""</span>\n",
" <span class=\"n\">num_conflicts</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n",
" <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"n\">r1</span><span class=\"p\">,</span> <span class=\"n\">c1</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">):</span>\n",
" <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"n\">r2</span><span class=\"p\">,</span> <span class=\"n\">c2</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">):</span>\n",
" <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">r1</span><span class=\"p\">,</span> <span class=\"n\">c1</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"p\">(</span><span class=\"n\">r2</span><span class=\"p\">,</span> <span class=\"n\">c2</span><span class=\"p\">):</span>\n",
" <span class=\"n\">num_conflicts</span> <span class=\"o\">+=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">conflict</span><span class=\"p\">(</span><span class=\"n\">r1</span><span class=\"p\">,</span> <span class=\"n\">c1</span><span class=\"p\">,</span> <span class=\"n\">r2</span><span class=\"p\">,</span> <span class=\"n\">c2</span><span class=\"p\">)</span>\n",
"\n",
" <span class=\"k\">return</span> <span class=\"n\">num_conflicts</span>\n",
"</pre></div>\n",
"</body>\n",
"</html>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
Aman Deep Singh
a validé
"source": [
Aman Deep Singh
a validé
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In [`csp.ipynb`](https://github.com/aimacode/aima-python/blob/master/csp.ipynb) we have seen that the N-Queens problem can be formulated as a CSP and can be solved by \n",
"the `min_conflicts` algorithm in a way similar to Hill-Climbing. \n",
"Here, we want to solve it using heuristic search algorithms and even some classical search algorithms.\n",
"The `NQueensProblem` class derives from the `Problem` class and is implemented in such a way that the search algorithms we already have, can solve it.\n",
"<br>\n",
"Let's instantiate the class."
Aman Deep Singh
a validé
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"collapsed": true
},
"outputs": [],
Aman Deep Singh
a validé
"source": [
]
},
{
"cell_type": "markdown",
"Let's use `depth_first_tree_search` first.\n",
"<br>\n",
"We will also use the %%timeit magic with each algorithm to see how much time they take."
"cell_type": "code",
"execution_count": 82,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4.82 ms ± 498 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
]
}
],
"%%timeit\n",
"depth_first_tree_search(nqp)"
]
},
{
"cell_type": "code",
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
"dfts = depth_first_tree_search(nqp).solution()"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\ni42ZrZLUJWmMc25x2vWJm5m9KqnLOZfLhVPM7F5JP3bO3WNmwyWNcs71pl2vuPXHi9clzXHONXNh\nr1BF6mFfLOkV59x+59y7krZK+kzKdYqNc+4ZScfTrkdSnHNvOOf29r8+JennkqakW6t4Oc9b/W/b\n+x+5+UVtZlMlXSHpnn58C9IAAAJTSURBVLTrgqEzszGS5knaKEnOuXfzGKz7fVLSL1opWEvFCthT\nJL1W9v6gcvYfflGY2Qcl/Z6k59OtSfz6h4xflHRU0g+dc3n6jN+U9GVJ/z3tiiTISdpuZnvMbHna\nlYnZDEnHJG3qP61xj5mdm3alErJU0pa0K1GtSAHbbzHa3PReisLM3ifpQUkrnXMn065P3JxzZ51z\nF0qaKuliM8vF6Q0zWyzpqHNuT9p1Sdhc59xFkhZK+o/9p6ryok3SRZL+xjn3e5LelpSruUCS1D/U\nf6Wk76Vdl2pFCtgHJU0rez9V0qGU6oI69J/XfVDSfc65f0i7PknqH2rcIenTKVclLnMlXdl/jner\npMvM7O/SrVL8nHOH+p+PSnpI3qm4vDgo6WDZqM/fywvgebNQ0l7n3JG0K1KtSAH7nyR92Mym9/+C\nWippW8p1QkT9E7I2Svq5c25d2vVJgpl1mtm4/tfnSFog6V/TrVU8nHO3OOemOuc+KO9v70fOuc+m\nXK1Ymdm5/RMi1T9U/EeScnPVhnPusKTXzOwj/Zs+KSk3kz7LLFMLDodLrXF7zaZwzp0xsxslPSFp\nmKS/dc69nHK1YmNmWyTNlzTRzA5K+opzbmO6tYrVXEnXSvqX/nO8krTGOfePKdYpbu+XdG//DNV/\nJ+kB51wuL3/KqcmSHuq/FWSbpO865x5Pt0qx+6Kk+/o7Pfsl3ZByfWJlZqPkXUn0H9Kui5/CXNYF\nAECWFWlIHACAzCJgAwCQAQRsAAAygIANAEAGELABAMgAAjYAABlAwAYAIAP+fzFY3dTllVswAAAA\nAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2871fddf550>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_NQueens(dfts)"
]
},
{
"cell_type": "markdown",
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"88.6 ms ± 2.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
"%%timeit\n",
"breadth_first_tree_search(nqp)"
]
},
{
"cell_type": "code",
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"bfts = breadth_first_tree_search(nqp).solution()"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nubfMrFPSdklfcs49l3LVYmNmyyX1SBrlnFuQdn3iZmavSupxzuVy4RQzu0fSj51zd5vZUEkjnHO5\nu+t8f7x4XdJM51wrF/YKVaQe9kWSXnHO7XHOvStpk6TPpFyn2DjnnpF0JO16JMU594Zzblf/6xOS\nfi5pUrq1ipfzvNX/tl2ok/MAAAJgSURBVLP/kZtf1GY2WdLlku5Ouy6on5mNkjRb0jpJcs69m8dg\n3e+Tkn7RTsFaKlbAniTptbL3+5Sz//CLwsw+KOn3JT2fbk3i1z9k/KKkQ5J+5JzL02f8pqQvS/of\naVckQU7SFjPbaWZL0q5MzKZJOixpff9pjbvN7Oy0K5WQRZI2pl2JakUK2H6L0eam91IUZvY+SQ9I\nWuacO552feLmnDvjnLtA0mRJF5lZLk5vmNkCSYecczvTrkvCZjnnLpQ0T9J/6j9VlRcdki6U9DfO\nud+X9LakXM0FkqT+of4rJH0/7bpUK1LA3idpStn7yZL2p1QXNKD/vO4Dku51zv1D2vVJUv9Q41ZJ\nn065KnGZJemK/nO8myRdamZ/l26V4uec29//fEjSg/JOxeXFPkn7ykZ9/l5eAM+beZJ2OecOpl2R\nakUK2P8k6cNmNrX/F9QiSZtTrhMi6p+QtU7Sz51zq9OuTxLMrNvMxvS/PkvSXEn/mm6t4uGcu9k5\nN9k590F5f3tPOec+m3K1YmVmZ/dPiFT/UPEfS8rNVRvOuQOSXjOzj/Rv+qSk3Ez6LLNYbTgcLrXH\n7TVbwjl32sxukPS4pCGS/tY593LK1YqNmW2UNEfSeDPbJ+krzrl16dYqVrMkXSPpX/rP8UrSSufc\nP6ZYp7i9X9I9/TNUf0fS/c65XF7+lFMTJT3YfyvIDknfc849lm6VYvdFSff2d3r2SLo+5frEysxG\nyLuS6D+mXRc/hbmsCwCALCvSkDgAAJlFwAYAIAMI2AAAZAABGwCADCBgAwCQAQRsAAAygIANAEAG\n/P+uMuaa/akHvAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2871fde6898>"
]
},
"metadata": {},
"output_type": "display_data"
]
},
{
"cell_type": "markdown",
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.08 s ± 154 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
"%%timeit\n",
"uniform_cost_search(nqp)"
"cell_type": "code",
"execution_count": 89,
"metadata": {
"collapsed": true
},
"outputs": [],
"ucs = uniform_cost_search(nqp).solution()"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nubfMrFPSdklfcs49l3LVYmNmyyX1SBrlnFuQdn3iZmavSupxzuVy4RQzu0fSj51zd5vZUEkjnHO5\nu+t8f7x4XdJM51wrF/YKVaQe9kWSXnHO7XHOvStpk6TPpFyn2DjnnpF0JO16JMU594Zzblf/6xOS\nfi5pUrq1ipfzvNX/tl2ok/MAAAJgSURBVLP/kZtf1GY2WdLlku5Ouy6on5mNkjRb0jpJcs69m8dg\n3e+Tkn7RTsFaKlbAniTptbL3+5Sz//CLwsw+KOn3JT2fbk3i1z9k/KKkQ5J+5JzL02f8pqQvS/of\naVckQU7SFjPbaWZL0q5MzKZJOixpff9pjbvN7Oy0K5WQRZI2pl2JakUK2H6L0eam91IUZvY+SQ9I\nWuacO552feLmnDvjnLtA0mRJF5lZLk5vmNkCSYecczvTrkvCZjnnLpQ0T9J/6j9VlRcdki6U9DfO\nud+X9LakXM0FkqT+of4rJH0/7bpUK1LA3idpStn7yZL2p1QXNKD/vO4Dku51zv1D2vVJUv9Q41ZJ\nn065KnGZJemK/nO8myRdamZ/l26V4uec29//fEjSg/JOxeXFPkn7ykZ9/l5eAM+beZJ2OecOpl2R\nakUK2P8k6cNmNrX/F9QiSZtTrhMi6p+QtU7Sz51zq9OuTxLMrNvMxvS/PkvSXEn/mm6t4uGcu9k5\nN9k590F5f3tPOec+m3K1YmVmZ/dPiFT/UPEfS8rNVRvOuQOSXjOzj/Rv+qSk3Ez6LLNYbTgcLrXH\n7TVbwjl32sxukPS4pCGS/tY593LK1YqNmW2UNEfSeDPbJ+krzrl16dYqVrMkXSPpX/rP8UrSSufc\nP6ZYp7i9X9I9/TNUf0fS/c65XF7+lFMTJT3YfyvIDknfc849lm6VYvdFSff2d3r2SLo+5frEysxG\nyLuS6D+mXRc/hbmsCwCALCvSkDgAAJlFwAYAIAMI2AAAZAABGwCADCBgAwCQAQRsAAAygIANAEAG\n/P+uMuaa/akHvAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2871f6c04e0>"
]
},
"metadata": {},
"output_type": "display_data"
]
},
{
"cell_type": "markdown",
"`depth_first_tree_search` is almost 20 times faster than `breadth_first_tree_search` and more than 200 times faster than `uniform_cost_search`."
"cell_type": "markdown",
"metadata": {},
"We can also solve this problem using `astar_search` with a suitable heuristic function. \n",
"<br>\n",
"The best heuristic function for this scenario will be one that returns the number of conflicts in the current state."
"cell_type": "code",
"execution_count": 91,
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
"outputs": [
{
"data": {
"text/html": [
"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n",
" \"http://www.w3.org/TR/html4/strict.dtd\">\n",
"\n",
"<html>\n",
"<head>\n",
" <title></title>\n",
" <meta http-equiv=\"content-type\" content=\"text/html; charset=None\">\n",
" <style type=\"text/css\">\n",
"td.linenos { background-color: #f0f0f0; padding-right: 10px; }\n",
"span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\n",
"pre { line-height: 125%; }\n",
"body .hll { background-color: #ffffcc }\n",
"body { background: #f8f8f8; }\n",
"body .c { color: #408080; font-style: italic } /* Comment */\n",
"body .err { border: 1px solid #FF0000 } /* Error */\n",
"body .k { color: #008000; font-weight: bold } /* Keyword */\n",
"body .o { color: #666666 } /* Operator */\n",
"body .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n",
"body .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n",
"body .cp { color: #BC7A00 } /* Comment.Preproc */\n",
"body .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n",
"body .c1 { color: #408080; font-style: italic } /* Comment.Single */\n",
"body .cs { color: #408080; font-style: italic } /* Comment.Special */\n",
"body .gd { color: #A00000 } /* Generic.Deleted */\n",
"body .ge { font-style: italic } /* Generic.Emph */\n",
"body .gr { color: #FF0000 } /* Generic.Error */\n",
"body .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n",
"body .gi { color: #00A000 } /* Generic.Inserted */\n",
"body .go { color: #888888 } /* Generic.Output */\n",
"body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n",
"body .gs { font-weight: bold } /* Generic.Strong */\n",
"body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n",
"body .gt { color: #0044DD } /* Generic.Traceback */\n",
"body .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n",
"body .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n",
"body .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n",
"body .kp { color: #008000 } /* Keyword.Pseudo */\n",
"body .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n",
"body .kt { color: #B00040 } /* Keyword.Type */\n",
"body .m { color: #666666 } /* Literal.Number */\n",
"body .s { color: #BA2121 } /* Literal.String */\n",
"body .na { color: #7D9029 } /* Name.Attribute */\n",
"body .nb { color: #008000 } /* Name.Builtin */\n",
"body .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n",
"body .no { color: #880000 } /* Name.Constant */\n",
"body .nd { color: #AA22FF } /* Name.Decorator */\n",
"body .ni { color: #999999; font-weight: bold } /* Name.Entity */\n",
"body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n",
"body .nf { color: #0000FF } /* Name.Function */\n",
"body .nl { color: #A0A000 } /* Name.Label */\n",
"body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n",
"body .nt { color: #008000; font-weight: bold } /* Name.Tag */\n",
"body .nv { color: #19177C } /* Name.Variable */\n",
"body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n",
"body .w { color: #bbbbbb } /* Text.Whitespace */\n",
"body .mb { color: #666666 } /* Literal.Number.Bin */\n",
"body .mf { color: #666666 } /* Literal.Number.Float */\n",
"body .mh { color: #666666 } /* Literal.Number.Hex */\n",
"body .mi { color: #666666 } /* Literal.Number.Integer */\n",
"body .mo { color: #666666 } /* Literal.Number.Oct */\n",
"body .sa { color: #BA2121 } /* Literal.String.Affix */\n",
"body .sb { color: #BA2121 } /* Literal.String.Backtick */\n",
"body .sc { color: #BA2121 } /* Literal.String.Char */\n",
"body .dl { color: #BA2121 } /* Literal.String.Delimiter */\n",
"body .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n",
"body .s2 { color: #BA2121 } /* Literal.String.Double */\n",
"body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n",
"body .sh { color: #BA2121 } /* Literal.String.Heredoc */\n",
"body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n",
"body .sx { color: #008000 } /* Literal.String.Other */\n",
"body .sr { color: #BB6688 } /* Literal.String.Regex */\n",
"body .s1 { color: #BA2121 } /* Literal.String.Single */\n",
"body .ss { color: #19177C } /* Literal.String.Symbol */\n",
"body .bp { color: #008000 } /* Name.Builtin.Pseudo */\n",
"body .fm { color: #0000FF } /* Name.Function.Magic */\n",
"body .vc { color: #19177C } /* Name.Variable.Class */\n",
"body .vg { color: #19177C } /* Name.Variable.Global */\n",
"body .vi { color: #19177C } /* Name.Variable.Instance */\n",
"body .vm { color: #19177C } /* Name.Variable.Magic */\n",
"body .il { color: #666666 } /* Literal.Number.Integer.Long */\n",
"\n",
" </style>\n",
"</head>\n",
"<body>\n",
"<h2></h2>\n",
"\n",
"<div class=\"highlight\"><pre><span></span> <span class=\"k\">def</span> <span class=\"nf\">h</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">node</span><span class=\"p\">):</span>\n",
" <span class=\"sd\">"""Return number of conflicting queens for a given node"""</span>\n",
" <span class=\"n\">num_conflicts</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n",
" <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"n\">r1</span><span class=\"p\">,</span> <span class=\"n\">c1</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">):</span>\n",
" <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"n\">r2</span><span class=\"p\">,</span> <span class=\"n\">c2</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">):</span>\n",
" <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">r1</span><span class=\"p\">,</span> <span class=\"n\">c1</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"p\">(</span><span class=\"n\">r2</span><span class=\"p\">,</span> <span class=\"n\">c2</span><span class=\"p\">):</span>\n",
" <span class=\"n\">num_conflicts</span> <span class=\"o\">+=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">conflict</span><span class=\"p\">(</span><span class=\"n\">r1</span><span class=\"p\">,</span> <span class=\"n\">c1</span><span class=\"p\">,</span> <span class=\"n\">r2</span><span class=\"p\">,</span> <span class=\"n\">c2</span><span class=\"p\">)</span>\n",
"\n",
" <span class=\"k\">return</span> <span class=\"n\">num_conflicts</span>\n",
"</pre></div>\n",
"</body>\n",
"</html>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"8.85 ms ± 424 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
]
},
{
"cell_type": "markdown",
"`astar_search` is faster than both `uniform_cost_search` and `breadth_first_tree_search`."
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"astar = astar_search(nqp).solution()"
"cell_type": "code",
"execution_count": 94,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAewAAAHwCAYAAABkPlyAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3X+4FdWd7/nP93IOIIZfBw6YAGOg\nkyczHSO2nBa7iQwxpA0IRmd6umGMXs1kuJO5hqDY6Zbn6Scmz41mVCB07OncXGnw3jagaduI2lGi\nEQwYtQ+00jHpnseAiYj8OMIJKCYCd80fdbZn/6iqXWfvql27qt6v59nP3rtq1Vpr73Xgu9eqVavM\nOScAANDe/l3aFQAAAPURsAEAyAACNgAAGUDABgAgAwjYAABkAAEbAIAMIGADAJABBGwAADKAgA20\nGTP7oJn9o5kdM7ODZna3mXWEpB9nZn8zkPakmf2Lmf37VtYZQPII2ED7+X8lHZb0fkkXSPqfJf3f\nfgnNbLikJyWdK+kPJI2V9GeS7jCz5S2pLYCWIGAD7We6pAecc79xzh2U9LikjwakvUbS/yDpf3PO\n7XPOnXLOPS5puaT/ZGajJcnMnJl9qHSQmW00s/9U9n6Rmb1oZv1m9qyZnV+27wNm9qCZHTGzfeU/\nBMzsVjN7wMz+q5mdMLOXzaynbP+fm9nrA/v+zcw+Gc9XBBQPARtoP+skLTGzUWY2RdICeUHbz6ck\n/cA593bV9gcljZJ0cb3CzOxCSX8r6T9ImiDpP0vaYmYjzOzfSXpE0kuSpkj6pKQVZnZZWRZXSNos\naZykLZLuHsj3I5JukPT7zrnRki6T9Gq9+gDwR8AG2s92eT3q45L2S+qV9P2AtBMlvVG90Tl3WlKf\npO4I5f2fkv6zc+5559wZ59y9kn4rL9j/vqRu59zXnHPvOuf2SvovkpaUHb/DOfePzrkzkv6bpJkD\n289IGiHpd82s0zn3qnPuFxHqA8AHARtoIwM92ick/YOks+UF5PGS/p+AQ/rkneuuzqdj4NgjEYo9\nV9LKgeHwfjPrlzRN0gcG9n2gat8qSZPLjj9Y9vqkpJFm1uGce0XSCkm3SjpsZpvN7AMR6gPABwEb\naC9d8oLl3c653zrn3pS0QdLCgPRPSlpgZmdXbf9fJZ2S9MLA+5PyhshLzil7/ZqkrzvnxpU9Rjnn\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2871ff9f518>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## AND-OR GRAPH SEARCH\n",
"An _AND-OR_ graph is a graphical representation of the reduction of goals to _conjunctions_ and _disjunctions_ of subgoals.\n",
"An _AND-OR_ graph can be seen as a generalization of a directed graph.\n",
"It contains a number of vertices and generalized edges that connect the vertices.\n",
"Each connector in an _AND-OR_ graph connects a set of vertices $V$ to a single vertex, $v_0$.\n",
"A connector can be an _AND_ connector or an _OR_ connector.\n",
"An __AND__ connector connects two edges having a logical _AND_ relationship,\n",
"while and __OR__ connector connects two edges having a logical _OR_ relationship.\n",
"<br>\n",
"A vertex can have more than one _AND_ or _OR_ connector.\n",
"This is why _AND-OR_ graphs can be expressed as logical statements.\n",
"<br>\n",
"<br>\n",
"_AND-OR_ graphs also provide a computational model for executing logic programs and you will come across this data-structure in the `logic` module as well.\n",
"_AND-OR_ graphs can be searched in depth-first, breadth-first or best-first ways searching the state sapce linearly or parallely.\n",
"<br>\n",
"Our implementation of _AND-OR_ search searches over graphs generated by non-deterministic environments and returns a conditional plan that reaches a goal state in all circumstances.\n",
"Let's have a look at the implementation of `and_or_graph_search`."
]
},
{
"cell_type": "code",
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n",
" \"http://www.w3.org/TR/html4/strict.dtd\">\n",
"\n",
"<html>\n",
"<head>\n",
" <title></title>\n",
" <meta http-equiv=\"content-type\" content=\"text/html; charset=None\">\n",
" <style type=\"text/css\">\n",
"td.linenos { background-color: #f0f0f0; padding-right: 10px; }\n",
"span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\n",
"pre { line-height: 125%; }\n",
"body .hll { background-color: #ffffcc }\n",
"body { background: #f8f8f8; }\n",
"body .c { color: #408080; font-style: italic } /* Comment */\n",
"body .err { border: 1px solid #FF0000 } /* Error */\n",
"body .k { color: #008000; font-weight: bold } /* Keyword */\n",
"body .o { color: #666666 } /* Operator */\n",
"body .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n",
"body .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n",
"body .cp { color: #BC7A00 } /* Comment.Preproc */\n",
"body .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n",
"body .c1 { color: #408080; font-style: italic } /* Comment.Single */\n",
"body .cs { color: #408080; font-style: italic } /* Comment.Special */\n",
"body .gd { color: #A00000 } /* Generic.Deleted */\n",
"body .ge { font-style: italic } /* Generic.Emph */\n",
"body .gr { color: #FF0000 } /* Generic.Error */\n",
"body .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n",
"body .gi { color: #00A000 } /* Generic.Inserted */\n",
"body .go { color: #888888 } /* Generic.Output */\n",
"body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n",
"body .gs { font-weight: bold } /* Generic.Strong */\n",
"body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n",
"body .gt { color: #0044DD } /* Generic.Traceback */\n",
"body .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n",
"body .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n",
"body .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n",
"body .kp { color: #008000 } /* Keyword.Pseudo */\n",
"body .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n",
"body .kt { color: #B00040 } /* Keyword.Type */\n",
"body .m { color: #666666 } /* Literal.Number */\n",
"body .s { color: #BA2121 } /* Literal.String */\n",
"body .na { color: #7D9029 } /* Name.Attribute */\n",
"body .nb { color: #008000 } /* Name.Builtin */\n",
"body .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n",
"body .no { color: #880000 } /* Name.Constant */\n",
"body .nd { color: #AA22FF } /* Name.Decorator */\n",
"body .ni { color: #999999; font-weight: bold } /* Name.Entity */\n",
"body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n",
"body .nf { color: #0000FF } /* Name.Function */\n",
"body .nl { color: #A0A000 } /* Name.Label */\n",
"body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n",
"body .nt { color: #008000; font-weight: bold } /* Name.Tag */\n",
"body .nv { color: #19177C } /* Name.Variable */\n",
"body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n",
"body .w { color: #bbbbbb } /* Text.Whitespace */\n",
"body .mb { color: #666666 } /* Literal.Number.Bin */\n",
"body .mf { color: #666666 } /* Literal.Number.Float */\n",
"body .mh { color: #666666 } /* Literal.Number.Hex */\n",
"body .mi { color: #666666 } /* Literal.Number.Integer */\n",
"body .mo { color: #666666 } /* Literal.Number.Oct */\n",
"body .sa { color: #BA2121 } /* Literal.String.Affix */\n",
"body .sb { color: #BA2121 } /* Literal.String.Backtick */\n",
"body .sc { color: #BA2121 } /* Literal.String.Char */\n",
"body .dl { color: #BA2121 } /* Literal.String.Delimiter */\n",
"body .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n",
"body .s2 { color: #BA2121 } /* Literal.String.Double */\n",
"body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n",
"body .sh { color: #BA2121 } /* Literal.String.Heredoc */\n",
"body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n",
"body .sx { color: #008000 } /* Literal.String.Other */\n",
"body .sr { color: #BB6688 } /* Literal.String.Regex */\n",
"body .s1 { color: #BA2121 } /* Literal.String.Single */\n",
"body .ss { color: #19177C } /* Literal.String.Symbol */\n",
"body .bp { color: #008000 } /* Name.Builtin.Pseudo */\n",
"body .fm { color: #0000FF } /* Name.Function.Magic */\n",
"body .vc { color: #19177C } /* Name.Variable.Class */\n",
"body .vg { color: #19177C } /* Name.Variable.Global */\n",
"body .vi { color: #19177C } /* Name.Variable.Instance */\n",
"body .vm { color: #19177C } /* Name.Variable.Magic */\n",
"body .il { color: #666666 } /* Literal.Number.Integer.Long */\n",
"\n",
" </style>\n",
"</head>\n",
"<body>\n",
"<h2></h2>\n",
"\n",
"<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">and_or_graph_search</span><span class=\"p\">(</span><span class=\"n\">problem</span><span class=\"p\">):</span>\n",
" <span class=\"sd\">"""[Figure 4.11]Used when the environment is nondeterministic and completely observable.</span>\n",
"<span class=\"sd\"> Contains OR nodes where the agent is free to choose any action.</span>\n",
"<span class=\"sd\"> After every action there is an AND node which contains all possible states</span>\n",
"<span class=\"sd\"> the agent may reach due to stochastic nature of environment.</span>\n",
"<span class=\"sd\"> The agent must be able to handle all possible states of the AND node (as it</span>\n",
"<span class=\"sd\"> may end up in any of them).</span>\n",
"<span class=\"sd\"> Returns a conditional plan to reach goal state,</span>\n",
"<span class=\"sd\"> or failure if the former is not possible."""</span>\n",
" <span class=\"c1\"># functions used by and_or_search</span>\n",
" <span class=\"k\">def</span> <span class=\"nf\">or_search</span><span class=\"p\">(</span><span class=\"n\">state</span><span class=\"p\">,</span> <span class=\"n\">problem</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">):</span>\n",
" <span class=\"sd\">"""returns a plan as a list of actions"""</span>\n",
" <span class=\"k\">if</span> <span class=\"n\">problem</span><span class=\"o\">.</span><span class=\"n\">goal_test</span><span class=\"p\">(</span><span class=\"n\">state</span><span class=\"p\">):</span>\n",
" <span class=\"k\">return</span> <span class=\"p\">[]</span>\n",
" <span class=\"k\">if</span> <span class=\"n\">state</span> <span class=\"ow\">in</span> <span class=\"n\">path</span><span class=\"p\">:</span>\n",
" <span class=\"k\">return</span> <span class=\"bp\">None</span>\n",
" <span class=\"k\">for</span> <span class=\"n\">action</span> <span class=\"ow\">in</span> <span class=\"n\">problem</span><span class=\"o\">.</span><span class=\"n\">actions</span><span class=\"p\">(</span><span class=\"n\">state</span><span class=\"p\">):</span>\n",
" <span class=\"n\">plan</span> <span class=\"o\">=</span> <span class=\"n\">and_search</span><span class=\"p\">(</span><span class=\"n\">problem</span><span class=\"o\">.</span><span class=\"n\">result</span><span class=\"p\">(</span><span class=\"n\">state</span><span class=\"p\">,</span> <span class=\"n\">action</span><span class=\"p\">),</span>\n",
" <span class=\"n\">problem</span><span class=\"p\">,</span> <span class=\"n\">path</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"n\">state</span><span class=\"p\">,</span> <span class=\"p\">])</span>\n",
" <span class=\"k\">if</span> <span class=\"n\">plan</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"bp\">None</span><span class=\"p\">:</span>\n",
" <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">action</span><span class=\"p\">,</span> <span class=\"n\">plan</span><span class=\"p\">]</span>\n",
" <span class=\"k\">def</span> <span class=\"nf\">and_search</span><span class=\"p\">(</span><span class=\"n\">states</span><span class=\"p\">,</span> <span class=\"n\">problem</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">):</span>\n",
" <span class=\"sd\">"""Returns plan in form of dictionary where we take action plan[s] if we reach state s."""</span>\n",
" <span class=\"n\">plan</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n",
" <span class=\"k\">for</span> <span class=\"n\">s</span> <span class=\"ow\">in</span> <span class=\"n\">states</span><span class=\"p\">:</span>\n",
" <span class=\"n\">plan</span><span class=\"p\">[</span><span class=\"n\">s</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">or_search</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">,</span> <span class=\"n\">problem</span><span class=\"p\">,</span> <span class=\"n\">path</span><span class=\"p\">)</span>\n",
" <span class=\"k\">if</span> <span class=\"n\">plan</span><span class=\"p\">[</span><span class=\"n\">s</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"bp\">None</span><span class=\"p\">:</span>\n",
" <span class=\"k\">return</span> <span class=\"bp\">None</span>\n",
" <span class=\"k\">return</span> <span class=\"n\">plan</span>\n",
" <span class=\"c1\"># body of and or search</span>\n",
" <span class=\"k\">return</span> <span class=\"n\">or_search</span><span class=\"p\">(</span><span class=\"n\">problem</span><span class=\"o\">.</span><span class=\"n\">initial</span><span class=\"p\">,</span> <span class=\"n\">problem</span><span class=\"p\">,</span> <span class=\"p\">[])</span>\n",
"</pre></div>\n",
"</body>\n",
"</html>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The search is carried out by two functions `and_search` and `or_search` that recursively call each other, traversing nodes sequentially.\n",
"It is a recursive depth-first algorithm for searching an _AND-OR_ graph.\n",
"A very similar algorithm `fol_bc_ask` can be found in the `logic` module, which carries out inference on first-order logic knowledge bases using _AND-OR_ graph-derived data-structures.\n",
"<br>\n",
"_AND-OR_ trees can also be used to represent the search spaces for two-player games, where a vertex of the tree represents the problem of one of the players winning the game, starting from the initial state of the game.\n",
"<br>\n",
"Problems involving _MIN-MAX_ trees can be reformulated as _AND-OR_ trees by representing _MAX_ nodes as _OR_ nodes and _MIN_ nodes as _AND_ nodes.\n",
"`and_or_graph_search` can then be used to find the optimal solution.\n",
"Standard algorithms like `minimax` and `expectiminimax` (for belief states) can also be applied on it with a few modifications."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's how `and_or_graph_search` can be applied to a simple vacuum-world example."
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [],
"source": [
"vacuum_world = GraphProblemStochastic('State_1', ['State_7', 'State_8'], vacuum_world)\n",
"plan = and_or_graph_search(vacuum_world)"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['Suck',\n",
" {'State_5': ['Right', {'State_6': ['Suck', {'State_8': []}]}], 'State_7': []}]"
]
},
{
"cell_type": "code",
"def run_plan(state, problem, plan):\n",
" if problem.goal_test(state):\n",
" return True\n",
" if len(plan) is not 2:\n",
" return False\n",
" predicate = lambda x: run_plan(x, problem, plan[1][x])\n",
" return all(predicate(r) for r in problem.result(state, plan[0]))"
]
},
{
"cell_type": "code",
},
"outputs": [
{
"data": {
"text/plain": [
"run_plan('State_1', vacuum_world, plan)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
"## ONLINE DFS AGENT\n",
"So far, we have seen agents that use __offline search__ algorithms,\n",
"which is a class of algorithms that compute a complete solution before executing it.\n",
"In contrast, an __online search__ agent interleaves computation and action.\n",
"Online search is better for most dynamic environments and necessary for unknown environments.\n",
"<br>\n",
"Online search problems are solved by an agent executing actions, rather than just by pure computation.\n",
"For a fully observable environment, an online agent cycles through three steps: taking an action, computing the step cost and checking if the goal has been reached.\n",
"<br>\n",
"For online algorithms in partially-observable environments, there is usually a tradeoff between exploration and exploitation to be taken care of.\n",
"<br>\n",
"<br>\n",
"Whenever an online agent takes an action, it receives a _percept_ or an observation that tells it something about its immediate environment.\n",
"Using this percept, the agent can augment its map of the current environment.\n",
"For a partially observable environment, this is called the belief state.\n",
"<br>\n",
"Online algorithms expand nodes in a _local_ order, just like _depth-first search_ as it does not have the option of observing farther nodes like _A* search_.\n",
"Whenever an action from the current state has not been explored, the agent tries that action.\n",
"<br>\n",
"Difficulty arises when the agent has tried all actions in a particular state.\n",
"An offline search algorithm would simply drop the state from the queue in this scenario whereas an online search agent has to physically move back to the previous state.\n",
"To do this, the agent needs to maintain a table where it stores the order of nodes it has been to.\n",
"This is how our implementation of _Online DFS-Agent_ works.\n",
"This agent works only in state spaces where the action is reversible, because of the use of backtracking.\n",
"<br>\n",
"Let's have a look at the `OnlineDFSAgent` class."
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"data": {
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
"text/html": [
"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n",
" \"http://www.w3.org/TR/html4/strict.dtd\">\n",
"\n",
"<html>\n",
"<head>\n",
" <title></title>\n",
" <meta http-equiv=\"content-type\" content=\"text/html; charset=None\">\n",
" <style type=\"text/css\">\n",
"td.linenos { background-color: #f0f0f0; padding-right: 10px; }\n",
"span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\n",
"pre { line-height: 125%; }\n",
"body .hll { background-color: #ffffcc }\n",
"body { background: #f8f8f8; }\n",
"body .c { color: #408080; font-style: italic } /* Comment */\n",
"body .err { border: 1px solid #FF0000 } /* Error */\n",
"body .k { color: #008000; font-weight: bold } /* Keyword */\n",
"body .o { color: #666666 } /* Operator */\n",
"body .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n",
"body .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n",
"body .cp { color: #BC7A00 } /* Comment.Preproc */\n",
"body .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n",
"body .c1 { color: #408080; font-style: italic } /* Comment.Single */\n",
"body .cs { color: #408080; font-style: italic } /* Comment.Special */\n",
"body .gd { color: #A00000 } /* Generic.Deleted */\n",
"body .ge { font-style: italic } /* Generic.Emph */\n",
"body .gr { color: #FF0000 } /* Generic.Error */\n",
"body .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n",
"body .gi { color: #00A000 } /* Generic.Inserted */\n",
"body .go { color: #888888 } /* Generic.Output */\n",
"body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n",
"body .gs { font-weight: bold } /* Generic.Strong */\n",
"body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n",
"body .gt { color: #0044DD } /* Generic.Traceback */\n",
"body .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n",
"body .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n",
"body .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n",
"body .kp { color: #008000 } /* Keyword.Pseudo */\n",
"body .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n",
"body .kt { color: #B00040 } /* Keyword.Type */\n",
"body .m { color: #666666 } /* Literal.Number */\n",
"body .s { color: #BA2121 } /* Literal.String */\n",
"body .na { color: #7D9029 } /* Name.Attribute */\n",
"body .nb { color: #008000 } /* Name.Builtin */\n",
"body .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n",
"body .no { color: #880000 } /* Name.Constant */\n",
"body .nd { color: #AA22FF } /* Name.Decorator */\n",
"body .ni { color: #999999; font-weight: bold } /* Name.Entity */\n",
"body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n",
"body .nf { color: #0000FF } /* Name.Function */\n",
"body .nl { color: #A0A000 } /* Name.Label */\n",
"body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n",
"body .nt { color: #008000; font-weight: bold } /* Name.Tag */\n",
"body .nv { color: #19177C } /* Name.Variable */\n",
"body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n",
"body .w { color: #bbbbbb } /* Text.Whitespace */\n",
"body .mb { color: #666666 } /* Literal.Number.Bin */\n",
"body .mf { color: #666666 } /* Literal.Number.Float */\n",
"body .mh { color: #666666 } /* Literal.Number.Hex */\n",
"body .mi { color: #666666 } /* Literal.Number.Integer */\n",
"body .mo { color: #666666 } /* Literal.Number.Oct */\n",
"body .sa { color: #BA2121 } /* Literal.String.Affix */\n",