search.ipynb 184 ko
Newer Older
Chipe1's avatar
Chipe1 a validé
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": 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": null,
    "collapsed": false,
    "deletable": true,
    "editable": true,
    "scrolled": true
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Eshan\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\fuzzywuzzy\\fuzz.py:35: UserWarning: Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning\n",
      "  warnings.warn('Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning')\n"
     ]
    }
   ],
Chipe1's avatar
Chipe1 a validé
   "source": [
    "from search import *"
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
Chipe1's avatar
Chipe1 a validé
   "source": [
    "Here, we learn about problem solving. Building goal-based agents that can plan ahead to solve problems, in particular, navigation problem/route finding problem. First, we will start the problem solving by precisely defining **problems** and their **solutions**. We will look at several general-purpose search algorithms. Broadly, search algorithms are 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",
    "\n",
    "\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",
    "\n",
    "*Don't miss the visualisations of these algorithms solving the route-finding problem defined on Romania map at the end of this notebook.*"
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
Chipe1's avatar
Chipe1 a validé
   "source": [
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": 2,
jeff3456's avatar
jeff3456 a validé
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
jeff3456's avatar
jeff3456 a validé
   },
   "outputs": [],
jeff3456's avatar
jeff3456 a validé
   "source": [
    "%psource Problem"
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
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` and is the first method called when you create an instance of the class. `initial` specifies the initial state of our search problem. It represents the start state from where 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)` : Given a graph state, it checks if it is a terminal state. If the state is indeed a goal state, value of `True` is returned. Else, of course, `False` is returned.\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."
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
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": 3,
    "collapsed": false,
    "deletable": true,
    "editable": true
Chipe1's avatar
Chipe1 a validé
   "source": [
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
Chipe1's avatar
Chipe1 a validé
   "source": [
    "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. 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": 4,
Chipe1's avatar
Chipe1 a validé
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": 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,
    "deletable": true,
    "editable": 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",
    "Hmm... 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": 5,
Chipe1's avatar
Chipe1 a validé
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
Chipe1's avatar
Chipe1 a validé
   "source": [
    "romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)"
Chipe1's avatar
Chipe1 a validé
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "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",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "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": 6,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   "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",
   "metadata": {
    "deletable": true,
    "editable": true
   },
    "Let's start the visualisations by importing necessary modules. 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."
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": 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",
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "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": 8,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "# initialise a graph\n",
    "G = nx.Graph()\n",
    "\n",
    "# use this while labeling nodes in the map\n",
    "node_labels = dict()\n",
    "# use this to modify colors of nodes while exploring the graph.\n",
    "# This is the only dict we send to `show_map(node_colors)` while drawing the map\n",
    "node_colors = dict()\n",
    "\n",
    "for n, p in romania_locations.items():\n",
    "    # add nodes from romania_locations\n",
    "    G.add_node(n)\n",
    "    # add nodes to node_labels\n",
    "    node_labels[n] = n\n",
    "    # node_colors to color nodes while exploring romania map\n",
    "    node_colors[n] = \"white\"\n",
    "\n",
    "# we'll save the initial node colors to a dict to use later\n",
    "initial_node_colors = dict(node_colors)\n",
    "    \n",
    "# positions for node labels\n",
    "node_label_pos = { k:[v[0],v[1]-10]  for k,v in romania_locations.items() }\n",
    "\n",
    "# use this while labeling edges\n",
    "edge_labels = dict()\n",
    "\n",
    "# add edges between cities in romania map - UndirectedGraph defined in search.py\n",
    "for node in romania_map.nodes():\n",
    "    connections = romania_map.get(node)\n",
    "    for connection in connections.keys():\n",
    "        distance = connections[connection]\n",
    "\n",
    "        # add edges to the graph\n",
    "        G.add_edge(node, connection)\n",
    "        # add distances to edge_labels\n",
    "        edge_labels[(node, connection)] = distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   "source": [
    "G = nx.Graph()\n",
    "\n",
    "# use this while labeling nodes in the map\n",
    "node_labels = dict()\n",
    "# use this to modify colors of nodes while exploring the graph.\n",
    "# This is the only dict we send to `show_map(node_colors)` while drawing the map\n",
    "for n, p in romania_locations.items():\n",
    "    # add nodes from romania_locations\n",
    "    G.add_node(n)\n",
    "    # add nodes to node_labels\n",
    "    node_labels[n] = n\n",
    "    # node_colors to color nodes while exploring romania map\n",
    "    node_colors[n] = \"white\"\n",
    "# we'll save the initial node colors to a dict to use later\n",
    "initial_node_colors = dict(node_colors)\n",
    "    \n",
    "# positions for node labels\n",
    "node_label_pos = { k:[v[0],v[1]-10]  for k,v in romania_locations.items() }\n",
    "# use this while labeling edges\n",
    "edge_labels = dict()\n",
    "\n",
    "# add edges between cities in romania map - UndirectedGraph defined in search.py\n",
    "for node in romania_map.nodes():\n",
    "    connections = romania_map.get(node)\n",
    "    for connection in connections.keys():\n",
    "        distance = connections[connection]\n",
    "\n",
    "        # add edges to the graph\n",
    "        G.add_edge(node, connection)\n",
    "        # add distances to edge_labels\n",
    "        edge_labels[(node, connection)] = distance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
    "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."
   "execution_count": 10,
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def show_map(node_colors):\n",
    "    # set the size of the plot\n",
    "    plt.figure(figsize=(18,13))\n",
    "    # draw the graph (both nodes and edges) with locations from romania_locations\n",
    "    nx.draw(G, pos = romania_locations, node_color = [node_colors[node] for node in G.nodes()])\n",
    "\n",
    "    # draw labels for nodes\n",
    "    node_label_handles = nx.draw_networkx_labels(G, pos = node_label_pos, labels = node_labels, font_size = 14)\n",
    "    # add a white bounding box behind the node labels\n",
    "    [label.set_bbox(dict(facecolor='white', edgecolor='none')) for label in node_label_handles.values()]\n",
    "\n",
    "    # add edge lables to the graph\n",
    "    nx.draw_networkx_edge_labels(G, pos = romania_locations, edge_labels=edge_labels, font_size = 14)\n",
    "    \n",
    "    # add a legend\n",
    "    white_circle = lines.Line2D([], [], color=\"white\", marker='o', markersize=15, markerfacecolor=\"white\")\n",
    "    orange_circle = lines.Line2D([], [], color=\"orange\", marker='o', markersize=15, markerfacecolor=\"orange\")\n",
    "    red_circle = lines.Line2D([], [], color=\"red\", marker='o', markersize=15, markerfacecolor=\"red\")\n",
    "    gray_circle = lines.Line2D([], [], color=\"gray\", marker='o', markersize=15, markerfacecolor=\"gray\")\n",
    "    green_circle = lines.Line2D([], [], color=\"green\", marker='o', markersize=15, markerfacecolor=\"green\")\n",
    "    plt.legend((white_circle, orange_circle, red_circle, gray_circle, green_circle),\n",
    "               ('Un-explored', 'Frontier', 'Currently Exploring', 'Explored', 'Final Solution'),\n",
    "               numpoints=1,prop={'size':16}, loc=(.8,.75))\n",
    "    \n",
    "    # show the plot. No need to use in notebooks. nx.draw will show the graph itself.\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "We can simply call the function with node_colors dictionary object to display it."
   ]
  },
   "execution_count": 11,
    "collapsed": false,
    "deletable": true,
    "editable": true
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Eshan\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\networkx\\drawing\\nx_pylab.py:126: MatplotlibDeprecationWarning: pyplot.hold is deprecated.\n",
      "    Future behavior will be consistent with the long-time default:\n",
      "    plot commands add elements without first clearing the\n",
      "    Axes and/or Figure.\n",
      "  b = plt.ishold()\n",
      "C:\\Users\\Eshan\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\networkx\\drawing\\nx_pylab.py:138: MatplotlibDeprecationWarning: pyplot.hold is deprecated.\n",
      "    Future behavior will be consistent with the long-time default:\n",
      "    plot commands add elements without first clearing the\n",
      "    Axes and/or Figure.\n",
      "  plt.hold(b)\n",
      "C:\\Users\\Eshan\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\matplotlib\\__init__.py:917: UserWarning: axes.hold is deprecated. Please remove it from your matplotlibrc and/or style files.\n",
      "  warnings.warn(self.msg_depr_set % key)\n",
      "C:\\Users\\Eshan\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\matplotlib\\rcsetup.py:152: UserWarning: axes.hold is deprecated, will be removed in 3.0\n",
      "  warnings.warn(\"axes.hold is deprecated, will be removed in 3.0\")\n"
     ]
    },
      "image/png": "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\nTpyoCxcuWDsOAAAAAFtjGJnX6Lx6NXf7Xb2auZ9h5EusmTNnqmTJknrllVdyfL1q1ary9fWVJEVF\nReVYVoaGhqpSpUrm57/++qtMJpP+85//aPTo0SpbtqycnJx08eJFxcbGymQyKT4+Xt27d5e7u7sa\nN25s3vfTTz9Vq1at5ObmJhcXFwUGBurbb7+1OF9AQICaNWumuLg4NWzYUM7Ozqpbt642bNhgkWn5\n8uU6deqUeUn5PzP+U3h4uEqXLq3U1FSL7UlJSXJzc9PYsWNv+RneiWXLlmVb1p6enq4WLVqoatWq\nunz5sqT/fcZHjhxRy5Yt5ezsLG9vb02aNEkZGRm3PIdhGJo7d65q1qwpR0dHeXt7a/DgweZjZzGZ\nTBo/frxmzJihypUry9HRUUeOHMlxGfudfNZZ3nnnHdWqVUtFixZVvXr19MEHHyggIEABAQF3/8HZ\nAMpOFDqXL1/W7NmzFRkZae0ohV6DBg307LPPatKkSdaOAgAAYDUP6rX5gAIvISHzZkR348yZzP3z\nWHp6unbt2qW2bduqaNGieX78qVOn6scff9SSJUu0YcMGi3OEhISocuXKWrdunWbMmCFJ2rp1q1q1\naiVXV1etWrVKq1evVlJSkpo3b64TJ05YHPv48eMaOnSoIiIitH79enl7e6t79+766aefJEkTJ05U\n+/btVapUKSUkJCghISHHgk6SBg4cqLNnz2Z7ffXq1UpOTs5xefqNDMNQWlpatkeWsLAwde/eXX37\n9tWpU6ckSZMnT9bnn3+u1atXq3jx4hbHe/rpp9W6dWtt3LhRwcHBmjx5sl5++eVbZhg/frwiIiLU\npk0bbd68WaNHj1ZsbKw6dOiQrSiNjY3V1q1bNWvWLG3dulVly5a96XFv91lL0o4dOxQSEqJatWpp\n/fr1GjlypIYNG6Yff/zxtp+drWMZOwqd+fPnq23btvLx8bF2FCjzD5vatWurX79+ql+/vrXjAAAA\n3HdpaWnq06ePIiIi1LBhQ2vHAR4Mw4ZJX3996zEnT+Z+VmeWq1el556Type/+ZgGDaSYmFwd9ty5\nc7p27ZoqVqx4d7luo3Tp0tqwYUOOs0G7deuWbTbp0KFD1aJFC23atMm8rWXLlqpSpYpmz56tmH+8\nv3Pnzik+Pl7Vq1eXlHm9SW9vb7333nsaN26cqlatqlKlSsnR0fG2S7Nr166tFi1aaPHixQoKCjJv\nX7x4sdq2bavKlSvf9r1OmzZN06ZNy7b9zz//lKenpyRpyZIlql+/vnr37q3IyEhNmTJFkydPtpjZ\nmqVfv37mGaVt27Y1T5QaNmyY3N3ds42/cOGCZs+erT59+mjhwoWSpMDAQJUqVUq9e/fWli1b1Llz\nZ/N4wzC0fft2FStWzLwtMTExx/d2u89akiIjI1W7dm2LX++6devKz89PNWrUuO3nZ8uY2YlC5eLF\ni5o3bx6zOgsQDw8PRUdHKzw8XEY+LRMBAAAoyOzt7dW0aVN17NhR3bt3v+lffgHkUnr63S9FN4zM\n/R8wTz/9dI5FpyR17drV4vmxY8d0/PhxhYSEWMyMdHZ2VtOmTRUfH28xvnr16ubyTZK8vLzk5eWl\n33///a6yvvjii9q1a5eOHTsmSdq/f7+++uqrO5rVKUkvvPCC9u/fn+3xz2LS3d1dq1evVnx8vAID\nA/XEE09ozJgxOR7vn6WrJPXo0UNXrlzJtqQ/y759+5SSkqJevXpl28/e3l6ffvqpxfannnrKoui8\nldt91unp6Tpw4ICeffZZi1/vRx999I6KYlvHzE4UKjExMerYsaPFbxqwvn79+mnJkiVas2aNevbs\nae04AAAA91WRIkU0aNAgPf/881q4cKFatGihDh06KDIy8qbXuwMKvTuZURkTI40ZI6Wk5P74Tk6Z\ns0eHDs39vrfg4eGhYsWK6bfffsvT42bx9va+49fO/v8S/7CwMIWFhWUbX6FCBYvnJUuWzDbGyclJ\nf//9991EVdeuXVWmTBktXrxYs2bN0uuvv66yZcuqU6dOd7S/t7e3/Pz8bjuuSZMmqlmzpo4ePaoh\nQ4bIzi7neX+lS5fO8XnWEvgbZd174sbP1d7eXh4eHtnuTXGrX5sb3e6zPnfunFJTU+Xl5ZVt3I3v\nozBiZicKjZSUFB06dEgTJ060dhTcoEiRIlqwYIFGjRqlK1euWDsOAACAVTg7O2v06NE6duyYHn74\nYT366KMaPHiwTp8+be1owIPJ319ycLi7fe3tpUaN8jaPMouwgIAA7dixQ9fv4A7xWdfcTLmhsD1/\n/nyO4282qzOn1zw8PCRJ06dPz3GG5ObNm2+b7144ODiob9++io2N1dmzZ7VmzRqFhYXJ3j5v5+VF\nR0fr2LFj8vX11fDhw3Xp0qUcx505cybH5+XKlctxfFYh+ccff1hsT0tL0/nz57MVlrf6tcktT09P\nOTg4mAvrf7rxfRRGlJ0oNOzt7fXee++pSpUq1o6CHDz++ONq2bKlpk6dau0oAAAAVlWiRAm9/PLL\nSkxMlKOjo+rWrauxY8dmmyUE4DaaNpVymPl2R0qXztw/H4wdO1bnz5/X6NGjc3z9l19+0TfffCNJ\n5mt7/nMp9cWLF/X555/fc46aNWuqUqVK+u677+Tn55ftkXVH+NxwcnLStWvX7nj8gAEDdPHiRXXv\n3l3Xr19Xv379cn3OW9mzZ4+mTp2qqVOnavPmzbp48aIGDhyY49j33nvP4vmaNWvk6uqqevXq5Ti+\nSZMmcnR01Jo1ayy2v/vuu0pLS8vXO6IXKVJEfn5+ev/99y0uB3fw4EH98ssv+XbeBwXL2FFo2NnZ\n5cvd7pB3XnnlFdWrV08vvPAClxoAAACFnpeXl+bMmaOIiAhNnjxZNWrU0LBhwzR06FC5ublZOx5Q\n8JlM0ujR0ogRubtRkbNz5n55OBPvn5544gnzd/vo0aMKDQ1VhQoV9Ndff2nnzp1aunSpVq9eLV9f\nX7Vr104lSpRQv379FB0drevXr+uVV16Rq6vrPecwmUx67bXX1KVLF6WkpCgoKEienp46c+aMPv/8\nc1WoUEERERG5Ombt2rV14cIFLVq0SH5+fipatOhNy0Ipc9Zk586dtWHDBnXq1EkPP/zwHZ/r1KlT\n2rdvX7btFStWlLe3t/766y+FhISoVatWGjlypEwmk5YsWaKgoCAFBgaqT58+Fvu98cYbysjIUKNG\njfTxxx9r6dKlioqKUokSJXI8f8mSJTVixAhNnz5dLi4uat++vRITEzVhwgQ1a9ZMHTp0uOP3cjei\no6PVtm1bde3aVf3799e5c+cUFRWlMmXK3HSpfmFRuN89gALF29tbY8aM0bBhw6wdBQAAoMAoX768\nFi9erISEBCUmJqp69eqKiYm56+vkAYVKWJjUsGHmNTjvhJOT9Oij0gsv5GusYcOG6bPPPpO7u7tG\njhypJ598UqGhoUpMTNTixYvN1610d3fXli1bZGdnp6CgIL300ksKDw9Xy5Yt8yRH+/btFR8fr+Tk\nZPXt21eBgYEaPXq0/vjjDzW9i5mtffv2VY8ePTRu3Dj5+/vf0fU3u3fvLkl3fGOiLLGxsWratGm2\nx9tvvy1J6t+/v65du6bly5ebl5B3795dYWFhGjx4sH766SeL423atEk7duxQ586dtWrVKk2YMOG2\n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\n7JRcsXTpUlq0aKFCpxRozz77LAEBAUyfPt3oKCIiIiJixqytrZkwYQJjx45Vd6eImB0VOyVXzJ8/\nnz59+hgdQyTHvffee8yYMYOff/7Z6CgiIiIiYsY6d+5McnIy69evNzqKiEiuUrFTctyRI0e4dOmS\nhk+IWahQoQKvv/46ERERRkcRERERETNmaWnJxIkTGTduHBkZGUbHERHJNSp2So6bN28eYWFhWFlZ\nGR1FJFcMHz6c/fv3Exsba3QUERERETFjHTp0wMLCgpUrVxodRUQk12iBIslRd+/exdXVlb179+Lh\n4WF0HJFcs3LlSsaMGcOhQ4ewsbExOo6IiIiIiIiIWVBnp+So1atX4+/vr0KnmJ0OHTpQrlw5Zs2a\nZXQUEREREREREbOhzk7JUa1ataJnz5507drV6Cgiue7kyZM0atSI77//nlKlShkdR0RERERERKTA\nU7FTcszPP/9MzZo1OX/+PA4ODkbHETFEREQEV69eZcGCBUZHERERERERESnwNIxdcszChQsJDQ1V\noVPM2rhx49i0aRN79uwxOoqIiIiIiIhIgadip+SIjIwMFixYQJ8+fYyOImKowoULM3XqVMLDw8nI\nyDA6joiIiIiYqcjISPz8/IyOISKS41TslByxZcsWihUrRs2aNY2OImK47t27Y2Njw/z5842OIiIi\nIiL5SFhYGM8//3y2nCsiIoLt27dny7lERPIyFTslR8ybN4/evXsbHUMkT7C0tGTWrFmMGTOG69ev\nGx1HRERERMyQk5MTJUqUMDqGiEiOU7FTst21a9fYsGED3bp1MzqKSJ5Rs2ZN2rdvz/jx442OIiIi\nIiL50L59+2jZsiUuLi4ULlyYRo0asXv37iz7zJkzBy8vL+zt7XFxcaFVq1akpaUBGsYuIuZDxU7J\ndl988QXPPfccxYsXNzqKSJ4yZcoUoqKiOHr0qNFRRERERCSfuXnzJi+99BI7d+7ku+++o0aNGrRp\n04arV68CsH//fl577TXGjx/PDz/8QGxsLK1btzY4tYhI7rM2OoAUPPPmzWPatGlGxxDJc1xcXBg/\nfjzh4eFs3boVCwsLoyOJiIiISD4RGBiY5fnMmTP56quv2LBhA927d+fs2bMUKlSIdu3a4ezsjLu7\nO9WrVzcorYiIcdTZKdnq4MGDXL9+/b4/xCLyh/79+3P9+nWWLVtmdBQRERERyUcuX75M//798fLy\n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\nUI0cOVINGzaUzWYzHQmwm6ioKL377rsqWbKkoqOjNWLECDVq1Ej79u2Tq6urrl+/roYNG6p+/fqa\nP3++Tp8+rb59+yY7R0JCgp588kktXrxYfn5+2rx5s7p27So/Pz+1b98+ab+1a9fK19dXP/zwQ1Ih\nND4+XiNHjlTRokV16dIlvffee2rdurXWrVsnSZo4caLCw8O1ePFiPfnkkzpz5owOHz6ccj8gAADs\nID4+XqGhoZozZ47pKAAcxGYxFhB2Nm7cOF24cEHjx483HQVAOpSYmKjSpUtr/Pjxqlu3ruk4wEPp\n0KGD5s2bJw8Pj6RtL774olauXHnXvtevX1eWLFm0adMmVapUSVOmTNHw4cN15syZpOO/+OILtW/f\nXr/88st9u1P69++vffv2adWqVZL+6uxcs2aNTp06JTc3t/tm3bdvn0qVKqXIyEjlzp1bPXr00JEj\nR7R69Wo+aAAApFkzZ87U/PnztWbNGtNRADgIw9hhd8zZCcCRnJycNHToUI0YMYK5O5EmvfTSS9q1\na1fSY/r06ZKkw4cP6/XXX9fTTz8tX19fPfHEE7IsS6dOnZIkHTx4UKVLl05WKK1YseJd558yZYoC\nAgLk5+cnb29vTZo0Kekcd5QqVequQuf27dvVqFEjPfXUU/Lx8Uk6951jO3bsqO3bt6to0aLq1auX\nVq5cySq2AIA0JT4+XmFhYRo+fLjpKAAciGIn7I5h7AAc7bXXXtPVq1f1888/m44CPLRMmTKpcOHC\nSY+8efNKkho0aKCrV69q2rRp2rJli3777Tc5OTk91AJCX375pfr3769OnTpp9erV2rVrl7p163bX\nOby8vJI9v3HjhurUqSMfHx/NmzdP27Zt04oVKyT9/wJG5cuX14kTJxQaGqr4+Hi1adNG9erV40MH\nAECaMW/ePBUoUEAvvvii6SgAHIg5O2F3LFAEwNGcnZ31448/Kk+ePKajAHZx4cIFHT58WDNmzEj6\nA2zr1q3JOieLFSumhQsXKjY2Vu7u7kn7/N2GDRtUpUoV9ejRI2nbkSNH/vX6Bw4c0NWrVzVmzBjl\nz59fkrRnz5679vP19VWLFi3UokULtW3bVi+88IKOHz+up59++uHfNAAAKaxjx47q2LGj6RgAHIzO\nTtgdw9gBpIQ8efIwbyDSjRw5cihbtmyaOnWqjhw5ovXr1+vtt9+Wk9P//6rWtm1bJSYmqmvXroqI\n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\nqY7NZpPNZpO7u7vpKABwF4qdGZzNZtPSpUsf6xyzZ8+Wt7e3nRKlnKtXr8rf31/vvfeeLl68aDoO\nAIMKFCig8ePHO/w6jr5fvvrqq6zcDthJq1atVLp0aQ0ZMsR0FABItRhJAiA1otiZTt35pO1+jw4d\nOkiSIiMj1bBhw8e6VsuWLXXs2DE7pE5Zn332mXbv3q2oqCgVK1ZM7777rs6fP286FgA769ChQ9K9\nz8XFRU8++aTeeust/fHHH0n7bNu2TT169HB4lpS4X7q6uqp79+46fPiw/P39FRAQoHfffVdXrlxx\n6HWB9MZms+mTTz7RkiVLtG7dOtNxAAAA8IAodqZTkZGRSY9p06bdte2jjz6SJOXOnfuxhx54enoq\nZ86cj535ccTFxT3Scfnz59eUKVO0d+9e3b59WyVKlFDfvn117tw5OycEYFLNmjUVGRmpEydOaPr0\n6QoPD09W3PTz81OmTJkcniMl75fe3t4aPny49u/fr+joaBUrVkzvv/8+Q3KBh5A9e3ZNmzZNHTp0\n0J9//mk6DgAAAB4Axc50Knfu3EmPLFmy3LUtc+bMkpIPYz9x4oRsNpsWLlyoqlWrytPTU2XLltWe\nPXu0b98+ValSRV5eXnrhhReSDYv832GZp0+fVuPGjZUtWzZlypRJxYoV08KFC5Ne37t3r2rWrClP\nT09ly5btrj8gtm3bptq1aytHjhzy9fXVCy+8oF9//TXZ+7PZbJoyZYqaNm0qLy8vDRkyRAkJCerc\nubMKFiwoT09PFSlSRO+//74SExP/9ed1Z26u/fv3y8nJSSVLllTPnj115syZR/jpA0ht3N3dlTt3\nbuXLl0+1a9dWy5Yt9cMPPyS9/r/D2G02mz799FM1btxYmTJlkr+/v9atW6czZ86oTp068vLyUpky\nZZLNi3nnXrh27VqVLFlSXl5eqlat2j/eLyVpxYoVqlixojw9PZU9e3Y1bNhQMTEx98wlSS+//LJ6\n9uz5wO89d+7c+vTTT7VhwwZt3rxZRYsW1Zw5c1i5HXhA9erVU/369dWnTx/TUQDACNY0BpDWUOzE\nXYYPH66BAwdq586dypIli15//XX16tVLYWFh2rp1q2JiYtS7d+/7Ht+jRw9FR0dr3bp12r9/vz78\n8MOkgmtUVJTq1Kkjb29vbd26VcuXL9emTZvUqVOnpONv3Lihtm3b6pdfftHWrVtVpkwZ1a9f/64h\nmCEhIapfv7727t2rt99+W4mJicqbN68WL16siIgIhYWFadSoUZo1a9YDv/c8efJowoQJioiIkKen\np0qXLq233npLJ0+efMifIoDU6tixY1q1apVcXV3/cb/Q0FC1atVKu3fvVkBAgFq1aqXOnTurR48e\n2rlzp5544omkKUHuiI2N1ejRozVz5kz9+uuvunbtmrp3737fa6xatUqNGjVSrVq19Ntvv2ndunWq\nWrXqA31I87CKFi2qZcuWacGCBfr8889Vrlw5rV69mj9ggAcwbtw4bdiwQcuXLzcdBQBSxN9/P7gz\nL6cjfj8BAIewkO4tWbLEut//1JKsJUuWWJZlWcePH7ckWZ999lnS6+Hh4ZYk66uvvkraNmvWLMvL\ny+u+z0uVKmUFBwff83pTp061fH19revXrydtW7dunSXJOnz48D2PSUxMtHLnzm3NnTs3We6ePXv+\n09u2LMuyBg4caNWoUeNf97ufixcvWoMGDbKyZctmdenSxTp27NgjnwuAGe3bt7ecnZ0tLy8vy8PD\nw5JkSbImTJiQtM9TTz1ljRs3Lum5JGvQoEFJz/fu3WtJsj744IOkbXfuXZcuXbIs6697oSTr4MGD\nSfvMmzfPcnNzsxITE5P2+fv9skqVKlbLli3vm/1/c1mWZVWtWtV6++23H/bHkExiYqK1bNkyy9/f\n36pRo4b122+/Pdb5gIxg48aNVq5cuazz58+bjgIADhcTE2P98ssv1ptvvmkNHTrUio6ONh0JAB4Y\nnZ24S+nSpZO+z5UrlySpVKlSybZFRUUpOjr6nsf36dNHoaGhqly5soYOHarffvst6bWIiAiVLl1a\nPj4+SduqVKkiJycnHThwQJJ08eJFdevWTf7+/sqcObN8fHx08eJFnTp1Ktl1AgIC7rr2Z599poCA\nAPn5+cnb21sTJ06867iH4efnp9GjR+vQoUPKmTOnAgIC1LlzZx09evSRzwkg5b300kvatWuXtm7d\nql69eql+/fr/2KEuPdi9UPrrnnWHu7u7ihYtmvT8iSeeUFxcXLLFkP5u586dqlGjxsO/ocdks9nu\nWrm9TZs2OnHiRIpnAdKKKlWqqFOnTurSpQsd0QDSvbCwMPXo0UN79+7V/PnzVbRo0WR/1wFAakax\nE3f5+9DOO0MW7rXtfsMYOnfurOPHj6tjx446dOiQqlSpouDg4H+97p3ztm/fXtu2bdPEiRO1adMm\n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\nvf/++9ccb/78+Xrrrbf05ptvKjU1Vf369VP//v21Z88eSdKwYcP08ccflwpMExISVKtWLfXp00fS\nb7NKp02bppSUFK1du1Z5eXkaPHhwRb0lAAwgNjZWAwcOlJOTk61LAQAABmWyWCwWWxcBAABKS05O\nVvv27fXJJ5+oX79+17zOZDJp3Lhxevvtt697v9dee007duzQxo0bJf02s3PVqlX66aefJEkNGzbU\nqFGjNHnyZOtrunTpIh8fH8XHx+vMmTNq0KCBvvzySz366KOSpO7du8vf319Lliy56pjp6elq2rSp\njh49Kh8fn1t6fgDGYzabFRgYqBUrVigsLMzW5QAAAINiZicAAFXQrfwusm3btmWOLV68WG3btpWH\nh4ecnZ01b968q+7xKf22HD0nJ0cdOnQodbxjx45KS0uTJLm7u6tXr15avny5JCknJ0ebNm3SsGHD\nrNfv2rVLffv21X333ScXFxdrXdcaF0D1snnz5lKfGwAAACoDYScAAFVQUFCQTCaT9u/ff8Nr/7gc\ndMWKFXr55ZcVHh6uDRs2aM+ePRozZoyKiopuuQ6TyWT9+7Bhw5SQkKDCwkJ9/PHHatSokR555BFJ\nUn5+vnr27KnatWsrLi5O27dv1/r16yXptsYFYDxXGhP9/vMKAABARSPsBACgCnJzc1PPnj21cOFC\nXbx4scz5c+fOXfO13333ndq3b69x48apTZs2CgwMVFZW1jWvd3V1lbe3t77//vsy92nWrJn14yef\nfFKStHbtWi1fvlxDhgyxhhbp6enKy8vTzJkz1alTJ91///06derULT0zAOP673//qy+++EJDhw61\ndSkAAMDgCDsBAKiioqKiZLFY1LZtW61cuVI///yz0tPT9c477ygkJOSar2vSpIl27dqlL7/8UhkZ\nGZo+fbq2bNly3bEmTJig2bNn66OPPtKBAwc0efJkbd26VZGRkdZratWqpaeeekozZszQrl27Si1h\nb9y4sRwcHLRw4UIdPHhQ69at0+uvv17+NwGAISxfvlyPP/643N3dbV0KAAAwOMJOAACqKH9/f+3a\ntUuPPfaY/v73vyskJETdunXTmjVrrtkUSJJGjRqlgQMHasiQIQoLC1N2drbGjx9/3bFefPFFTZgw\nQa+++qpatGihTz/9VAkJCWrVqlWp64YNG6aUlBQ98MADpWZ9enh46IMPPtBnn32mZs2aadq0aZo7\n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\n",
       "<matplotlib.figure.Figure at 0xe53dfafc50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_map(node_colors)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "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": {
    "deletable": true,
    "editable": true
   },
    "## Searching algorithms visualisations\n",
    "\n",
    "In this section, we have visualisations of the following searching algorithms:\n",
    "\n",
    "1. Breadth First Tree Search - Implemented\n",
    "2. Depth First Tree Search\n",
    "3. Depth First Graph Search\n",
    "4. Breadth First Search - Implemented\n",
    "5. Best First Graph Search\n",
    "6. Uniform Cost Search - Implemented\n",
    "7. Depth Limited Search\n",
    "8. Iterative Deepening Search\n",
    "9. A\\*-Search - Implemented\n",
    "10. Recursive Best First Search\n",
    "\n",
    "We add the colors to the nodes to have a nice visualisation when displaying. So, these are the different colors we are using in these visuals:\n",
    "* Un-explored nodes - <font color='black'>white</font>\n",
    "* Frontier nodes - <font color='orange'>orange</font>\n",
    "* Currently exploring node - <font color='red'>red</font>\n",
    "* Already explored nodes - <font color='gray'>gray</font>\n",
    "Now, we will define some helper methods to display interactive buttons and sliders when visualising search algorithms."
   "execution_count": 12,
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def final_path_colors(problem, solution):\n",
    "    \"returns a node_colors dict of the final path provided the problem and solution\"\n",
    "    \n",
    "    # get initial node colors\n",
    "    final_colors = dict(initial_node_colors)\n",
    "    # color all the nodes in solution and starting node to green\n",
    "    final_colors[problem.initial] = \"green\"\n",
    "    for node in solution:\n",
    "        final_colors[node] = \"green\"  \n",
    "    return final_colors\n",
    "\n",
    "\n",
    "def display_visual(user_input, algorithm=None, problem=None):\n",
    "    if user_input == False:\n",
    "        def slider_callback(iteration):\n",
    "            # don't show graph for the first time running the cell calling this function\n",
    "            try:\n",
    "                show_map(all_node_colors[iteration])\n",
    "            except:\n",
    "                pass\n",
    "        def visualize_callback(Visualize):\n",
    "            if Visualize is True:\n",
    "                button.value = False\n",
    "                \n",
    "                global all_node_colors\n",
    "                \n",
    "                iterations, all_node_colors, node = algorithm(problem)\n",
    "                solution = node.solution()\n",
    "                all_node_colors.append(final_path_colors(problem, solution))\n",
    "                \n",
    "                slider.max = len(all_node_colors) - 1\n",
    "                \n",
    "                for i in range(slider.max + 1):\n",
    "                    slider.value = i\n",
    "                     #time.sleep(.5)\n",
    "        \n",
    "        slider = widgets.IntSlider(min=0, max=1, step=1, value=0)\n",
    "        slider_visual = widgets.interactive(slider_callback, iteration = slider)\n",
    "        display(slider_visual)\n",
    "        button = widgets.ToggleButton(value = False)\n",
    "        button_visual = widgets.interactive(visualize_callback, Visualize = button)\n",
    "        display(button_visual)\n",
    "    \n",
    "    if user_input == True:\n",
    "        node_colors = dict(initial_node_colors)\n",
    "        if algorithm == None:\n",
    "            algorithms = {\"Breadth First Tree Search\": breadth_first_tree_search, \"Breadth First Search\": breadth_first_search, \"Uniform Cost Search\": uniform_cost_search, \"A-star Search\": astar_search}\n",
    "            algo_dropdown = widgets.Dropdown(description = \"Search algorithm: \", options = sorted(list(algorithms.keys())), value = \"Breadth First Tree Search\")\n",
    "            display(algo_dropdown)\n",
    "        \n",
    "        def slider_callback(iteration):\n",
    "            # don't show graph for the first time running the cell calling this function\n",
    "            try:\n",
    "                show_map(all_node_colors[iteration])\n",
    "            except:\n",
    "                pass\n",
    "        def visualize_callback(Visualize):\n",
    "            if Visualize is True:\n",
    "                button.value = False\n",
    "                \n",
    "                problem = GraphProblem(start_dropdown.value, end_dropdown.value, romania_map)\n",
    "                global all_node_colors\n",
    "                \n",
    "                if algorithm == None:\n",
    "                    user_algorithm = algorithms[algo_dropdown.value]\n",
    "                \n",
    "#                 print(user_algorithm)\n",
    "#                 print(problem)\n",
    "                \n",
    "                iterations, all_node_colors, node = user_algorithm(problem)\n",
    "                solution = node.solution()\n",
    "                all_node_colors.append(final_path_colors(problem, solution))\n",
    "                slider.max = len(all_node_colors) - 1\n",
    "                \n",
    "                for i in range(slider.max + 1):\n",
    "                    slider.value = i\n",
    "#                     time.sleep(.5)\n",
    "        start_dropdown = widgets.Dropdown(description = \"Start city: \", options = sorted(list(node_colors.keys())), value = \"Arad\")\n",
    "        display(start_dropdown)\n",
    "        end_dropdown = widgets.Dropdown(description = \"Goal city: \", options = sorted(list(node_colors.keys())), value = \"Fagaras\")\n",
    "        display(end_dropdown)\n",
    "        \n",
    "        button = widgets.ToggleButton(value = False)\n",
    "        button_visual = widgets.interactive(visualize_callback, Visualize = button)\n",
    "        display(button_visual)\n",
    "        \n",
    "        slider = widgets.IntSlider(min=0, max=1, step=1, value=0)\n",
    "        slider_visual = widgets.interactive(slider_callback, iteration = slider)\n",
    "        display(slider_visual)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
    "## Breadth first tree search\n",
    "\n",
    "We have a working implementation in search module. But as we want to interact with the graph while it is searching, we need to modify the implementation. Here's the modified breadth first tree search.\n",
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
    "collapsed": false,
    "deletable": true,
    "editable": true
   "source": [
    "def tree_search(problem, frontier):\n",
    "    \"\"\"Search through the successors of a problem to find a goal.\n",
    "    The argument frontier should be an empty queue.\n",
    "    Don't worry about repeated paths to a state. [Figure 3.7]\"\"\"\n",
    "    \n",
    "    # we use these two variables at the time of visualisations\n",
    "    iterations = 0\n",
    "    all_node_colors = []\n",
    "    node_colors = dict(initial_node_colors)\n",
    "    #Adding first node to the queue\n",
    "    frontier.append(Node(problem.initial))\n",
    "    node_colors[Node(problem.initial).state] = \"orange\"\n",
    "    iterations += 1\n",
    "    all_node_colors.append(dict(node_colors))\n",
    "        #Popping first node of queue\n",
    "        # modify the currently searching node to red\n",
    "        node_colors[node.state] = \"red\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "        \n",
    "        if problem.goal_test(node.state):\n",
    "            # modify goal node to green after reaching the goal\n",
    "            node_colors[node.state] = \"green\"\n",
    "            iterations += 1\n",
    "            all_node_colors.append(dict(node_colors))\n",
    "            return(iterations, all_node_colors, node)\n",
    "        frontier.extend(node.expand(problem))\n",
    "           \n",
    "        for n in node.expand(problem):\n",
    "            node_colors[n.state] = \"orange\"\n",
    "            iterations += 1\n",
    "            all_node_colors.append(dict(node_colors))\n",
    "        # modify the color of explored nodes to gray\n",
    "        node_colors[node.state] = \"gray\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "    return None\n",
    "\n",
    "def breadth_first_tree_search(problem):\n",
    "    \"Search the shallowest nodes in the search tree first.\"\n",
    "    iterations, all_node_colors, node = tree_search(problem, FIFOQueue())\n",
    "    return(iterations, all_node_colors, node)"
   "metadata": {
    "deletable": true,
    "editable": true
   },
    "Now, we use ipywidgets to display a slider, a button and our romania map. By sliding the slider we can have a look at all the intermediate steps of a particular search algorithm. By pressing the button **Visualize**, you can see all the steps without interacting with the slider. These two helper functions are the callback functions which are called when we interact with the slider and the button.\n",
   "execution_count": 14,
    "collapsed": false,
    "deletable": true,
    "editable": true
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Widget Javascript not detected.  It may not be installed or enabled properly.\n"
     ]
    },
    {
     "data": {},
     "metadata": {},
     "output_type": "display_data"
    "all_node_colors = []\n",
    "romania_problem = GraphProblem('Arad', 'Fagaras', romania_map)\n",
    "display_visual(user_input = False, algorithm = breadth_first_tree_search, problem = romania_problem)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Breadth first search\n",
    "\n",
    "Let's change all the node_colors to starting position and define a different problem statement."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def breadth_first_search(problem):\n",
    "    \"[Figure 3.11]\"\n",
    "    \n",
    "    # we use these two variables at the time of visualisations\n",
    "    iterations = 0\n",
    "    all_node_colors = []\n",
    "    node_colors = dict(initial_node_colors)\n",
    "    \n",
    "    node = Node(problem.initial)\n",
    "    \n",
    "    node_colors[node.state] = \"red\"\n",
    "    iterations += 1\n",
    "    all_node_colors.append(dict(node_colors))\n",
    "      \n",
    "    if problem.goal_test(node.state):\n",
    "        node_colors[node.state] = \"green\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "        return(iterations, all_node_colors, node)\n",
    "    \n",
    "    frontier = FIFOQueue()\n",
    "    frontier.append(node)\n",
    "    \n",
    "    # modify the color of frontier nodes to blue\n",
    "    node_colors[node.state] = \"orange\"\n",
    "    iterations += 1\n",
    "    all_node_colors.append(dict(node_colors))\n",
    "        \n",
    "    explored = set()\n",
    "    while frontier:\n",
    "        node = frontier.pop()\n",
    "        node_colors[node.state] = \"red\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "        \n",
    "        explored.add(node.state)     \n",
    "        \n",
    "        for child in node.expand(problem):\n",
    "            if child.state not in explored and child not in frontier:\n",
    "                if problem.goal_test(child.state):\n",
    "                    node_colors[child.state] = \"green\"\n",
    "                    iterations += 1\n",
    "                    all_node_colors.append(dict(node_colors))\n",
    "                    return(iterations, all_node_colors, child)\n",
    "                frontier.append(child)\n",
    "\n",
    "                node_colors[child.state] = \"orange\"\n",
    "                iterations += 1\n",
    "                all_node_colors.append(dict(node_colors))\n",
    "                    \n",
    "        node_colors[node.state] = \"gray\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "    return None"
   "execution_count": 16,
    "collapsed": false,
    "deletable": true,
    "editable": true
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Widget Javascript not detected.  It may not be installed or enabled properly.\n"
     ]
    },
    {
     "data": {},
     "metadata": {},
     "output_type": "display_data"
    "all_node_colors = []\n",
    "romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)\n",
    "display_visual(user_input = False, algorithm = breadth_first_search, problem = romania_problem)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Uniform cost search\n",
    "\n",
    "Let's change all the node_colors to starting position and define a different problem statement."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def best_first_graph_search(problem, f):\n",
    "    \"\"\"Search the nodes with the lowest f scores first.\n",
    "    You specify the function f(node) that you want to minimize; for example,\n",
    "    if f is a heuristic estimate to the goal, then we have greedy best\n",
    "    first search; if f is node.depth then we have breadth-first search.\n",
    "    There is a subtlety: the line \"f = memoize(f, 'f')\" means that the f\n",
    "    values will be cached on the nodes as they are computed. So after doing\n",
    "    a best first search you can examine the f values of the path returned.\"\"\"\n",
    "    \n",
    "    # we use these two variables at the time of visualisations\n",
    "    iterations = 0\n",
    "    all_node_colors = []\n",
    "    node_colors = dict(initial_node_colors)\n",
    "    \n",
    "    f = memoize(f, 'f')\n",
    "    node = Node(problem.initial)\n",
    "    \n",
    "    node_colors[node.state] = \"red\"\n",
    "    iterations += 1\n",
    "    all_node_colors.append(dict(node_colors))\n",
    "    \n",
    "    if problem.goal_test(node.state):\n",
    "        node_colors[node.state] = \"green\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "        return(iterations, all_node_colors, node)\n",
    "    \n",
    "    frontier = PriorityQueue(min, f)\n",
    "    frontier.append(node)\n",
    "    \n",
    "    node_colors[node.state] = \"orange\"\n",
    "    iterations += 1\n",
    "    all_node_colors.append(dict(node_colors))\n",
    "    \n",
    "    explored = set()\n",
    "    while frontier:\n",
    "        node = frontier.pop()\n",
    "        \n",
    "        node_colors[node.state] = \"red\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "        \n",
    "        if problem.goal_test(node.state):\n",
    "            node_colors[node.state] = \"green\"\n",
    "            iterations += 1\n",
    "            all_node_colors.append(dict(node_colors))\n",
    "            return(iterations, all_node_colors, node)\n",
    "        \n",
    "        explored.add(node.state)\n",
    "        for child in node.expand(problem):\n",
    "            if child.state not in explored and child not in frontier:\n",
    "                frontier.append(child)\n",
    "                node_colors[child.state] = \"orange\"\n",
    "                iterations += 1\n",
    "                all_node_colors.append(dict(node_colors))\n",
    "            elif child in frontier:\n",
    "                incumbent = frontier[child]\n",
    "                if f(child) < f(incumbent):\n",
    "                    del frontier[incumbent]\n",
    "                    frontier.append(child)\n",
    "                    node_colors[child.state] = \"orange\"\n",
    "                    iterations += 1\n",
    "                    all_node_colors.append(dict(node_colors))\n",
    "\n",
    "        node_colors[node.state] = \"gray\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "    return None\n",
    "\n",
    "def uniform_cost_search(problem):\n",
    "    \"[Figure 3.14]\"\n",
    "    iterations, all_node_colors, node = best_first_graph_search(problem, lambda node: node.path_cost)\n",
    "    return(iterations, all_node_colors, node)"
   "execution_count": 18,
    "collapsed": false,
    "deletable": true,
    "editable": true
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Widget Javascript not detected.  It may not be installed or enabled properly.\n"
     ]
    },
    {
     "data": {},
     "metadata": {},
     "output_type": "display_data"
    "all_node_colors = []\n",
    "romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)\n",
    "display_visual(user_input = False, algorithm = uniform_cost_search, problem = romania_problem)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
    "\n",
    "Let's change all the node_colors to starting position and define a different problem statement."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def best_first_graph_search(problem, f):\n",
    "    \"\"\"Search the nodes with the lowest f scores first.\n",
    "    You specify the function f(node) that you want to minimize; for example,\n",
    "    if f is a heuristic estimate to the goal, then we have greedy best\n",
    "    first search; if f is node.depth then we have breadth-first search.\n",
    "    There is a subtlety: the line \"f = memoize(f, 'f')\" means that the f\n",
    "    values will be cached on the nodes as they are computed. So after doing\n",
    "    a best first search you can examine the f values of the path returned.\"\"\"\n",
    "    \n",
    "    # we use these two variables at the time of visualisations\n",
    "    iterations = 0\n",
    "    all_node_colors = []\n",
    "    node_colors = dict(initial_node_colors)\n",
    "    \n",
    "    f = memoize(f, 'f')\n",
    "    node = Node(problem.initial)\n",
    "    \n",
    "    node_colors[node.state] = \"red\"\n",
    "    iterations += 1\n",
    "    all_node_colors.append(dict(node_colors))\n",
    "    \n",
    "    if problem.goal_test(node.state):\n",
    "        node_colors[node.state] = \"green\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "        return(iterations, all_node_colors, node)\n",
    "    \n",
    "    frontier = PriorityQueue(min, f)\n",
    "    frontier.append(node)\n",
    "    \n",
    "    node_colors[node.state] = \"orange\"\n",
    "    iterations += 1\n",
    "    all_node_colors.append(dict(node_colors))\n",
    "    \n",
    "    explored = set()\n",
    "    while frontier:\n",
    "        node = frontier.pop()\n",
    "        \n",
    "        node_colors[node.state] = \"red\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "        \n",
    "        if problem.goal_test(node.state):\n",
    "            node_colors[node.state] = \"green\"\n",
    "            iterations += 1\n",
    "            all_node_colors.append(dict(node_colors))\n",
    "            return(iterations, all_node_colors, node)\n",
    "        \n",
    "        explored.add(node.state)\n",
    "        for child in node.expand(problem):\n",
    "            if child.state not in explored and child not in frontier:\n",
    "                frontier.append(child)\n",
    "                node_colors[child.state] = \"orange\"\n",
    "                iterations += 1\n",
    "                all_node_colors.append(dict(node_colors))\n",
    "            elif child in frontier:\n",
    "                incumbent = frontier[child]\n",
    "                if f(child) < f(incumbent):\n",
    "                    del frontier[incumbent]\n",
    "                    frontier.append(child)\n",
    "                    node_colors[child.state] = \"orange\"\n",
    "                    iterations += 1\n",
    "                    all_node_colors.append(dict(node_colors))\n",
    "\n",
    "        node_colors[node.state] = \"gray\"\n",
    "        iterations += 1\n",
    "        all_node_colors.append(dict(node_colors))\n",
    "    return None\n",
    "\n",
    "def astar_search(problem, h=None):\n",
    "    \"\"\"A* search is best-first graph search with f(n) = g(n)+h(n).\n",
    "    You need to specify the h function when you call astar_search, or\n",
    "    else in your Problem subclass.\"\"\"\n",
    "    h = memoize(h or problem.h, 'h')\n",
    "    iterations, all_node_colors, node = best_first_graph_search(problem, lambda n: n.path_cost + h(n))\n",
    "    return(iterations, all_node_colors, node)"
   "execution_count": 20,
    "collapsed": false,
    "deletable": true,
    "editable": true
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Widget Javascript not detected.  It may not be installed or enabled properly.\n"
     ]
    },
    {
     "data": {},
     "metadata": {},
     "output_type": "display_data"
    "all_node_colors = []\n",
    "romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)\n",
    "display_visual(user_input = False, algorithm = astar_search, problem = romania_problem)"
   "execution_count": 21,
    "deletable": true,
    "editable": true,
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Widget Javascript not detected.  It may not be installed or enabled properly.\n"
     ]
    },
    {
     "data": {},
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "all_node_colors = []\n",
    "# display_visual(user_input = True, algorithm = breadth_first_tree_search)\n",
    "display_visual(user_input = True)"
1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "source": [
    "# Genetic Algorithm\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Genetic algorithms are\n",
    "\n",
    "- A method of search, often applied to optimization or learning.\n",
    "- Genetic algorithms are a part of evolutionary computing, they use an evolutionary analogy, “survival of the fittest”.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Search Space\n",
    "- If we are solving some problem, we are usually looking for some solution, which will be the best among others.\n",
    "- The space of all feasible solutions is called search space (also state space).\n",
    "- Each point in the search space represents one feasible solution.\n",
    "- Each feasible solution can be evaluated by its fitness value for the problem.\n",
    "- Usually we only know a few points from the search space and we are generating other points as the process of finding solution continues."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Methodology\n",
    "- In a genetic algorithm, a population of individual solutions is evolved toward better solutions.\n",
    "- Each individual solution has a set of properties (its chromosomes or genes) which mate and mutate.\n",
    "- The evolution usually starts from a population of randomly generated individuals, and is an iterative process, with the population in each iteration called a generation.\n",
    "- In each generation, the fitness of every individual in the population is evaluated.\n",
    "- The more fit individuals are stochastically selected from the current population, and each individual's gene is modified (recombined and possibly randomly mutated) to form a new generation.\n",
    "- The new generation of individual solutions is then used in the next iteration of the algorithm.\n",
    "- Commonly, the algorithm terminates when either a maximum number of generations has been produced, or a satisfactory fitness level has been reached."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "## Basic Genetic Operations\n",
    " ● Selection\n",
    " ● Mutation\n",
    " ● Crossover\n",
    " \n",
    " \n",
    " ### Selection\n",
    "- Individuals are selected from the population to crossover.\n",
    "- How do we select the individuals? Traditionally, parents are chosen to mate with probability proportional to their fitness.\n",
    "\n",
    "### Crossover\n",
    "- Operates on two individuals (parents).\n",
    "- Give rise to offsprings.\n",
    "- Crossover can occur at 1, 2 or many points.\n",
    "\n",
    "\n",
    "### Mutation\n",
    "- Operates on one individual.\n",
    "- Produces offspring with some changes.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Now let us try to implement GA.\n",
    "We will start with importing necessary packages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "from fuzzywuzzy import fuzz\n",
    "import random\n",
    "import string"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "source": [
    "Here we define a class GAState."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "Naming convention:\n",
    "Instead of gene or chromosome, the name individual has been used.\n",
    "What makes an individual unique from the set of individuals is\n",
    "the genes\\chromosomes. Thus, considering that individuals crossover and\n",
    "individuals mutate.\n",
    "\"\"\"\n",
    "\n",
    "\n",
    "class GAState:\n",
    "    def __init__(self, length):\n",
    "        self.string = ''.join(random.choice(string.ascii_letters)\n",
    "                              for _ in range(length))\n",
    "        self.fitness = -1\n",
    "\n",
    "    def __str__(self):\n",
    "        return 'Individual: ' + str(self.string) + ' fitness: ' \\\n",
    "               + str(self.fitness)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Here is the main logic of our GA. There are four major operations involved. Fitness check, selection, crossover and mutation.\n",
    "We assume the search to be complete if the fitness of an individual is greater than or equal to 90%. If the fitness criteria is not met and sufficient number of generations have passed, we return the fittest individual from the population."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def ga(in_str=None, population=20, generations=10000):\n",
    "    in_str_len = len(in_str)\n",
    "    individuals = init_individual(population, in_str_len)\n",
    "\n",
    "    for generation in range(generations):\n",
    "\n",
    "        print('Generation: ' + str(generation))\n",
    "\n",
    "        individuals = fitness(individuals, in_str)\n",
    "        individuals = selection(individuals)\n",
    "        individuals = crossover(individuals, population, in_str_len)\n",
    "\n",
    "        if any(individual.fitness >= 90 for individual in individuals):\n",
    "            \"\"\"\n",
    "            individuals[0] is the individual with the highest fitness,\n",
    "            because individuals is sorted in the selection function.\n",
    "            Thus we return the individual with the highest fitness value,\n",
    "            among the individuals whose fitness is equal to or greater\n",
    "            than 90%.\n",
    "            \"\"\"\n",
    "            print('Threshold met :)')\n",
    "            return individuals[0]\n",
    "\n",
    "        individuals = mutation(individuals, in_str_len)\n",
    "        print('fittest individual: ' + individuals[0].string)\n",
    "\n",
    "    \"\"\"\n",
    "    sufficient number of generations have passed and the individuals\n",
    "    could not evolve to match the desired fitness value.\n",
    "    thus we return the fittest individual among the individuals.\n",
    "    Since individuals are sorted according to their fitness\n",
    "    individuals[0] is the fittest.\n",
    "    \"\"\"\n",
    "    return individuals[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def init_individual(population, length):\n",
    "    return [GAState(length) for _ in range(population)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "source": [
    "### Fitness\n",
    "We will evaluate the fitness of the every individual, by comparing every individual in the list with the threshold."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def fitness(individuals, in_str):\n",
    "    for individual in individuals:\n",
    "        individual.fitness = fuzz.ratio(individual.string, in_str)\n",
    "\n",
    "    return individuals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "source": [
    "### Selection\n",
    "Now we will sort the individuals according to fitness and select the top 20% of the population\n",
    "\n",
    "To check the entire population of individuals in each generation in the final output, uncomment the print statement in the cell below. Note that it will create a large output."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def selection(individuals):\n",
    "    individuals = sorted(\n",
    "        individuals, key=lambda individual: individual.fitness, reverse=True)\n",
    "    # print('\\n'.join(map(str, individuals)))\n",
    "    individuals = individuals[:int(0.2 * len(individuals))]\n",
    "    return individuals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "### Crossover\n",
    "\n",
    "<img src=\"files/images/Crossover.png\">\n",
    "\n",
    "Here, we define our crossover function. Two individuals mate and give rise to two offsprings. The individuals that mate are among the top 20 percentile and are randomly chosen for mating. In this particular case we perform one point crossover.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def crossover(individuals, population, in_str_len):\n",
    "    offspring = []\n",
    "    for _ in range(int((population - len(individuals)) / 2)):\n",
    "        parent1 = random.choice(individuals)\n",
    "        parent2 = random.choice(individuals)\n",
    "        child1 = GAState(in_str_len)\n",
    "        child2 = GAState(in_str_len)\n",
    "        split = random.randint(0, in_str_len)\n",
    "        child1.string = parent1.string[0:split] + parent2.string[\n",
    "                                                  split:in_str_len]\n",
    "        child2.string = parent2.string[0:split] + parent1.string[\n",
    "                                                  split:in_str_len]\n",
    "        offspring.append(child1)\n",
    "        offspring.append(child2)\n",
    "\n",
    "    individuals.extend(offspring)\n",
    "    return individuals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "### Mutation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "We define the mutation function here. Consider each character to be the property of the string. If the string is an individual, each character is its gene. In mutation we alter some of the gene (property) of the individual (string). Not every individual has to undergo mutation. Here, in our example we have possibility of 10% that any individual will undergo mutation.\n",
    "\n",
    "<img src=\"files/images/mutation.png\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def mutation(individuals, in_str_len):\n",
    "    for individual in individuals:\n",
    "\n",
    "        for idx, param in enumerate(individual.string):\n",
    "            if random.uniform(0.0, 1.0) <= 0.1:\n",
    "                individual.string = individual.string[0:idx] \\\n",
    "                                    + random.choice(string.ascii_letters) \\\n",
    "                                    + individual.string[idx + 1:in_str_len]\n",
    "\n",
    "    return individuals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "### Calling GA\n",
    "Now check out the GA. Wait for 5 to 6 seconds for the program to produce the output."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "individual = ga('aima', 20, 10000)\n",
    "print(individual.string)\n",
    "print(individual.fitness)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "source": [
    "Execute the previous cell few times with the same arguments. Compare the different outputs, realise the uncertainty involved in the process (algorithm). Below is a comparative analysis of four executions of the program, producing different outputs (individuals) still converging to the same result. \n",
    "\n",
    "<img src=\"files/images/comparision.png\">\n",
    "\n",
    "Each case represents corresponding execution of the algorithm. Carefully observe the generation numbers for each case in which our desired result was found. Every time the result is displayed at the top because the list of individuals are sorted according to fitness level. Also observe the least fit individual for each run in final generation, there is difference in fitness value.\n",
    "\n",
    "\n",
    "Now change the string, modify the values in the program, try different arguments, observe how the strings (individuals) evolve with generations and converge to the desired result. Develop an intuition about GA. Play around with the code… More importantly have fun while learning… :)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "state": {
    "013d8df0a2ab4899b09f83aa70ce5d50": {
     "views": []
    },
    "01ee7dc2239c4b0095710436453b362d": {
     "views": []
    },
    "04d594ae6a704fc4b16895e6a7b85270": {
     "views": []
    },
    "052ea3e7259346a4b022ec4fef1fda28": {
     "views": [
      {
      }
     ]
    },
    "0ade4328785545c2b66d77e599a3e9da": {
     "views": [
      {
      }
     ]
    },
    "0b94d8de6b4e47f89b0382b60b775cbd": {
     "views": []
    },
    "0c63dcc0d11a451ead31a4c0c34d7b43": {
     "views": []
    },
    "0d91be53b6474cdeac3239fdffeab908": {
     "views": [
      {
      }
     ]
    },
    "0fe9c3b9b1264d4abd22aef40a9c1ab9": {
     "views": []
    },
    "10fd06131b05455d9f0a98072d7cebc6": {
     "views": []
    },
    "1193eaa60bb64cb790236d95bf11f358": {
     "views": [
      {
      }
     ]
    },
    "11b596cbf81a47aabccae723684ac3a5": {
     "views": []
    },
    "127ae5faa86f41f986c39afb320f2298": {
     "views": []
    },
    "16a9167ec7b4479e864b2a32e40825a1": {
     "views": [
      {
      }
     ]
    },
    "170e2e101180413f953a192a41ecbfcc": {
     "views": []
    },
    "181efcbccf89478792f0e38a25500e51": {
     "views": []
    },
    "1894a28092604d69b0d7d465a3b165b1": {
     "views": []
    },
    "1a56cc2ab5ae49ea8bf2a3f6ca2b1c36": {
     "views": []
    },
    "1cfd8f392548467696d8cd4fc534a6b4": {
     "views": []
    },
    "1e395e67fdec406f8698aa5922764510": {
     "views": []
    },
    "23509c6536404e96985220736d286183": {
     "views": []
    },
    "23bffaca1206421fb9ea589126e35438": {
     "views": []
    },
    "25330d0b799e4f02af5e510bc70494cf": {
     "views": []
    },
    "2ab8bf4795ac4240b70e1a94e14d1dd6": {
     "views": [
      {
      }
     ]
    },
    "2bd48f1234e4422aaedecc5815064181": {
     "views": []
    },
    "2d3a082066304c8ebf2d5003012596b4": {
     "views": []
    },
    "2dc962f16fd143c1851aaed0909f3963": {
     "views": [
      {
      }
     ]
    },
    "2f659054242a453da5ea0884de996008": {
     "views": []
    },
    "30a214881db545729c1b883878227e95": {
     "views": []
    },
    "3275b81616424947be98bf8fd3cd7b82": {
     "views": []
    },
    "330b52bc309d4b6a9b188fd9df621180": {
     "views": []
    },
    "3320648123f44125bcfda3b7c68febcf": {
     "views": []
    },
    "338e3b1562e747f197ab3ceae91e371f": {
     "views": []
    },
    "34658e2de2894f01b16cf89905760f14": {
     "views": [
      {
      }
     ]
    },
    "352f5fd9f698460ea372c6af57c5b478": {
     "views": []
    },
    "35dc16b828a74356b56cd01ff9ddfc09": {
     "views": []
    },
    "3805ce2994364bd1b259373d8798cc7a": {
     "views": []
    },
    "3d1f1f899cfe49aaba203288c61686ac": {
     "views": []
    },
    "3d7e943e19794e29b7058eb6bbe23c66": {
     "views": []
    },
    "3f6652b3f85740949b7711fbcaa509ba": {
     "views": []
    },
    "43e48664a76342c991caeeb2d5b17a49": {
     "views": [
      {
      }
     ]
    },
    "4662dec8595f45fb9ae061b2bdf44427": {
     "views": []
    },
    "47ae3d2269d94a95a567be21064eb98a": {
     "views": []
    },
    "49c49d665ba44746a1e1e9dc598bc411": {
     "views": [
      {
      }
     ]
    },
    "4a1c43b035f644699fd905d5155ad61f": {
     "views": [
      {
      }
     ]
    },
    "4eb88b6f6b4241f7b755f69b9e851872": {
     "views": []
    },
    "4fbb3861e50f41c688e9883da40334d4": {
     "views": []
    },
    "52d76de4ee8f4487b335a4a11726fbce": {
     "views": []
    },
    "53eccc8fc0ad461cb8277596b666f32a": {
     "views": [
      {
      }
     ]
    },
    "54d3a6067b594ad08907ce059d9f4a41": {
     "views": []
    },
    "612530d3edf8443786b3093ab612f88b": {
     "views": []
    },
    "613a133b6d1f45e0ac9c5c270bc408e0": {
     "views": []
    },
    "636caa7780614389a7f52ad89ea1c6e8": {
     "views": [
      {
      }
     ]
    },
    "63aa621196294629b884c896b6a034d8": {
     "views": []
    },
    "66d1d894cc7942c6a91f0630fc4321f9": {
     "views": []
    },
    "6775928a174b43ecbe12608772f1cb05": {
     "views": []
    },
    "6bce621c90d543bca50afbe0c489a191": {
     "views": []
    },
    "6ebbb8c7ec174c15a6ee79a3c5b36312": {
     "views": []
    },
    "743219b9d37e4f47a5f777bb41ad0a96": {
     "views": [
      {
      }
     ]
    },
    "774f464794cc409ca6d1106bcaac0cf1": {
     "views": []
    },
    "7ba3da40fb26490697fc64b3248c5952": {
     "views": []
    },
    "7e79fea4654f4bedb5969db265736c25": {
     "views": []
    },
    "85c82ed0844f4ae08a14fd750e55fc15": {
     "views": []
    },
    "86e8f92c1d584cdeb13b36af1b6ad695": {
     "views": [
      {
      }
     ]
    },
    "88485e72d2ec447ba7e238b0a6de2839": {
     "views": []
    },
    "892d7b895d3840f99504101062ba0f65": {
     "views": []
    },
    "89be4167713e488696a20b9b5ddac9bd": {
     "views": []
    },
    "8a24a07d166b45498b7d8b3f97c131eb": {
     "views": []
    },
    "8e7c7f3284ee45b38d95fe9070d5772f": {
     "views": []
    },
    "98985eefab414365991ed6844898677f": {
     "views": []
    },
    "98df98e5af87474d8b139cb5bcbc9792": {
     "views": []
    },
    "99f11243d387409bbad286dd5ecb1725": {
     "views": []
    },
    "9ab2d641b0be4cf8950be5ba72e5039f": {
     "views": []
    },
    "9b1ffbd1e7404cb4881380a99c7d11bc": {
     "views": []
    },
    "9c07ec6555cb4d0ba8b59007085d5692": {
     "views": []
    },
    "9cc80f47249b4609b98223ce71594a3d": {
     "views": []
    },
    "9d79bfd34d3640a3b7156a370d2aabae": {
     "views": []
    },
    "a015f138cbbe4a0cad4d72184762ed75": {
     "views": []
    },
    "a27d2f1eb3834c38baf1181b0de93176": {
     "views": []
    },
    "a29b90d050f3442a89895fc7615ccfee": {
     "views": [
      {
      }
     ]
    },
    "a725622cfc5b43b4ae14c74bc2ad7ad0": {
     "views": []
    },
    "ac2e05d7d7e945bf99862a2d9d1fa685": {
     "views": []
    },
    "b0bb2ca65caa47579a4d3adddd94504b": {
     "views": []
    },
    "b8995c40625d465489e1b7ec8014b678": {
     "views": []
    },
    "ba83da1373fe45d19b3c96a875f2f4fb": {
     "views": []
    },
    "baa0040d35c64604858c529418c22797": {
     "views": []
    },
    "badc9fd7b56346d6b6aea68bfa6d2699": {
     "views": [
      {
      }
     ]
    },
    "bdb41c7654e54c83a91452abc59141bd": {
     "views": []
    },
    "c2399056ef4a4aa7aa4e23a0f381d64a": {
     "views": [
      {
      }
     ]
    },
    "c73b47b242b4485fb1462abcd92dc7c9": {
     "views": []
    },
    "ce3f28a8aeee4be28362d068426a71f6": {
     "views": [
      {
      }
     ]
    },
    "d3067a6bb84544bba5f1abd241a72e55": {
     "views": []
    },
    "db13a2b94de34ce9bea721aaf971c049": {
     "views": []
    },
    "db468d80cb6e43b6b88455670b036618": {
     "views": []
    },
    "e2cb458522b4438ea3f9873b6e411acb": {
     "views": []
    },
    "e77dca31f1d94d4dadd3f95d2cdbf10e": {
     "views": []
    },
    "e7bffb1fed664dea90f749ea79dcc4f1": {
     "views": [
      {
      }
     ]
    },
    "e80abb145fce4e888072b969ba8f455a": {
     "views": []
    },
    "e839d0cf348c4c1b832fc1fc3b0bd3c9": {
     "views": []
    },
    "e948c6baadde46f69f105649555b84eb": {
     "views": []
    },
    "eb16e9da25bf4bef91a34b1d0565c774": {
     "views": []
    },
    "ec82b64048834eafa3e53733bb54a713": {
     "views": []
    },
    "edbb3a621c87445e9df4773cc60ec8d2": {
     "views": []
    },
    "ef6c99705936425a975e49b9e18ac267": {
     "views": []
    },
    "f1b494f025dd48d1ae58ae8e3e2ebf46": {
     "views": []
    },
    "f435b108c59c42989bf209a625a3a5b5": {
     "views": [
      {
      }
     ]
    },
    "f71ed7e15a314c28973943046c4529d6": {
     "views": []
    },
    "f81f726f001c4fb999851df532ed39f2": {
     "views": []
    }
   },
   "version": "1.1.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0