search.ipynb 577 ko
Newer Older
Chipe1's avatar
Chipe1 a validé
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
Chipe1's avatar
Chipe1 a validé
   },
   "source": [
    "# Solving problems by Searching\n",
    "\n",
    "This notebook serves as supporting material for topics covered in **Chapter 3 - Solving Problems by Searching** and **Chapter 4 - Beyond Classical Search** from the book *Artificial Intelligence: A Modern Approach.* This notebook uses implementations from [search.py](https://github.com/aimacode/aima-python/blob/master/search.py) module. Let's start by importing everything from search module."
   "cell_type": "code",
   "execution_count": 1,
    "collapsed": true,
Anthony Marakis's avatar
Anthony Marakis a validé
   "outputs": [],
Chipe1's avatar
Chipe1 a validé
   "source": [
    "from search import *\n",
    "from notebook import psource, heatmap, gaussian_kernel, show_map, final_path_colors, display_visual, plot_NQueens\n",
    "\n",
    "# Needed to hide warnings in the matplotlib sections\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
Chipe1's avatar
Chipe1 a validé
   "source": [
    "## CONTENTS\n",
    "\n",
    "* Overview\n",
    "* Problem\n",
    "* Node\n",
    "* Simple Problem Solving Agent\n",
    "* Search Algorithms Visualization\n",
    "* Breadth-First Tree Search\n",
    "* Breadth-First Search\n",
Vinay Varma's avatar
Vinay Varma a validé
    "* Best First Search\n",
    "* Uniform Cost Search\n",
Vinay Varma's avatar
Vinay Varma a validé
    "* Greedy Best First Search\n",
    "* A\\* Search\n",
    "* Hill Climbing\n",
    "* Simulated Annealing\n",
    "* Genetic Algorithm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## OVERVIEW\n",
    "Here, we learn about a specific kind of problem solving - building goal-based agents that can plan ahead to solve problems. In particular, we examine navigation problem/route finding problem. We must begin by precisely defining **problems** and their **solutions**. We will look at several general-purpose search algorithms.\n",
    "\n",
    "Search algorithms can be classified into two types:\n",
    "* **Uninformed search algorithms**: Search algorithms which explore the search space without having any information about the problem other than its definition.\n",
    "    * Examples:\n",
    "        1. Breadth First Search\n",
    "        2. Depth First Search\n",
    "        3. Depth Limited Search\n",
    "        4. Iterative Deepening Search\n",
    "* **Informed search algorithms**: These type of algorithms leverage any information (heuristics, path cost) on the problem to search through the search space to find the solution efficiently.\n",
    "    * Examples:\n",
    "        1. Best First Search\n",
    "        2. Uniform Cost Search\n",
    "        3. A\\* Search\n",
    "        4. Recursive Best First Search\n",
    "*Don't miss the visualisations of these algorithms solving the route-finding problem defined on Romania map at the end of this notebook.*"
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For visualisations, we use networkx and matplotlib to show the map in the notebook and we use ipywidgets to interact with the map to see how the searching algorithm works. These are imported as required in `notebook.py`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import lines\n",
    "\n",
    "from ipywidgets import interact\n",
    "import ipywidgets as widgets\n",
    "from IPython.display import display\n",
    "import time"
   ]
  },
Chipe1's avatar
Chipe1 a validé
  {
   "cell_type": "markdown",
Chipe1's avatar
Chipe1 a validé
   "source": [
    "## PROBLEM\n",
Chipe1's avatar
Chipe1 a validé
    "\n",
    "Let's see how we define a Problem. Run the next cell to see how abstract class `Problem` is defined in the search module."
jeff3456's avatar
jeff3456 a validé
  {
   "cell_type": "code",
   "execution_count": 3,
   "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\">Problem</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n",
       "\n",
       "    <span class=\"sd\">&quot;&quot;&quot;The abstract class for a formal problem. You should subclass</span>\n",
       "<span class=\"sd\">    this and implement the methods actions and result, and possibly</span>\n",
       "<span class=\"sd\">    __init__, goal_test, and path_cost. Then you will create instances</span>\n",
       "<span class=\"sd\">    of your subclass and solve them with the various search functions.&quot;&quot;&quot;</span>\n",
       "\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\">initial</span><span class=\"p\">,</span> <span class=\"n\">goal</span><span class=\"o\">=</span><span class=\"bp\">None</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;The constructor specifies the initial state, and possibly a goal</span>\n",
       "<span class=\"sd\">        state, if there is a unique goal. Your subclass&#39;s constructor can add</span>\n",
       "<span class=\"sd\">        other arguments.&quot;&quot;&quot;</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial</span> <span class=\"o\">=</span> <span class=\"n\">initial</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">goal</span> <span class=\"o\">=</span> <span class=\"n\">goal</span>\n",
       "\n",
       "    <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\">&quot;&quot;&quot;Return the actions that can be executed in the given</span>\n",
       "<span class=\"sd\">        state. The result would typically be a list, but if there are</span>\n",
       "<span class=\"sd\">        many actions, consider yielding them one at a time in an</span>\n",
       "<span class=\"sd\">        iterator, rather than building them all at once.&quot;&quot;&quot;</span>\n",
       "        <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</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\">action</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;Return the state that results from executing the given</span>\n",
       "<span class=\"sd\">        action in the given state. The action must be one of</span>\n",
       "<span class=\"sd\">        self.actions(state).&quot;&quot;&quot;</span>\n",
       "        <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</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\">&quot;&quot;&quot;Return True if the state is a goal. The default method compares the</span>\n",
       "<span class=\"sd\">        state to self.goal or checks for state in self.goal if it is a</span>\n",
       "<span class=\"sd\">        list, as specified in the constructor. Override this method if</span>\n",
       "<span class=\"sd\">        checking against a single self.goal is not enough.&quot;&quot;&quot;</span>\n",
       "        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">goal</span><span class=\"p\">,</span> <span class=\"nb\">list</span><span class=\"p\">):</span>\n",
       "            <span class=\"k\">return</span> <span class=\"n\">is_in</span><span class=\"p\">(</span><span class=\"n\">state</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">goal</span><span class=\"p\">)</span>\n",
       "        <span class=\"k\">else</span><span class=\"p\">:</span>\n",
       "            <span class=\"k\">return</span> <span class=\"n\">state</span> <span class=\"o\">==</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">goal</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">path_cost</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">c</span><span class=\"p\">,</span> <span class=\"n\">state1</span><span class=\"p\">,</span> <span class=\"n\">action</span><span class=\"p\">,</span> <span class=\"n\">state2</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;Return the cost of a solution path that arrives at state2 from</span>\n",
       "<span class=\"sd\">        state1 via action, assuming cost c to get up to state1. If the problem</span>\n",
       "<span class=\"sd\">        is such that the path doesn&#39;t matter, this function will only look at</span>\n",
       "<span class=\"sd\">        state2.  If the path does matter, it will consider c and maybe state1</span>\n",
       "<span class=\"sd\">        and action. The default method costs 1 for every step in the path.&quot;&quot;&quot;</span>\n",
       "        <span class=\"k\">return</span> <span class=\"n\">c</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">value</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\">&quot;&quot;&quot;For optimization problems, each state has a value.  Hill-climbing</span>\n",
       "<span class=\"sd\">        and related algorithms try to maximize this value.&quot;&quot;&quot;</span>\n",
       "        <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span>\n",
       "</pre></div>\n",
       "</body>\n",
       "</html>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
jeff3456's avatar
jeff3456 a validé
   "source": [
    "psource(Problem)"
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
Chipe1's avatar
Chipe1 a validé
   "source": [
    "The `Problem` class has six methods.\n",
    "* `__init__(self, initial, goal)` : This is what is called a `constructor`. It is the first method called when you create an instance of the class as `Problem(initial, goal)`. The variable `initial` specifies the initial state $s_0$ of the search problem. It represents the beginning state. From here, our agent begins its task of exploration to find the goal state(s) which is given in the `goal` parameter.\n",
    "\n",
    "\n",
    "* `actions(self, state)` : This method returns all the possible actions agent can execute in the given state `state`.\n",
    "\n",
    "\n",
Chipe1's avatar
Chipe1 a validé
    "* `result(self, state, action)` : This returns the resulting state if action `action` is taken in the state `state`. This `Problem` class only deals with deterministic outcomes. So we know for sure what every action in a state would result to.\n",
    "* `goal_test(self, state)` : Return a boolean for a given state - `True` if it is a goal state, else `False`.\n",
Chipe1's avatar
Chipe1 a validé
    "* `path_cost(self, c, state1, action, state2)` : Return the cost of the path that arrives at `state2` as a result of taking `action` from `state1`, assuming total cost of `c` to get up to `state1`.\n",
    "* `value(self, state)` : This acts as a bit of extra information in problems where we try to optimise a value when we cannot do a goal test."
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## NODE\n",
    "\n",
    "Let's see how we define a Node. Run the next cell to see how abstract class `Node` is defined in the search module."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "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\">Node</span><span class=\"p\">:</span>\n",
       "\n",
       "    <span class=\"sd\">&quot;&quot;&quot;A node in a search tree. Contains a pointer to the parent (the node</span>\n",
       "<span class=\"sd\">    that this is a successor of) and to the actual state for this node. Note</span>\n",
       "<span class=\"sd\">    that if a state is arrived at by two paths, then there are two nodes with</span>\n",
       "<span class=\"sd\">    the same state.  Also includes the action that got us to this state, and</span>\n",
       "<span class=\"sd\">    the total path_cost (also known as g) to reach the node.  Other functions</span>\n",
       "<span class=\"sd\">    may add an f and h value; see best_first_graph_search and astar_search for</span>\n",
       "<span class=\"sd\">    an explanation of how the f and h values are handled. You will not need to</span>\n",
       "<span class=\"sd\">    subclass this class.&quot;&quot;&quot;</span>\n",
       "\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\">state</span><span class=\"p\">,</span> <span class=\"n\">parent</span><span class=\"o\">=</span><span class=\"bp\">None</span><span class=\"p\">,</span> <span class=\"n\">action</span><span class=\"o\">=</span><span class=\"bp\">None</span><span class=\"p\">,</span> <span class=\"n\">path_cost</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;Create a search tree Node, derived from a parent by an action.&quot;&quot;&quot;</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span> <span class=\"o\">=</span> <span class=\"n\">state</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parent</span> <span class=\"o\">=</span> <span class=\"n\">parent</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">action</span> <span class=\"o\">=</span> <span class=\"n\">action</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">path_cost</span> <span class=\"o\">=</span> <span class=\"n\">path_cost</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">depth</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n",
       "        <span class=\"k\">if</span> <span class=\"n\">parent</span><span class=\"p\">:</span>\n",
       "            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">depth</span> <span class=\"o\">=</span> <span class=\"n\">parent</span><span class=\"o\">.</span><span class=\"n\">depth</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"fm\">__repr__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n",
       "        <span class=\"k\">return</span> <span class=\"s2\">&quot;&lt;Node {}&gt;&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">)</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"fm\">__lt__</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=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span> <span class=\"o\">&lt;</span> <span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">state</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">expand</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">problem</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;List the nodes reachable in one step from this node.&quot;&quot;&quot;</span>\n",
       "        <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">child_node</span><span class=\"p\">(</span><span class=\"n\">problem</span><span class=\"p\">,</span> <span class=\"n\">action</span><span class=\"p\">)</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=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">)]</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">child_node</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">problem</span><span class=\"p\">,</span> <span class=\"n\">action</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;[Figure 3.10]&quot;&quot;&quot;</span>\n",
       "        <span class=\"n\">next_node</span> <span class=\"o\">=</span> <span class=\"n\">problem</span><span class=\"o\">.</span><span class=\"n\">result</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">,</span> <span class=\"n\">action</span><span class=\"p\">)</span>\n",
       "        <span class=\"k\">return</span> <span class=\"n\">Node</span><span class=\"p\">(</span><span class=\"n\">next_node</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">action</span><span class=\"p\">,</span>\n",
       "                    <span class=\"n\">problem</span><span class=\"o\">.</span><span class=\"n\">path_cost</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">path_cost</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">,</span>\n",
       "                                      <span class=\"n\">action</span><span class=\"p\">,</span> <span class=\"n\">next_node</span><span class=\"p\">))</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">solution</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;Return the sequence of actions to go from the root to this node.&quot;&quot;&quot;</span>\n",
       "        <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">action</span> <span class=\"k\">for</span> <span class=\"n\">node</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:]]</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">path</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;Return a list of nodes forming the path from the root to this node.&quot;&quot;&quot;</span>\n",
       "        <span class=\"n\">node</span><span class=\"p\">,</span> <span class=\"n\">path_back</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"p\">[]</span>\n",
       "        <span class=\"k\">while</span> <span class=\"n\">node</span><span class=\"p\">:</span>\n",
       "            <span class=\"n\">path_back</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">node</span><span class=\"p\">)</span>\n",
       "            <span class=\"n\">node</span> <span class=\"o\">=</span> <span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">parent</span>\n",
       "        <span class=\"k\">return</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">reversed</span><span class=\"p\">(</span><span class=\"n\">path_back</span><span class=\"p\">))</span>\n",
       "\n",
       "    <span class=\"c1\"># We want for a queue of nodes in breadth_first_search or</span>\n",
       "    <span class=\"c1\"># astar_search to have no duplicated states, so we treat nodes</span>\n",
       "    <span class=\"c1\"># with the same state as equal. [Problem: this may not be what you</span>\n",
       "    <span class=\"c1\"># want in other contexts.]</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"fm\">__eq__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">other</span><span class=\"p\">):</span>\n",
       "        <span class=\"k\">return</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">other</span><span class=\"p\">,</span> <span class=\"n\">Node</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span> <span class=\"o\">==</span> <span class=\"n\">other</span><span class=\"o\">.</span><span class=\"n\">state</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"fm\">__hash__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n",
       "        <span class=\"k\">return</span> <span class=\"nb\">hash</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</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": [
    "psource(Node)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `Node` class has nine methods. The first is the `__init__` method.\n",
Alan Oliveira's avatar
Alan Oliveira a validé
    "* `__init__(self, state, parent, action, path_cost)` : This method creates a node. `parent` represents the node that this is a successor of and `action` is the action required to get from the parent node to this node. `path_cost` is the cost to reach current node from parent node.\n",
    "The next 4 methods are specific `Node`-related functions.\n",
Alan Oliveira's avatar
Alan Oliveira a validé
    "* `expand(self, problem)` : This method lists all the neighbouring(reachable in one step) nodes of current node. \n",
Alan Oliveira's avatar
Alan Oliveira a validé
    "* `child_node(self, problem, action)` : Given an `action`, this method returns the immediate neighbour that can be reached with that `action`.\n",
    "\n",
    "* `solution(self)` : This returns the sequence of actions required to reach this node from the root node. \n",
    "\n",
    "* `path(self)` : This returns a list of all the nodes that lies in the path from the root to this node.\n",
    "\n",
    "The remaining 4 methods override standards Python functionality for representing an object as a string, the less-than ($<$) operator, the equal-to ($=$) operator, and the `hash` function.\n",
    "\n",
    "* `__repr__(self)` : This returns the state of this node.\n",
    "\n",
    "* `__lt__(self, node)` : Given a `node`, this method returns `True` if the state of current node is less than the state of the `node`. Otherwise it returns `False`.\n",
    "\n",
    "* `__eq__(self, other)` : This method returns `True` if the state of current node is equal to the other node. Else it returns `False`.\n",
    "\n",
    "* `__hash__(self)` : This returns the hash of the state of current node."
   ]
  },
Chipe1's avatar
Chipe1 a validé
  {
   "cell_type": "markdown",
Chipe1's avatar
Chipe1 a validé
   "source": [
    "We will use the abstract class `Problem` to define our real **problem** named `GraphProblem`. You can see how we define `GraphProblem` by running the next cell."
jeff3456's avatar
jeff3456 a validé
   ]
  },
   "execution_count": 5,
   "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\">GraphProblem</span><span class=\"p\">(</span><span class=\"n\">Problem</span><span class=\"p\">):</span>\n",
       "\n",
       "    <span class=\"sd\">&quot;&quot;&quot;The problem of searching a graph from one node to another.&quot;&quot;&quot;</span>\n",
       "\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\">initial</span><span class=\"p\">,</span> <span class=\"n\">goal</span><span class=\"p\">,</span> <span class=\"n\">graph</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=\"n\">initial</span><span class=\"p\">,</span> <span class=\"n\">goal</span><span class=\"p\">)</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graph</span> <span class=\"o\">=</span> <span class=\"n\">graph</span>\n",
       "\n",
       "    <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\">A</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;The actions at a graph node are just its neighbors.&quot;&quot;&quot;</span>\n",
       "        <span class=\"k\">return</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graph</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">A</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">keys</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\">action</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;The result of going to a neighbor is just that neighbor.&quot;&quot;&quot;</span>\n",
       "        <span class=\"k\">return</span> <span class=\"n\">action</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">path_cost</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">cost_so_far</span><span class=\"p\">,</span> <span class=\"n\">A</span><span class=\"p\">,</span> <span class=\"n\">action</span><span class=\"p\">,</span> <span class=\"n\">B</span><span class=\"p\">):</span>\n",
       "        <span class=\"k\">return</span> <span class=\"n\">cost_so_far</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graph</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">A</span><span class=\"p\">,</span> <span class=\"n\">B</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"n\">infinity</span><span class=\"p\">)</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">find_min_edge</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;Find minimum value of edges.&quot;&quot;&quot;</span>\n",
       "        <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"n\">infinity</span>\n",
       "        <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\">graph</span><span class=\"o\">.</span><span class=\"n\">graph_dict</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">():</span>\n",
       "            <span class=\"n\">local_min</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">d</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">())</span>\n",
       "            <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"n\">local_min</span><span class=\"p\">)</span>\n",
       "\n",
       "        <span class=\"k\">return</span> <span class=\"n\">m</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\">&quot;&quot;&quot;h function is straight-line distance from a node&#39;s state to goal.&quot;&quot;&quot;</span>\n",
       "        <span class=\"n\">locs</span> <span class=\"o\">=</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graph</span><span class=\"p\">,</span> <span class=\"s1\">&#39;locations&#39;</span><span class=\"p\">,</span> <span class=\"bp\">None</span><span class=\"p\">)</span>\n",
       "        <span class=\"k\">if</span> <span class=\"n\">locs</span><span class=\"p\">:</span>\n",
       "            <span class=\"k\">if</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">node</span><span class=\"p\">)</span> <span class=\"ow\">is</span> <span class=\"nb\">str</span><span class=\"p\">:</span>\n",
       "                <span class=\"k\">return</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">distance</span><span class=\"p\">(</span><span class=\"n\">locs</span><span class=\"p\">[</span><span class=\"n\">node</span><span class=\"p\">],</span> <span class=\"n\">locs</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">goal</span><span class=\"p\">]))</span>\n",
       "\n",
       "            <span class=\"k\">return</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">distance</span><span class=\"p\">(</span><span class=\"n\">locs</span><span class=\"p\">[</span><span class=\"n\">node</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">],</span> <span class=\"n\">locs</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">goal</span><span class=\"p\">]))</span>\n",
       "        <span class=\"k\">else</span><span class=\"p\">:</span>\n",
       "            <span class=\"k\">return</span> <span class=\"n\">infinity</span>\n",
       "</pre></div>\n",
       "</body>\n",
       "</html>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
Chipe1's avatar
Chipe1 a validé
   "source": [
    "psource(GraphProblem)"
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
Chipe1's avatar
Chipe1 a validé
   "source": [
    "Have a look at our romania_map, which is an Undirected Graph containing a dict of nodes as keys and neighbours as values."
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
Chipe1's avatar
Chipe1 a validé
   "outputs": [],
   "source": [
    "romania_map = UndirectedGraph(dict(\n",
    "    Arad=dict(Zerind=75, Sibiu=140, Timisoara=118),\n",
    "    Bucharest=dict(Urziceni=85, Pitesti=101, Giurgiu=90, Fagaras=211),\n",
    "    Craiova=dict(Drobeta=120, Rimnicu=146, Pitesti=138),\n",
    "    Drobeta=dict(Mehadia=75),\n",
    "    Eforie=dict(Hirsova=86),\n",
    "    Fagaras=dict(Sibiu=99),\n",
    "    Hirsova=dict(Urziceni=98),\n",
    "    Iasi=dict(Vaslui=92, Neamt=87),\n",
    "    Lugoj=dict(Timisoara=111, Mehadia=70),\n",
    "    Oradea=dict(Zerind=71, Sibiu=151),\n",
    "    Pitesti=dict(Rimnicu=97),\n",
    "    Rimnicu=dict(Sibiu=80),\n",
    "    Urziceni=dict(Vaslui=142)))\n",
    "\n",
    "romania_map.locations = dict(\n",
    "    Arad=(91, 492), Bucharest=(400, 327), Craiova=(253, 288),\n",
    "    Drobeta=(165, 299), Eforie=(562, 293), Fagaras=(305, 449),\n",
    "    Giurgiu=(375, 270), Hirsova=(534, 350), Iasi=(473, 506),\n",
    "    Lugoj=(165, 379), Mehadia=(168, 339), Neamt=(406, 537),\n",
    "    Oradea=(131, 571), Pitesti=(320, 368), Rimnicu=(233, 410),\n",
    "    Sibiu=(207, 457), Timisoara=(94, 410), Urziceni=(456, 350),\n",
    "    Vaslui=(509, 444), Zerind=(108, 531))"
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
Chipe1's avatar
Chipe1 a validé
   },
   "source": [
    "It is pretty straightforward to understand this `romania_map`. The first node **Arad** has three neighbours named **Zerind**, **Sibiu**, **Timisoara**. Each of these nodes are 75, 140, 118 units apart from **Arad** respectively. And the same goes with other nodes.\n",
    "\n",
    "And `romania_map.locations` contains the positions of each of the nodes. We will use the straight line distance (which is different from the one provided in `romania_map`) between two cities in algorithms like A\\*-search and Recursive Best First Search.\n",
    "\n",
    "**Define a problem:**\n",
    "Now it's time to define our problem. We will define it by passing `initial`, `goal`, `graph` to `GraphProblem`. So, our problem is to find the goal state starting from the given initial state on the provided graph. \n",
    "\n",
    "Say we want to start exploring from **Arad** and try to find **Bucharest** in our romania_map. So, this is how we do it."
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
Chipe1's avatar
Chipe1 a validé
   "source": [
    "romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)"
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "### Romania Map Visualisation\n",
    "Let's have a visualisation of Romania map [Figure 3.2] from the book and see how different searching algorithms perform / how frontier expands in each search algorithm for a simple problem named `romania_problem`."
  {
   "cell_type": "markdown",
   "source": [
    "Have a look at `romania_locations`. It is a dictionary defined in search module. We will use these location values to draw the romania graph using **networkx**."
  {
   "cell_type": "code",
   "execution_count": 8,
Anthony Marakis's avatar
Anthony Marakis a validé
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Arad': (91, 492), 'Bucharest': (400, 327), 'Craiova': (253, 288), 'Drobeta': (165, 299), 'Eforie': (562, 293), 'Fagaras': (305, 449), 'Giurgiu': (375, 270), 'Hirsova': (534, 350), 'Iasi': (473, 506), 'Lugoj': (165, 379), 'Mehadia': (168, 339), 'Neamt': (406, 537), 'Oradea': (131, 571), 'Pitesti': (320, 368), 'Rimnicu': (233, 410), 'Sibiu': (207, 457), 'Timisoara': (94, 410), 'Urziceni': (456, 350), 'Vaslui': (509, 444), 'Zerind': (108, 531)}\n"
     ]
    }
   ],
   "source": [
    "romania_locations = romania_map.locations\n",
    "print(romania_locations)"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "Let's get started by initializing an empty graph. We will add nodes, place the nodes in their location as shown in the book, add edges to the graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
    "# node colors, node positions and node label positions\n",
    "node_colors = {node: 'white' for node in romania_map.locations.keys()}\n",
    "node_positions = romania_map.locations\n",
    "node_label_pos = { k:[v[0],v[1]-10]  for k,v in romania_map.locations.items() }\n",
    "edge_weights = {(k, k2) : v2 for k, v in romania_map.graph_dict.items() for k2, v2 in v.items()}\n",
    "romania_graph_data = {  'graph_dict' : romania_map.graph_dict,\n",
    "                        'node_colors': node_colors,\n",
    "                        'node_positions': node_positions,\n",
    "                        'node_label_positions': node_label_pos,\n",
    "                         'edge_weights': edge_weights\n",
    "                     }"
  {
   "cell_type": "markdown",
    "We have completed building our graph based on romania_map and its locations. It's time to display it here in the notebook. This function `show_map(node_colors)` helps us do that. We will be calling this function later on to display the map at each and every interval step while searching, using variety of algorithms from the book."
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "We can simply call the function with node_colors dictionary object to display it."
   ]
  },
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nQ9kJIM+rXr26evTooddff93aUQAAAB5rHh4emjZtmr777jv9/fffqlq1qsLDw3X16lVrRwNyhWEY\nOn36tA4cOKA9e/bowIEDOn36tAzDsHY0ANmEshPAYyEiIkJbtmzRoUOHrB0FAADYsNDQUJlMJk2a\nNMli++7du2UymXTx4kUrJUsXExMjV1fXRz5OyZIl9dZbb+nQoUM6deqUKlWqpDfffFM3btzIhpRA\n3pOamqpDhw5p7ty5WrFihWJjY7V7927FxsZqxYoVmjt3rg4dOqTU1FRrRwXwiCg7ATwWihQpoqio\nKA0ePFhpaWnWjgMAAGxYwYIFNX369HyxxLtcuXKKiYnR7t279eWXX6pSpUr6z3/+o6SkJGtHA7JN\nUlKSli9fru3bt+vKlStKTk42l5qpqalKTk7WlStXtH37di1fvjxX/vuPiYmRyWTK8uHu7p4j5wwN\nDVXZsmVz5NgPy2QyKSIiwtoxYGMoO2FT/vrrL6v/tB05p1evXpKk5cuXWzkJAACwZc2aNVPZsmU1\nceLEO4754Ycf1LZtW7m5ucnLy0vdu3fXH3/8YX794MGDatWqlTw9PVW4cGE1btxYcXFxFscwmUxa\nsGCBOnbsKGdnZ1WuXFm7du3SmTNnFBgYKBcXF9WuXVtHjhyRlD679KWXXlJiYqK5FMmukqBatWpa\nt26dNm3apI8++khVq1bV8uXLmeWGx15qaqpWrVqls2fPKjk5+a5jk5OTdfbsWa1atSrX/ttfu3at\n4uLiLB6xsbG5cm7AVlF2wqZERETo3XfftXYM5BA7OzvNmzdPr7/+OteVAgAAOcbOzk5Tp07V22+/\nrZMnT2Z6/dy5c3rmmWdUo0YNffXVV4qNjdX169fVoUMH8wqUhIQE9ezZU/v27dNXX32l2rVrq02b\nNpl+MD9p0iR169ZNR48elb+/v7p3767evXtr4MCB+vrrr1WyZEmFhoZKkp566ilFR0fL2dlZ586d\n07lz5zRixIhsfe/+/v7atm2bYmJitGjRItWsWVPr16/neoZ4bH399dc6d+7cfZeXqampOnfunL7+\n+uscTpaudu3aatiwocXD398/V879KG7dumXtCMAdUXbCZty6dUurV69W586drR0FOahevXpq06aN\nIiMjrR0FAADYsDZt2ujpp5/W2LFjM722YMEC1apVS9OmTZOvr6/8/Py0fPlyHTx40Hx98WeffVY9\n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\n3XWStZ08efJfh1T/k4SEBBYsWMClS5f+scPT1taWIkWK0L59+2z1N0XJkiWpVasW8+fPNzqKZCPP\n+3uVlWmMgFiE0NBQXnvttec+j5+fHxEREc8fSNLda6+9hoeHB5999pnRUURERETkT4oXL/7YguXF\nixc5ceIEw4cP56OPPg0oDVEAACAASURBVGLnzp28++67TJs2jbt376rQKenCzs6OTp060ahRI/Lm\nzYutrW3qEG1ra2tsbW3Jly8fjRo1olOnTtmq0Ckij9IwdskStm7dSr169R77et26ddmyZcszn//T\nTz99ZGJ3yVlMJhNTpkyhRo0atG/fPnXFPxERERHJuooUKULlypXJmzdv6jZ3d3d+/vlnDh8+TPXq\n1UlKSmLu3Ll069bNwKSS3VlbW1O5cmUqVarEhQsXiIuLIyEhATs7O4oVK/bY7mMRyX7U2SlZQo0a\nNbh06dIjjxkzZmAymejVq9cznTcpKQmz2UyePHnSfICSnMnLy4s333yTwYMHGx1FRERERP7F3r17\n6dChAydPniQ4OJg+ffqwc+dOpk+fjoeHB/nz5wfg6NGjvPXWW5QoUULDdOW5mUwmihcvTrVq1ahT\npw7VqlX7x+7j7ODs2bP63RD5ExU7JUuws7OjcOHCaR43b95k4MCBDBs2LHXS5ri4OEJCQsiXLx/5\n8uWjWbNm/PTTT6nniYiIwM/Pjzlz5lC6dGns7e2Jj49/ZBh73bp16dWrF8OGDcPV1ZWCBQsSHh5O\nSkpK6j5XrlyhRYsWODo6UqJECSIjIzPvDZFnNnz4cDZv3sz3339vdBQREREReYx79+5Rv359ihYt\nypQpU1ixYgXr1q0jPDycBg0a8MEHH1C2bFngjwVmEhMTCQ8Pp3///nh6erJ27VqD70BERLIqFTsl\nS7p16xYtW7bk5ZdfZuzYsQDcvXuXevXq4eDgwLZt29i9ezdFihThlVde4e7du6nHnjlzhoULF7Jk\nyRIOHz6Mg4PD315jwYIF2NjYsGvXLqZNm8aUKVOIjo5OfT00NJTTp0+zceNGli9fzrx58zh79myG\n3rc8P2dnZz766CN69+79RKstioiIiEjmW7RoEX5+fgwbNozatWsTGBjI9OnTuXjxIm+99RY1a9YE\nwGw2pz7CwsKIi4vjtddeo2nTpvTv3z/N3wEiIiKgYqdkQSkpKbRr1w5ra2vmz5+fOpwgKioKs9nM\n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\nf+WZjv01/ld2X9idzonSSk5OJikpKfWRnJz8r8fExsYyYMAAwsPDWbp0KYUKFeKNN97gzJkzqfvE\nxcVRokQJPv30U9atW8d7773HunXreO211546Y5UqVQBo06YN69evJz4+/rH7dujQgYkTJ9KlSxdW\nr15Np06deP/99+nWrdtTX/ev3nrrLUJDQwHYvXs3u3fv5vvvv3/s/p9//jmhoaG8+OKLLF++nPHj\nx7NmzRrq1q3L3btpi99btmzhs88+Y/z48URFRZGQkMBrr73G77///ty5xRgaxi4iFicpKQkbGxvs\n7OxISkpi8ODBzJo1i5o1az71BNsiIiIikrVYWVnRpk0bWrVqxbx582jbti3+/v6MGzeO8uXLGx1P\n0km/tf04dPnQP+5z4fcLT93V+dDdxLt0WtYJt9xuj92nQuEKTGky5ZnOD+Dt7Z3mec2aNf91QaJr\n166xc+dOPDw8AChfvjxFixZlyZIlDBo0CIB69epRr1691GNq1KiBh4cH9erV4+jRo7z44otPnLF+\n/fqMHDmS999/n82bN2NtbU1AQACBgYH069eP3LlzA3D48GGWLFnC2LFjGT58OACNGjXCysqK0aNH\nM2TIEMqVK/fE1/0rNzc3ihUrBvCvQ9aTkpIYNWoUDRo0YMGCBanbvby8qFevHnPmzKFXr16p2+/c\nucP69evJkycPAC+88ALVq1dn7dq1tGnT5pkzi3HU2SkiFuHnn3/mp59+Akgd7jB37lxKlCjB8uXL\nGTFiBJGRkTRp0sTImCIiIiKSTmxsbOjatSuxsbE0bNiQxo0b07ZtW2JjY42OJpkkOSUZM882FN2M\nmeSUf++0fB7Lli1j3759qY9Zs2b96zHe3t6phU6AIkWK4Orqyrlz51K3PXjwgHHjxuHt7Y2joyO2\ntrapxc8ff/zxqXOOHj2aX375hf/+97906NCBq1evMmrUKPz8/Lh69SoA27ZtA3hk0aGHzx++nhlO\nnDjBtWvXHslSt25dihUr9kiWmjVrphY6gdRi8J/fU8le1NkpIhZhwYIFLFq0iJMnTxITE0NYWBjH\njh2jXbt2dO7cmfLly+Pg4GB0TBERERFJZ/b29vTp04euXbvy2WefUbNmTVq2bMnIkSMpXry40fHk\nGT1JR+WUPVMYvHEwCckJT31+e2t7+lXrR99qGTevv5+f32MXKHqc/PnzP7LN3t6e+/fvpz4fNGgQ\n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\nSN02Y8YMPvjgA4KCgpg4caKB6URERERERDJPSkoKixcvZsSIEbi7uzN+/HiqVatmdCwRkWxLxU7J\nVL///jv58uXjp59+wsPDg+TkZKytrUlKSuLLL78kPDycBg0aMHXqVEqWLGl0XBERERERkUyRmJjI\n3LlzGT16NBUrVmTs2LH4+/sbHUtEJNvRGGHJVLlz5+bq1at4eHgAYG1tDfwxR2KvXr2YO3cux44d\no0+fPty9e9fIqCJpmM1mkpOTjY4hIiIiIjmUra0tb775Jj/99BP16tWjUaNGtG/fntOnTxsdTUQk\nW1GxUzJd/vz5H/taUFAQkydP5tq1azg5OWViKpF/Fh8fT/Hixbl48aLRUUREREQkB3NwcKBfv36c\nPn2acuXKUa1aNSZMmKCV20VEnpCGsUuWdPPmTfLly2d0DJE0hg0bxrlz55g/f77RUURERETEQty4\ncYP//e9/VK5c2egoIiLZgoqdYhiz2YzJZDI6hsgTu3PnDj4+PixatIhatWoZHUdERERERERE/kLD\n2MUwZ8+eJSkpyegYIk/M2dmZiRMnEhYWpvk7RURERERERLIgFTvFMG3btmXt2rVGxxB5KsHBweTJ\nk4cvv/zS6CgiIiIiIiIi8hcaxi6GOH78OI0aNeKXX37BxsbG6DgiT+XIkSO88sornDx5kgIFChgd\nR0RERERERET+jzo7xRCRkZF07txZhU7Jlvz9/QkODmb48OFGRxERERERERGRP1Fnp2S6hIQE3Nzc\n2LVrF56enkbHEXkmN2/exMfHh++++46AgACj44iIiIiIiIgI6uwUA6xatQofHx8VOiVby5cvH2PH\njiUsLAx9ZyQiIiIiIiKSNajYKZkuMjKSbt26GR1D5Ll17dqV+/fvs2DBAqOjiIiIiIiIiAgaxi6Z\nLC4ujhdffJELFy7g5ORkdByR57Znzx7eeOMNTp06hYuLi9FxRERERERERCyaOjslU82ZM4egoCAV\nOiXHqFatGg0bNmTs2LFGRxERERERERGxeOrslEyTkpJCmTJlWLRoEVWqVDE6jki6uXz5Mn5+fnz/\n/feULVvW6DgiIiIiYsESExM5evQoFStWNDqKiIgh1NkpmWb79u04OTnx0ksvGR1FJF0VLlyYYcOG\n0bdvXy1WJCIiIiKGa926Ndu3bzc6hoiIIVTslEwza9YsunXrhslkMjqKSLoLCwvj3LlzrFy50ugo\n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\n1oQJExJ9QNC6dWs1adJEo0aNUu7cuZUvXz5J0rx58+Tj4yNPT0/lyJFDLVu2VHh4eMJx0dHR6tGj\nh3LlyiUXFxflzZtX/v7+SfATAwDAthYsWKCXXnpJVatWNR0FgB04mQ6A1Ic5OwHYi8Vi0ZAhQzRi\nxAj5+vrKYrGYjgTYzL1799S3b1+VLFlSERERGj58uHx9fXXo0CE5Ozvr9u3b8vX1VYMGDbRo0SKd\nO3dOffr0SXSOuLg4vfjii1q2bJm8vLy0fft2denSRV5eXmrbtm3Cfhs3blSGDBn0ww8/JBRCY2Ji\nNGLECBUpUkRXr17Vxx9/rFatWmnTpk2SpEmTJikkJETLli3Tiy++qPPnz+vYsWNJ9wMCAMAGYmJi\nFBwcrHnz5pmOAsBOLFbGAsLGxo8fr8uXL2vChAmmowBIheLj41WqVClNmDBB9erVMx0HeCrt2rXT\nwoUL5erqmrDttdde07p16x7a9/bt28qUKZNCQ0NVqVIlTZs2TQEBATp//nzC8fPnz1fbtm21ZcuW\nx3an9OvXTwcPHtT69esl/dXZ+eOPP+rs2bNKly7dY7MePHhQJUuWVHh4uHLmzKnu3bvr+PHj2rBh\nAx80AABSrNmzZ2vRokX68ccfTUcBYCcMY4fNMWcnAHtycHDQkCFDNHz4cObuRIr0+uuva+/evQmP\nmTNnSpKOHTumd999Vy+99JIyZMigF154QVarVWfPnpUkHTlyRKVKlUpUKK1YseJD5582bZp8fHzk\n5eUlDw8PTZkyJeEcD5QsWfKhQufu3bvVqFEj5cuXT56engnnfnBs+/bttXv3bhUpUkQ9e/bUunXr\nFB8fb7sfDAAAdvZgrs6AgADTUQDYEcVO2BzD2AHY29tvv60bN27ol19+MR0FeGrp06dXoUKFEh65\nc+eWJDVs2FA3btzQjBkztGPHDv32229ycHBIWEDIarX+a0fl119/rX79+qlDhw7asGGD9u7dq65d\nuz60CJG7u3ui53fu3FHdunXl6emphQsXateuXVq7dq2k/1/AqHz58jp9+rSCg4MVExOj1q1bq379\n+nzoAABIMRYuXKj8+fPrtddeMx0FgB0xZydsjgWKANibo6OjfvrpJ+XKlct0FMAmLl++rGPHjmnW\nrFkJf4Dt3LkzUedksWLFtHTpUkVFRcnFxSVhn7/bunWrqlSpou7duydsO378+L9e//Dhw7px44bG\n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\n3TM5BbM0AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2871d1eda58>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
    "show_map(romania_graph_data)"
  {
   "cell_type": "markdown",
   "source": [
    "Voila! You see, the romania map as shown in the Figure[3.2] in the book. Now, see how different searching algorithms perform with our problem statements."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SIMPLE PROBLEM SOLVING AGENT PROGRAM\n",
    "\n",
Anthony Marakis's avatar
Anthony Marakis a validé
    "Let us now define a Simple Problem Solving Agent Program. Run the next cell to see how the abstract class `SimpleProblemSolvingAgentProgram` is defined in the search module."
   "execution_count": 11,
   "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\">SimpleProblemSolvingAgentProgram</span><span class=\"p\">:</span>\n",
       "\n",
       "    <span class=\"sd\">&quot;&quot;&quot;Abstract framework for a problem-solving agent. [Figure 3.1]&quot;&quot;&quot;</span>\n",
       "\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\">initial_state</span><span class=\"o\">=</span><span class=\"bp\">None</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;State is an abstract representation of the state</span>\n",
       "<span class=\"sd\">        of the world, and seq is the list of actions required</span>\n",
       "<span class=\"sd\">        to get to a particular state from the initial state(root).&quot;&quot;&quot;</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span> <span class=\"o\">=</span> <span class=\"n\">initial_state</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">seq</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"fm\">__call__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">percept</span><span class=\"p\">):</span>\n",
       "        <span class=\"sd\">&quot;&quot;&quot;[Figure 3.1] Formulate a goal and problem, then</span>\n",
       "<span class=\"sd\">        search for a sequence of actions to solve it.&quot;&quot;&quot;</span>\n",
       "        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">update_state</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">,</span> <span class=\"n\">percept</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\">seq</span><span class=\"p\">:</span>\n",
       "            <span class=\"n\">goal</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">formulate_goal</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">)</span>\n",
       "            <span class=\"n\">problem</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">formulate_problem</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">state</span><span class=\"p\">,</span> <span class=\"n\">goal</span><span class=\"p\">)</span>\n",
       "            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">seq</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">search</span><span class=\"p\">(</span><span class=\"n\">problem</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\">seq</span><span class=\"p\">:</span>\n",
       "                <span class=\"k\">return</span> <span class=\"bp\">None</span>\n",
       "        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">seq</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">update_state</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\">percept</span><span class=\"p\">):</span>\n",
       "        <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">formulate_goal</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=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">formulate_problem</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\">goal</span><span class=\"p\">):</span>\n",
       "        <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span>\n",
       "\n",
       "    <span class=\"k\">def</span> <span class=\"nf\">search</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">problem</span><span class=\"p\">):</span>\n",
       "        <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span>\n",
       "</pre></div>\n",
       "</body>\n",
       "</html>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
    "psource(SimpleProblemSolvingAgentProgram)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The SimpleProblemSolvingAgentProgram class has six methods:  \n",
    "\n",
    "* `__init__(self, intial_state=None)`: This is the `contructor` of the class and is the first method to be called when the class is instantiated. It takes in a keyword argument, `initial_state` which is initially `None`. The argument `initial_state` represents the state from which the agent starts.\n",
    "\n",
    "* `__call__(self, percept)`: This method updates the `state` of the agent based on its `percept` using the `update_state` method. It then formulates a `goal` with the help of `formulate_goal` method and a `problem` using the `formulate_problem` method and returns a sequence of actions to solve it (using the `search` method).\n",
    "\n",
Anthony Marakis's avatar
Anthony Marakis a validé
    "* `update_state(self, percept)`: This method updates the `state` of the agent based on its `percept`.\n",