From c3118b791cdb356b4e1ef58f56cfcf3adf47d1a8 Mon Sep 17 00:00:00 2001 From: vfdev Date: Sun, 25 Dec 2016 17:18:45 +0100 Subject: [PATCH 1/5] Update search-4e.ipynb typo fix --- search-4e.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/search-4e.ipynb b/search-4e.ipynb index 100e0bcda..2531f1076 100644 --- a/search-4e.ipynb +++ b/search-4e.ipynb @@ -1186,7 +1186,7 @@ "source": [ "# Water Pouring Problem\n", "\n", - "Here is another problem domain, to show you how to define one. The idea is that we have a number of water jugs and a water tap and the goal is to measure out a specific amount of water (in, say, ounces or liters). You can completely fill or empty a jug, but because the jugs don't have markings on them, you can't partially fill them with a specific amount. You can, however, pour one jug into another, stopping when the seconfd is full or the first is empty." + "Here is another problem domain, to show you how to define one. The idea is that we have a number of water jugs and a water tap and the goal is to measure out a specific amount of water (in, say, ounces or liters). You can completely fill or empty a jug, but because the jugs don't have markings on them, you can't partially fill them with a specific amount. You can, however, pour one jug into another, stopping when the second is full or the first is empty." ] }, { From f13694b3995df74d39bfd32e16db17be0ce584a5 Mon Sep 17 00:00:00 2001 From: vfdev Date: Sun, 25 Dec 2016 17:25:34 +0100 Subject: [PATCH 2/5] typo fix --- search-4e.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/search-4e.ipynb b/search-4e.ipynb index 2531f1076..c863a6184 100644 --- a/search-4e.ipynb +++ b/search-4e.ipynb @@ -1326,7 +1326,7 @@ "outputs": [], "source": [ "def showpath(searcher, problem):\n", - " \"Show what happens when searcvher solves problem.\"\n", + " \"Show what happens when searcher solves problem.\"\n", " problem = Instrumented(problem)\n", " print('\\n{}:'.format(searcher.__name__))\n", " result = searcher(problem)\n", From a7cd66a9bdeb24062d46a25c4476cd83bb63283c Mon Sep 17 00:00:00 2001 From: vfdev Date: Mon, 26 Dec 2016 15:13:17 +0000 Subject: [PATCH 3/5] typo fixed --- rl.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rl.ipynb b/rl.ipynb index 103c32e9e..64f6bab01 100644 --- a/rl.ipynb +++ b/rl.ipynb @@ -402,7 +402,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now let us see the Q Values. The keys are state-action pairs. Where differnt actions correspond according to:\n", + "Now let us see the Q Values. The keys are state-action pairs. Where different actions correspond according to:\n", "\n", "north = (0, 1)\n", "south = (0,-1)\n", From 052abd4e5729fbb39b334b9e46b5663e0527480f Mon Sep 17 00:00:00 2001 From: vfdev-5 Date: Tue, 27 Dec 2016 01:24:08 +0100 Subject: [PATCH 4/5] * Add 8-puzzle Problem with 2 heuristic functions from the book. Compare A* search with uniform cost search --- search-4e.ipynb | 478 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 428 insertions(+), 50 deletions(-) diff --git a/search-4e.ipynb b/search-4e.ipynb index 100e0bcda..01ac01920 100644 --- a/search-4e.ipynb +++ b/search-4e.ipynb @@ -548,7 +548,7 @@ { "data": { "text/plain": [ - "['green', 'greed', 'treed', 'trees', 'treys', 'greys', 'grays', 'grass']" + "['green', 'greed', 'treed', 'trees', 'tress', 'cress', 'crass', 'grass']" ] }, "execution_count": 14, @@ -617,11 +617,11 @@ " 'flown',\n", " 'flows',\n", " 'slows',\n", - " 'stows',\n", - " 'stoas',\n", - " 'stoae',\n", - " 'stole',\n", - " 'stile',\n", + " 'slots',\n", + " 'slits',\n", + " 'spits',\n", + " 'spite',\n", + " 'smite',\n", " 'smile']" ] }, @@ -1554,7 +1554,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 90, "metadata": { "collapsed": false }, @@ -1563,33 +1563,33 @@ "data": { "text/plain": [ "{(0, 0): [(0, 1), (1, 0)],\n", - " (0, 1): [(0, 2), (0, 0), (1, 1)],\n", + " (0, 1): [(0, 2), (1, 1)],\n", " (0, 2): [(0, 3), (0, 1), (1, 2)],\n", " (0, 3): [(0, 4), (0, 2), (1, 3)],\n", " (0, 4): [(0, 3), (1, 4)],\n", - " (1, 0): [(1, 1), (2, 0), (0, 0)],\n", + " (1, 0): [(1, 1), (2, 0)],\n", " (1, 1): [(1, 2), (1, 0), (2, 1), (0, 1)],\n", " (1, 2): [(1, 3), (1, 1), (2, 2), (0, 2)],\n", " (1, 3): [(1, 4), (1, 2), (2, 3), (0, 3)],\n", " (1, 4): [(1, 3), (2, 4), (0, 4)],\n", " (2, 0): [(2, 1), (3, 0), (1, 0)],\n", " (2, 1): [(2, 2), (2, 0), (3, 1), (1, 1)],\n", - " (2, 2): [(2, 3), (2, 1), (3, 2), (1, 2)],\n", - " (2, 3): [(2, 4), (2, 2), (1, 3)],\n", - " (2, 4): [(2, 3), (1, 4)],\n", + " (2, 2): [(2, 3), (2, 1), (1, 2)],\n", + " (2, 3): [(2, 4), (2, 2), (3, 3), (1, 3)],\n", + " (2, 4): [(2, 3), (3, 4), (1, 4)],\n", " (3, 0): [(3, 1), (4, 0), (2, 0)],\n", - " (3, 1): [(3, 2), (3, 0), (4, 1), (2, 1)],\n", - " (3, 2): [(3, 1), (4, 2), (2, 2)],\n", - " (3, 3): [(3, 2), (4, 3), (2, 3)],\n", - " (3, 4): [(4, 4), (2, 4)],\n", + " (3, 1): [(3, 0), (4, 1), (2, 1)],\n", + " (3, 2): [(3, 3), (3, 1), (4, 2), (2, 2)],\n", + " (3, 3): [(3, 4), (4, 3), (2, 3)],\n", + " (3, 4): [(3, 3), (4, 4), (2, 4)],\n", " (4, 0): [(4, 1), (3, 0)],\n", " (4, 1): [(4, 2), (4, 0), (3, 1)],\n", - " (4, 2): [(4, 3), (4, 1), (3, 2)],\n", - " (4, 3): [(4, 4), (4, 2)],\n", - " (4, 4): [(4, 3)]}" + " (4, 2): [(4, 3), (4, 1)],\n", + " (4, 3): [(4, 4), (4, 2), (3, 3)],\n", + " (4, 4): [(4, 3), (3, 4)]}" ] }, - "execution_count": 40, + "execution_count": 90, "metadata": {}, "output_type": "execute_result" } @@ -1618,7 +1618,34 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 111, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def displayGrid(grid):\n", + " \"\"\"Display a grid\"\"\"\n", + " width, height = 0, 0\n", + " for cell in grid:\n", + " x, y = cell \n", + " width = max(width, x)\n", + " height = max(height, y)\n", + " print(''.join(['-']*(width+2)))\n", + " for y in range(height):\n", + " print(\"|\", end=\"\")\n", + " for x in range(width):\n", + " if len(grid[(x, y)]) == 0: \n", + " print(\"X\", end=\"\")\n", + " else:\n", + " print(\" \", end=\"\")\n", + " print(\"|\")\n", + " print(''.join(['-']*(width+2)))" + ] + }, + { + "cell_type": "code", + "execution_count": 113, "metadata": { "collapsed": true }, @@ -1637,7 +1664,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 118, "metadata": { "collapsed": false }, @@ -1646,15 +1673,342 @@ "name": "stdout", "output_type": "stream", "text": [ + "--------\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "| |\n", + "--------\n", "\n", "uniform_cost_search:\n", - "no solution after 132 results and 33 goal checks\n" + " (0, 0) ==(1, 0)==> (1, 0); cost 1 after 1 steps\n", + " (1, 0) ==(0, 1)==> (1, 1); cost 2 after 2 steps\n", + " (1, 1) ==(1, 0)==> (2, 1); cost 3 after 3 steps\n", + " (2, 1) ==(1, 0)==> (3, 1); cost 4 after 4 steps\n", + " (3, 1) ==(1, 0)==> (4, 1); cost 5 after 5 steps\n", + " (4, 1) ==(0, 1)==> (4, 2); cost 6 after 6 steps\n", + " (4, 2) ==(0, 1)==> (4, 3); cost 7 after 7 steps\n", + " (4, 3) ==(0, 1)==> (4, 4); cost 8 after 8 steps\n", + "GOAL FOUND after 340 results and 92 goal checks\n" ] } ], "source": [ - "gp = GridProblem(grid=Grid(5, 5, 0.3), initial=(0, 0), goals={(4, 4)})\n", - "showpath(uniform_cost_search, gp)\n" + "g = Grid(7, 7, 0.3)\n", + "displayGrid(g)\n", + "gp = GridProblem(grid=g, initial=(0, 0), goals={(4, 4)})\n", + "showpath(uniform_cost_search, gp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 8-puzzle Problem" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def display8Puzzle(puzzle):\n", + " \"\"\"Display 8-puzzle\"\"\"\n", + " width, height = 3, 3\n", + " print(''.join(['-']*(width+2)))\n", + " for y in range(height):\n", + " print(\"|\", end=\"\")\n", + " for x in range(width):\n", + " v = puzzle[y*width + x]\n", + " if v > 0: \n", + " print(v, end=\"\")\n", + " else:\n", + " print(\" \", end=\"\")\n", + " print(\"|\")\n", + " print(''.join(['-']*(width+2)))" + ] + }, + { + "cell_type": "code", + "execution_count": 274, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----\n", + "|2 5|\n", + "|178|\n", + "|463|\n", + "-----\n" + ] + } + ], + "source": [ + "puzzle = [2, 0, 5, 1, 7, 8, 4, 6, 3]\n", + "# puzzle = [1, 0, 2, 3, 4, 5, 6, 7, 8]\n", + "display8Puzzle(puzzle)" + ] + }, + { + "cell_type": "code", + "execution_count": 275, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class EightPuzzleProblem(Problem):\n", + " \"\"\" 8-puzzle problem is to order labeled 8 tiles randomly placed on a 3x3 grid. \"\"\"\n", + " def actions(self, state):\n", + " \"\"\"The actions executable in this state.\"\"\"\n", + " return DIRECTIONS\n", + "\n", + " def result(self, state, action):\n", + " \"\"\"The state that results from executing this action in this state.\"\"\"\n", + " zero_index = state.index(0) \n", + " (x, y) = zero_index % 3, int(zero_index / 3) \n", + " (dx, dy) = action \n", + " r = (min(max(x + dx, 0), 2), min(max(y + dy, 0), 2))\n", + " if r != state:\n", + " new_zero_index = r[0] + r[1] * 3\n", + " new_state = list(state)\n", + " new_state[zero_index] = new_state[new_zero_index]\n", + " new_state[new_zero_index] = 0\n", + " return tuple(new_state)\n", + " \n", + " def is_goal(self, state):\n", + " \"\"\"True if puzzle state is correctly ordered.\"\"\"\n", + " return state == self.goal " + ] + }, + { + "cell_type": "code", + "execution_count": 276, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def puzzle_h1(state, goal):\n", + " \"\"\" Heuristic function that counts the number of tiles that are in the wrong position.\"\"\"\n", + " h = -1 # Do not count the empty cell\n", + " for s, g in zip(state, goal):\n", + " if s != g:\n", + " h += 1 \n", + " return h\n", + "\n", + "def puzzle_h2(state, goal):\n", + " \"\"\" Heuristic function is the sum of the 'Manhattan' distances of the tiles from their goal positions.\"\"\"\n", + " d = 0\n", + " for i, s in enumerate(state):\n", + " xs, ys = i % 3, int(i / 3) \n", + " j = goal.index(s)\n", + " x, y = j % 3, int(j / 3) \n", + " d += abs(xs - x) + abs(ys - y) \n", + " return d" + ] + }, + { + "cell_type": "code", + "execution_count": 277, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "puzzle_goal = tuple(range(9))\n", + "puzzle_problem = EightPuzzleProblem(initial=tuple(puzzle), goal=puzzle_goal)" + ] + }, + { + "cell_type": "code", + "execution_count": 278, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "puzzle_h1_fn = lambda s: puzzle_h1(s, puzzle_goal)\n", + "puzzle_h2_fn = lambda s: puzzle_h2(s, puzzle_goal)\n", + "puzzle_h3_fn = lambda s: max(puzzle_h1(s, puzzle_goal), puzzle_h2(s, puzzle_goal))\n", + "\n", + "def puzzle_astar_search_1(p):\n", + " return astar_search(p, puzzle_h1_fn)\n", + "\n", + "def puzzle_astar_search_2(p):\n", + " return astar_search(p, puzzle_h2_fn)\n", + "\n", + "def puzzle_astar_search_3(p):\n", + " return astar_search(p, puzzle_h3_fn)" + ] + }, + { + "cell_type": "code", + "execution_count": 279, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "puzzle_astar_search_1:\n", + " (2, 0, 5, 1, 7, 8, 4, 6, 3) ==(-1, 0)==> (0, 2, 5, 1, 7, 8, 4, 6, 3); cost 1 after 1 steps\n", + " (0, 2, 5, 1, 7, 8, 4, 6, 3) ==(0, 1)==> (1, 2, 5, 0, 7, 8, 4, 6, 3); cost 2 after 2 steps\n", + " (1, 2, 5, 0, 7, 8, 4, 6, 3) ==(0, 1)==> (1, 2, 5, 4, 7, 8, 0, 6, 3); cost 3 after 3 steps\n", + " (1, 2, 5, 4, 7, 8, 0, 6, 3) ==(1, 0)==> (1, 2, 5, 4, 7, 8, 6, 0, 3); cost 4 after 4 steps\n", + " (1, 2, 5, 4, 7, 8, 6, 0, 3) ==(0, -1)==> (1, 2, 5, 4, 0, 8, 6, 7, 3); cost 5 after 5 steps\n", + " (1, 2, 5, 4, 0, 8, 6, 7, 3) ==(-1, 0)==> (1, 2, 5, 0, 4, 8, 6, 7, 3); cost 6 after 6 steps\n", + " (1, 2, 5, 0, 4, 8, 6, 7, 3) ==(0, 1)==> (1, 2, 5, 6, 4, 8, 0, 7, 3); cost 7 after 7 steps\n", + " (1, 2, 5, 6, 4, 8, 0, 7, 3) ==(1, 0)==> (1, 2, 5, 6, 4, 8, 7, 0, 3); cost 8 after 8 steps\n", + " (1, 2, 5, 6, 4, 8, 7, 0, 3) ==(1, 0)==> (1, 2, 5, 6, 4, 8, 7, 3, 0); cost 9 after 9 steps\n", + " (1, 2, 5, 6, 4, 8, 7, 3, 0) ==(0, -1)==> (1, 2, 5, 6, 4, 0, 7, 3, 8); cost 10 after 10 steps\n", + " (1, 2, 5, 6, 4, 0, 7, 3, 8) ==(-1, 0)==> (1, 2, 5, 6, 0, 4, 7, 3, 8); cost 11 after 11 steps\n", + " (1, 2, 5, 6, 0, 4, 7, 3, 8) ==(0, 1)==> (1, 2, 5, 6, 3, 4, 7, 0, 8); cost 12 after 12 steps\n", + " (1, 2, 5, 6, 3, 4, 7, 0, 8) ==(-1, 0)==> (1, 2, 5, 6, 3, 4, 0, 7, 8); cost 13 after 13 steps\n", + " (1, 2, 5, 6, 3, 4, 0, 7, 8) ==(0, -1)==> (1, 2, 5, 0, 3, 4, 6, 7, 8); cost 14 after 14 steps\n", + " (1, 2, 5, 0, 3, 4, 6, 7, 8) ==(1, 0)==> (1, 2, 5, 3, 0, 4, 6, 7, 8); cost 15 after 15 steps\n", + " (1, 2, 5, 3, 0, 4, 6, 7, 8) ==(1, 0)==> (1, 2, 5, 3, 4, 0, 6, 7, 8); cost 16 after 16 steps\n", + " (1, 2, 5, 3, 4, 0, 6, 7, 8) ==(0, -1)==> (1, 2, 0, 3, 4, 5, 6, 7, 8); cost 17 after 17 steps\n", + " (1, 2, 0, 3, 4, 5, 6, 7, 8) ==(-1, 0)==> (1, 0, 2, 3, 4, 5, 6, 7, 8); cost 18 after 18 steps\n", + " (1, 0, 2, 3, 4, 5, 6, 7, 8) ==(-1, 0)==> (0, 1, 2, 3, 4, 5, 6, 7, 8); cost 19 after 19 steps\n", + "GOAL FOUND after 11435 results and 2874 goal checks\n" + ] + } + ], + "source": [ + "showpath(puzzle_astar_search_1, puzzle_problem)" + ] + }, + { + "cell_type": "code", + "execution_count": 264, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "puzzle_astar_search_2:\n", + " (2, 0, 5, 1, 7, 8, 4, 6, 3) ==(-1, 0)==> (0, 2, 5, 1, 7, 8, 4, 6, 3); cost 1 after 1 steps\n", + " (0, 2, 5, 1, 7, 8, 4, 6, 3) ==(0, 1)==> (1, 2, 5, 0, 7, 8, 4, 6, 3); cost 2 after 2 steps\n", + " (1, 2, 5, 0, 7, 8, 4, 6, 3) ==(1, 0)==> (1, 2, 5, 7, 0, 8, 4, 6, 3); cost 3 after 3 steps\n", + " (1, 2, 5, 7, 0, 8, 4, 6, 3) ==(0, 1)==> (1, 2, 5, 7, 6, 8, 4, 0, 3); cost 4 after 4 steps\n", + " (1, 2, 5, 7, 6, 8, 4, 0, 3) ==(-1, 0)==> (1, 2, 5, 7, 6, 8, 0, 4, 3); cost 5 after 5 steps\n", + " (1, 2, 5, 7, 6, 8, 0, 4, 3) ==(0, -1)==> (1, 2, 5, 0, 6, 8, 7, 4, 3); cost 6 after 6 steps\n", + " (1, 2, 5, 0, 6, 8, 7, 4, 3) ==(1, 0)==> (1, 2, 5, 6, 0, 8, 7, 4, 3); cost 7 after 7 steps\n", + " (1, 2, 5, 6, 0, 8, 7, 4, 3) ==(0, 1)==> (1, 2, 5, 6, 4, 8, 7, 0, 3); cost 8 after 8 steps\n", + " (1, 2, 5, 6, 4, 8, 7, 0, 3) ==(1, 0)==> (1, 2, 5, 6, 4, 8, 7, 3, 0); cost 9 after 9 steps\n", + " (1, 2, 5, 6, 4, 8, 7, 3, 0) ==(0, -1)==> (1, 2, 5, 6, 4, 0, 7, 3, 8); cost 10 after 10 steps\n", + " (1, 2, 5, 6, 4, 0, 7, 3, 8) ==(0, -1)==> (1, 2, 0, 6, 4, 5, 7, 3, 8); cost 11 after 11 steps\n", + " (1, 2, 0, 6, 4, 5, 7, 3, 8) ==(-1, 0)==> (1, 0, 2, 6, 4, 5, 7, 3, 8); cost 12 after 12 steps\n", + " (1, 0, 2, 6, 4, 5, 7, 3, 8) ==(0, 1)==> (1, 4, 2, 6, 0, 5, 7, 3, 8); cost 13 after 13 steps\n", + " (1, 4, 2, 6, 0, 5, 7, 3, 8) ==(0, 1)==> (1, 4, 2, 6, 3, 5, 7, 0, 8); cost 14 after 14 steps\n", + " (1, 4, 2, 6, 3, 5, 7, 0, 8) ==(-1, 0)==> (1, 4, 2, 6, 3, 5, 0, 7, 8); cost 15 after 15 steps\n", + " (1, 4, 2, 6, 3, 5, 0, 7, 8) ==(0, -1)==> (1, 4, 2, 0, 3, 5, 6, 7, 8); cost 16 after 16 steps\n", + " (1, 4, 2, 0, 3, 5, 6, 7, 8) ==(1, 0)==> (1, 4, 2, 3, 0, 5, 6, 7, 8); cost 17 after 17 steps\n", + " (1, 4, 2, 3, 0, 5, 6, 7, 8) ==(0, -1)==> (1, 0, 2, 3, 4, 5, 6, 7, 8); cost 18 after 18 steps\n", + " (1, 0, 2, 3, 4, 5, 6, 7, 8) ==(-1, 0)==> (0, 1, 2, 3, 4, 5, 6, 7, 8); cost 19 after 19 steps\n", + "GOAL FOUND after 1783 results and 461 goal checks\n" + ] + } + ], + "source": [ + "showpath(puzzle_astar_search_2, puzzle_problem)" + ] + }, + { + "cell_type": "code", + "execution_count": 265, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "puzzle_astar_search_3:\n", + " (2, 0, 5, 1, 7, 8, 4, 6, 3) ==(-1, 0)==> (0, 2, 5, 1, 7, 8, 4, 6, 3); cost 1 after 1 steps\n", + " (0, 2, 5, 1, 7, 8, 4, 6, 3) ==(0, 1)==> (1, 2, 5, 0, 7, 8, 4, 6, 3); cost 2 after 2 steps\n", + " (1, 2, 5, 0, 7, 8, 4, 6, 3) ==(1, 0)==> (1, 2, 5, 7, 0, 8, 4, 6, 3); cost 3 after 3 steps\n", + " (1, 2, 5, 7, 0, 8, 4, 6, 3) ==(0, 1)==> (1, 2, 5, 7, 6, 8, 4, 0, 3); cost 4 after 4 steps\n", + " (1, 2, 5, 7, 6, 8, 4, 0, 3) ==(-1, 0)==> (1, 2, 5, 7, 6, 8, 0, 4, 3); cost 5 after 5 steps\n", + " (1, 2, 5, 7, 6, 8, 0, 4, 3) ==(0, -1)==> (1, 2, 5, 0, 6, 8, 7, 4, 3); cost 6 after 6 steps\n", + " (1, 2, 5, 0, 6, 8, 7, 4, 3) ==(1, 0)==> (1, 2, 5, 6, 0, 8, 7, 4, 3); cost 7 after 7 steps\n", + " (1, 2, 5, 6, 0, 8, 7, 4, 3) ==(0, 1)==> (1, 2, 5, 6, 4, 8, 7, 0, 3); cost 8 after 8 steps\n", + " (1, 2, 5, 6, 4, 8, 7, 0, 3) ==(1, 0)==> (1, 2, 5, 6, 4, 8, 7, 3, 0); cost 9 after 9 steps\n", + " (1, 2, 5, 6, 4, 8, 7, 3, 0) ==(0, -1)==> (1, 2, 5, 6, 4, 0, 7, 3, 8); cost 10 after 10 steps\n", + " (1, 2, 5, 6, 4, 0, 7, 3, 8) ==(0, -1)==> (1, 2, 0, 6, 4, 5, 7, 3, 8); cost 11 after 11 steps\n", + " (1, 2, 0, 6, 4, 5, 7, 3, 8) ==(-1, 0)==> (1, 0, 2, 6, 4, 5, 7, 3, 8); cost 12 after 12 steps\n", + " (1, 0, 2, 6, 4, 5, 7, 3, 8) ==(0, 1)==> (1, 4, 2, 6, 0, 5, 7, 3, 8); cost 13 after 13 steps\n", + " (1, 4, 2, 6, 0, 5, 7, 3, 8) ==(0, 1)==> (1, 4, 2, 6, 3, 5, 7, 0, 8); cost 14 after 14 steps\n", + " (1, 4, 2, 6, 3, 5, 7, 0, 8) ==(-1, 0)==> (1, 4, 2, 6, 3, 5, 0, 7, 8); cost 15 after 15 steps\n", + " (1, 4, 2, 6, 3, 5, 0, 7, 8) ==(0, -1)==> (1, 4, 2, 0, 3, 5, 6, 7, 8); cost 16 after 16 steps\n", + " (1, 4, 2, 0, 3, 5, 6, 7, 8) ==(1, 0)==> (1, 4, 2, 3, 0, 5, 6, 7, 8); cost 17 after 17 steps\n", + " (1, 4, 2, 3, 0, 5, 6, 7, 8) ==(0, -1)==> (1, 0, 2, 3, 4, 5, 6, 7, 8); cost 18 after 18 steps\n", + " (1, 0, 2, 3, 4, 5, 6, 7, 8) ==(-1, 0)==> (0, 1, 2, 3, 4, 5, 6, 7, 8); cost 19 after 19 steps\n", + "GOAL FOUND after 1783 results and 461 goal checks\n" + ] + } + ], + "source": [ + "showpath(puzzle_astar_search_3, puzzle_problem)" + ] + }, + { + "cell_type": "code", + "execution_count": 257, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "uniform_cost_search:\n", + " (2, 0, 5, 1, 7, 8, 4, 6, 3) ==(-1, 0)==> (0, 2, 5, 1, 7, 8, 4, 6, 3); cost 1 after 1 steps\n", + " (0, 2, 5, 1, 7, 8, 4, 6, 3) ==(0, 1)==> (1, 2, 5, 0, 7, 8, 4, 6, 3); cost 2 after 2 steps\n", + " (1, 2, 5, 0, 7, 8, 4, 6, 3) ==(0, 1)==> (1, 2, 5, 4, 7, 8, 0, 6, 3); cost 3 after 3 steps\n", + " (1, 2, 5, 4, 7, 8, 0, 6, 3) ==(1, 0)==> (1, 2, 5, 4, 7, 8, 6, 0, 3); cost 4 after 4 steps\n", + " (1, 2, 5, 4, 7, 8, 6, 0, 3) ==(0, -1)==> (1, 2, 5, 4, 0, 8, 6, 7, 3); cost 5 after 5 steps\n", + " (1, 2, 5, 4, 0, 8, 6, 7, 3) ==(-1, 0)==> (1, 2, 5, 0, 4, 8, 6, 7, 3); cost 6 after 6 steps\n", + " (1, 2, 5, 0, 4, 8, 6, 7, 3) ==(0, 1)==> (1, 2, 5, 6, 4, 8, 0, 7, 3); cost 7 after 7 steps\n", + " (1, 2, 5, 6, 4, 8, 0, 7, 3) ==(1, 0)==> (1, 2, 5, 6, 4, 8, 7, 0, 3); cost 8 after 8 steps\n", + " (1, 2, 5, 6, 4, 8, 7, 0, 3) ==(1, 0)==> (1, 2, 5, 6, 4, 8, 7, 3, 0); cost 9 after 9 steps\n", + " (1, 2, 5, 6, 4, 8, 7, 3, 0) ==(0, -1)==> (1, 2, 5, 6, 4, 0, 7, 3, 8); cost 10 after 10 steps\n", + " (1, 2, 5, 6, 4, 0, 7, 3, 8) ==(0, -1)==> (1, 2, 0, 6, 4, 5, 7, 3, 8); cost 11 after 11 steps\n", + " (1, 2, 0, 6, 4, 5, 7, 3, 8) ==(-1, 0)==> (1, 0, 2, 6, 4, 5, 7, 3, 8); cost 12 after 12 steps\n", + " (1, 0, 2, 6, 4, 5, 7, 3, 8) ==(0, 1)==> (1, 4, 2, 6, 0, 5, 7, 3, 8); cost 13 after 13 steps\n", + " (1, 4, 2, 6, 0, 5, 7, 3, 8) ==(0, 1)==> (1, 4, 2, 6, 3, 5, 7, 0, 8); cost 14 after 14 steps\n", + " (1, 4, 2, 6, 3, 5, 7, 0, 8) ==(-1, 0)==> (1, 4, 2, 6, 3, 5, 0, 7, 8); cost 15 after 15 steps\n", + " (1, 4, 2, 6, 3, 5, 0, 7, 8) ==(0, -1)==> (1, 4, 2, 0, 3, 5, 6, 7, 8); cost 16 after 16 steps\n", + " (1, 4, 2, 0, 3, 5, 6, 7, 8) ==(1, 0)==> (1, 4, 2, 3, 0, 5, 6, 7, 8); cost 17 after 17 steps\n", + " (1, 4, 2, 3, 0, 5, 6, 7, 8) ==(0, -1)==> (1, 0, 2, 3, 4, 5, 6, 7, 8); cost 18 after 18 steps\n", + " (1, 0, 2, 3, 4, 5, 6, 7, 8) ==(-1, 0)==> (0, 1, 2, 3, 4, 5, 6, 7, 8); cost 19 after 19 steps\n", + "GOAL FOUND after 178419 results and 44620 goal checks\n" + ] + } + ], + "source": [ + "showpath(uniform_cost_search, puzzle_problem)" ] }, { @@ -1675,7 +2029,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 98, "metadata": { "button": false, "collapsed": false, @@ -1695,7 +2049,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 99, "metadata": { "button": false, "collapsed": false, @@ -1712,7 +2066,7 @@ "3" ] }, - "execution_count": 44, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" } @@ -1723,7 +2077,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 100, "metadata": { "collapsed": false }, @@ -1734,7 +2088,7 @@ "[('Pour', 0, 1), ('Fill', 0), ('Pour', 0, 1)]" ] }, - "execution_count": 45, + "execution_count": 100, "metadata": {}, "output_type": "execute_result" } @@ -1745,7 +2099,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 101, "metadata": { "button": false, "collapsed": false, @@ -1762,7 +2116,7 @@ "((0, 0), (7, 9), {8})" ] }, - "execution_count": 46, + "execution_count": 101, "metadata": {}, "output_type": "execute_result" } @@ -1781,7 +2135,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 102, "metadata": { "collapsed": false }, @@ -1816,7 +2170,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 103, "metadata": { "button": false, "collapsed": false, @@ -1857,7 +2211,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 104, "metadata": { "button": false, "collapsed": true, @@ -1886,7 +2240,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 105, "metadata": { "button": false, "collapsed": false, @@ -1932,7 +2286,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 106, "metadata": { "button": false, "collapsed": false, @@ -1949,7 +2303,7 @@ "'test_frontier ok'" ] }, - "execution_count": 51, + "execution_count": 106, "metadata": {}, "output_type": "execute_result" } @@ -2012,7 +2366,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 108, "metadata": { "button": false, "collapsed": false, @@ -2023,11 +2377,21 @@ } }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.5/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", + " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n", + "/usr/local/lib/python3.5/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", + " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n" + ] + }, { "data": { - "image/png": "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\n9r8varwUoYrZVQAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2044,7 +2408,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 109, "metadata": { "button": false, "collapsed": false, @@ -2057,9 +2421,9 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe8AAAHaCAYAAAApPsHTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt209MVPe///HXmT+JDhg7OjAEBIGIGbBYDBLSUha6ICwq\n1IgpzdXvzVfytRujDUlj2t5v6aQ3JN2QUN3YtIsmpbXFaSSmCZpYFrYbF99qid4QSUACDWMwRhmm\niQNnfoveO8nU2u/8gGH4HJ6P3ZlzTny//HzOvGYQrWQyKQAAYA5XrgcAAAD/fyhvAAAMQ3kDAGAY\nyhsAAMNQ3gAAGMaT6wEy9eGHH85alhXM9RzZkkwmbcuyHPthysn53G63vbS05MhskrPXTiKf6Zz8\n/Hk8nuj7779f9Kfn1nqY5bIsKxiNRnM9RtYEg0EX+cwUDAZdPT09uR4ja8LhsGPXTnL23pQ2Rj6n\nPn/hcPi5X1gd+WkFAAAno7wBADAM5Q0AgGEobwAADEN5AwBgGMobAADDUN4AABiG8gYAwDCUNwAA\nhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShv\nAAAMQ3kDAGAYyhsAAMN4cj3AWpuamtJPP/2kZDKp6upq7du3L+38o0ePNDIyorm5OTU2Nuqll16S\nJMViMV2/fl2//fabLMtSdXW19u7dm4sIf4l8ZucbHh7W22+/Ldu21dXVpbNnz6adHxsb09///nf9\n61//Um9vr7q7uyVJ09PT+tvf/qZoNCqXy6V//OMfOn36dC4iPJfT1458Zucz7dnbUOWdTCZ148YN\ntbW1yefzKRKJqLy8XH6/P3XNpk2b1NzcrImJibR7XS6XmpqaFAgElEgkNDg4qNLS0rR7c418Zuez\nbVunTp3S9evXVVxcrIaGBrW3tysUCqWu2b59u86dO6fLly+n3evxeNTX16e6ujrFYjHV19erpaUl\n7d5ccvrakc/sfCY+exvqx+bRaFRbt27Vli1b5Ha7tWvXLk1OTqZds3nzZhUUFMiyrLTXfT6fAoGA\nJMnr9crv92thYWGtRs8I+czOd/PmTVVVVWnnzp3yer3q7OzU0NBQ2jWBQED19fXyeNI/dxcVFamu\nrk6SlJ+fr+rqas3MzKzZ7P+O09eOfGbnM/HZ21DlvbCwoPz8/NRxfn7+sjbRkydP9PDhQwWDwdUc\nb8XIl5n1mm9mZkalpaWp4x07dizrTWByclK3bt1SY2Pjao63Ik5fO/JlZr3mM/HZ21DlvRoSiYSu\nXbumpqYmeb3eXI+z6shntlgspo6ODvX396e92TqB09eOfGZb62dvQ5V3Xl6eYrFY6jgWiykvLy/j\n+23b1tWrV7V7925VVFRkY8QVId9fW+/5SkpKNDU1lTqenp5WSUlJxvcvLi6qo6NDx48fV3t7ezZG\nXDanrx35/tp6z2fis7ehyruwsFCPHz/W/Py8lpaWND4+rvLy8uden0wm045HRkbk9/vX5W9KSuT7\nI9PyNTQ0aHx8XPfv39fTp0918eJFtbW1Pff6P+Y7ceKEampqdObMmWyP+v/N6WtHvnSm5TPx2dtQ\nv23ucrnU3NysK1euSJJCoZD8fr/u3Lkjy7JUU1OjeDyuS5cuKZFIyLIsjY6OqrOzU3Nzc7p37562\nbdumwcFBSVJjY6PKyspyGSkN+czO53a7df78ebW0tKT+u0p1dbUuXLggy7J08uRJRaNR7d+/X/Pz\n83K5XOrv79fdu3d1+/ZtDQwMqLa2Vvv27ZNlWert7VVra2uuY0ly/tqRz+x8Jj571h8/QaxX4XA4\nGY1Gcz1G1gSDQZHPTMFgUD09PbkeI2vC4bBj105y9t6UNkY+pz5/4XBYPT091p+d21A/NgcAwAko\nbwAADEN5AwBgGMobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAA\nw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3\nAACGsZLJZK5nyMh///d/Ly0tLTn2w4bL5ZJt27keI2ucnM/J2STJ4/FocXEx12NkjdPXL5lMyrKs\nXI+RNW63W0tLS7keIys8Ho/9/vvvu//03FoPs1xLS0uunp6eXI+RNeFwWEeOHMn1GFkTiUQcm8/J\n2aTf8/HsmSsSiSgajeZ6jKwJBoOO3Z/hcPi5X1gd+00WAACnorwBADAM5Q0AgGEobwAADEN5AwBg\nGMobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIG\nAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNsuPIeHh5WKBTS7t279fHHHz9zfmxs\nTK+88oo2bdqkvr6+1OvT09M6ePCg9uzZo9raWn3yySdrOXbGfvzxRx06dEivvfaaPv/882fOT0xM\n6NixY6qvr9cXX3yRen12dlZdXV16/fXXdfjwYQ0MDKzl2Bkjn7n5ePbMXTtJmpqa0tdff62vvvpK\nP//88zPnHz16pO+++06ffvqpbt++nXo9FotpaGhIFy9e1DfffKNffvllLcfOmGn707Mmf8o6Ydu2\nTp06pevXr6u4uFgNDQ1qb29XKBRKXbN9+3adO3dOly9fTrvX4/Gor69PdXV1isViqq+vV0tLS9q9\nuWbbtnp7e/XZZ5+poKBAb775pg4cOKDKysrUNS+88ILeffdd/fDDD2n3ejwevfPOOwqFQorH43rj\njTf08ssvp92ba+QzNx/PnrlrJ0nJZFI3btxQW1ubfD6fIpGIysvL5ff7U9ds2rRJzc3NmpiYSLvX\n5XKpqalJgUBAiURCg4ODKi0tTbs310zcnxvqm/fNmzdVVVWlnTt3yuv1qrOzU0NDQ2nXBAIB1dfX\ny+NJ/1xTVFSkuro6SVJ+fr6qq6s1MzOzZrNnYnR0VGVlZSouLpbX61Vra6tGRkbSrvH7/dqzZ88z\n+QKBQGqz+Xw+VVRU6MGDB2s2eybIZ24+nj1z106SotGotm7dqi1btsjtdmvXrl2anJxMu2bz5s0q\nKCiQZVlpr/t8PgUCAUmS1+uV3+/XwsLCWo2eERP354Yq75mZGZWWlqaOd+zYsay/5MnJSd26dUuN\njY2rOd6KPXjwQEVFRanjYDC4rDeBmZkZjY2Nae/evas53oqRLzPrMR/PXmbW49pJ0sLCgvLz81PH\n+fn5yyrgJ0+e6OHDhwoGg6s53oqZuD83VHmvhlgspo6ODvX396dtZqeIx+Pq7u7W2bNn5fP5cj3O\nqiOfuXj2zJZIJHTt2jU1NTXJ6/XmepxVt9b7c0OVd0lJiaamplLH09PTKikpyfj+xcVFdXR06Pjx\n42pvb8/GiCtSWFio2dnZ1HE0GlVhYWHG9y8uLqq7u1uHDh3SwYMHszHiipDvr63nfDx7f209r50k\n5eXlKRaLpY5jsZjy8vIyvt+2bV29elW7d+9WRUVFNkZcERP354Yq74aGBo2Pj+v+/ft6+vSpLl68\nqLa2tuden0wm045PnDihmpoanTlzJtujLsuLL76oqakp/frrr0okEhoeHtaBAwcyvv+DDz5QZWWl\njh07lsUpl498f2095+PZ+2vree2k3z+cPH78WPPz81paWtL4+LjKy8ufe/0f129kZER+v3/d/XPA\n/zFxf26o3zZ3u906f/68WlpaZNu2urq6VF1drQsXLsiyLJ08eVLRaFT79+/X/Py8XC6X+vv7dffu\nXd2+fVsDAwOqra3Vvn37ZFmWent71dramutYKW63W++9957eeust2batw4cPq7KyUt9++60sy9LR\no0c1Nzenzs5OxeNxWZalL7/8UkNDQxobG9P333+vqqoqHT16VJZl6fTp03r11VdzHSuFfObm49kz\nd+2k339jvLm5WVeuXJEkhUIh+f1+3blzR5ZlqaamRvF4XJcuXVIikZBlWRodHVVnZ6fm5uZ07949\nbdu2TYODg5KkxsZGlZWV5TJSGhP3p/XHTxDrVTgcTvb09OR6jKwJh8M6cuRIrsfImkgk4th8Ts4m\n/Z6PZ89ckUhE0Wg012NkTTAYdOz+DIfD6unpsf7s3Ib6sTkAAE5AeQMAYBjKGwAAw1DeAAAYhvIG\nAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM\n5Q0AgGEobwAADEN5AwBgGMobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAwjJVMJnM9Q0Y++uijJdu2\nHfthw+PxaHFxMddjZI2T8zk5m0Q+05HPXB6Px37//ffdf3purYdZLtu2XUeOHMn1GFkTiUTU09OT\n6zGyJhwOOzafk7NJ5DMd+cwVDoef+4XVsd9kAQBwKsobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAw\nDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kD\nAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADDMhivvH3/8UYcOHdJrr72mzz///JnzExMTOnbs\nmOrr6/XFF1+kXp+dnVVXV5def/11HT58WAMDA2s5dsaGh4cVCoW0e/duffzxx8+cHxsb0yuvvKJN\nmzapr68v9fr09LQOHjyoPXv2qLa2Vp988slajp0x8pmbz8nZJPKRb23zedbkT1knbNtWb2+vPvvs\nMxUUFOjNN9/UgQMHVFlZmbrmhRde0Lvvvqsffvgh7V6Px6N33nlHoVBI8Xhcb7zxhl5++eW0e3PN\ntm2dOnVK169fV3FxsRoaGtTe3q5QKJS6Zvv27Tp37pwuX76cdq/H41FfX5/q6uoUi8VUX1+vlpaW\ntHtzjXzm5nNyNol8EvnWOt+G+uY9OjqqsrIyFRcXy+v1qrW1VSMjI2nX+P1+7dmzRx5P+ueaQCCQ\nWgyfz6eKigo9ePBgzWbPxM2bN1VVVaWdO3fK6/Wqs7NTQ0NDadcEAgHV19c/k6+oqEh1dXWSpPz8\nfFVXV2tmZmbNZs8E+czN5+RsEvkk8klrm29DlfeDBw9UVFSUOg4Gg8sq4JmZGY2NjWnv3r2rOd6K\nzczMqLS0NHW8Y8eOZW2iyclJ3bp1S42Njas53oqRLzPrMZ+Ts0nkyxT5Vs+GKu/VEI/H1d3drbNn\nz8rn8+V6nFUXi8XU0dGh/v5+5efn53qcVUc+czk5m0Q+0611vg1V3oWFhZqdnU0dR6NRFRYWZnz/\n4uKiuru7dejQIR08eDAbI65ISUmJpqamUsfT09MqKSnJ+P7FxUV1dHTo+PHjam9vz8aIK0K+v7ae\n8zk5m0S+f4d8q29DlfeLL76oqakp/frrr0okEhoeHtaBAwcyvv+DDz5QZWWljh07lsUpl6+hoUHj\n4+O6f/++nj59qosXL6qtre251yeTybTjEydOqKamRmfOnMn2qMtCvnQm5XNyNol8f0S+7NtQv23u\ndrv13nvv6a233pJt2zp8+LAqKyv17bffyrIsHT16VHNzc+rs7FQ8HpdlWfryyy81NDSksbExff/9\n96qqqtLRo0dlWZZOnz6tV199NdexUtxut86fP6+WlhbZtq2uri5VV1frwoULsixLJ0+eVDQa1f79\n+zU/Py+Xy6X+/n7dvXtXt2/f1sDAgGpra7Vv3z5ZlqXe3l61trbmOlYK+czN5+RsEvnIt/b5rD9+\nglivwuFw8siRI7keI2sikYh6enpyPUbWhMNhx+ZzcjaJfKYjn7n+N5v1Z+c21I/NAQBwAsobAADD\nUN4AABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcA\nAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGGs\nZDKZ6xky8uGHHy5ZluXYDxtut1tLS0u5HiNrPB6PFhcXcz1GViSTSVmWlesxssbp+Zz+7Dl9/Zyc\nL5lM2h9++KH7z8551nqY5bIsyxWNRnM9RtYEg0H19PTkeoysCYfDjs0XDofl9L3p9HxO3ZsS+9Nk\nwWDwuV9YHftNFgAAp6K8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIah\nvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAA\nDEN5AwBgGE+uB1hrU1NT+umnn5RMJlVdXa19+/alnX/06JFGRkY0NzenxsZGvfTSS5KkWCym69ev\n67fffpNlWaqurtbevXtzEeEvDQ8P6+2335Zt2+rq6tLZs2fTzo+Njenvf/+7/vWvf6m3t1fd3d2S\npOnpaf3tb39TNBqVy+XSP/7xD50+fToXEf6S0/M5eX86OZvE3jR9/UzLt6HKO5lM6saNG2pra5PP\n51MkElF5ebn8fn/qmk2bNqm5uVkTExNp97pcLjU1NSkQCCiRSGhwcFClpaVp9+aabds6deqUrl+/\nruLiYjU0NKi9vV2hUCh1zfbt23Xu3Dldvnw57V6Px6O+vj7V1dUpFoupvr5eLS0taffmmtPzOXl/\nOjmbxN6UzF4/E/NtqB+bR6NRbd26VVu2bJHb7dauXbs0OTmZds3mzZtVUFAgy7LSXvf5fAoEApIk\nr9crv9+vhYWFtRo9Izdv3lRVVZV27twpr9erzs5ODQ0NpV0TCARUX18vjyf9c1tRUZHq6uokSfn5\n+aqurtbMzMyazZ4Jp+dz8v50cjaJvSmZvX4m5ttQ5b2wsKD8/PzUcX5+/rL+kp88eaKHDx8qGAyu\n5ngrNjMzo9LS0tTxjh07lvUmMDk5qVu3bqmxsXE1x1sxp+dz8v50cjaJvZmp9bp+JubbUOW9GhKJ\nhK5du6ampiZ5vd5cj7PqYrGYOjo61N/fn7aZncLp+Zy8P52cTWJvmm6t822o8s7Ly1MsFksdx2Ix\n5eXlZXy/bdu6evWqdu/erYqKimyMuCIlJSWamppKHU9PT6ukpCTj+xcXF9XR0aHjx4+rvb09GyOu\niNPzOXl/OjmbxN78d9b7+pmYb0OVd2FhoR4/fqz5+XktLS1pfHxc5eXlz70+mUymHY+MjMjv96/L\n35SUpIaGBo2Pj+v+/ft6+vSpLl68qLa2tude/8d8J06cUE1Njc6cOZPtUZfF6fmcvD+dnE1ib/6R\naetnYr4N9dvmLpdLzc3NunLliiQpFArJ7/frzp07sixLNTU1isfjunTpkhKJhCzL0ujoqDo7OzU3\nN6d79+5p27ZtGhwclCQ1NjaqrKwsl5HSuN1unT9/Xi0tLan/rlJdXa0LFy7IsiydPHlS0WhU+/fv\n1/z8vFwul/r7+3X37l3dvn1bAwMDqq2t1b59+2RZlnp7e9Xa2prrWClOz+fk/enkbBJ70/T1MzGf\n9cdPEOtVOBxORqPRXI+RNcFgUD09PbkeI2vC4bBj84XDYTl9bzo9n1P3psT+NNn/7k3rz85tqB+b\nAwDgBJQ3AACGobwBADAM5Q0AgGEobwAADEN5AwBgGMobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAw\nDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kD\nAGAYyhsAAMNQ3gAAGMZKJpO5niEjH3300ZJt2479sJFMJmVZVq7HyBon53NyNklyuVyybTvXY2SN\nx+PR4uJirsfIGqfvTyfnSyaT9ocffuj+s3OetR5muWzbdh05ciTXY2RNJBJRNBrN9RhZEwwGHZvP\nydmk3/M5/dnr6enJ9RhZEw6HHb8/nZovGAw+9wurY7/JAgDgVJQ3AACGobwBADAM5Q0AgGEobwAA\nDEN5AwBgGMobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1De\nAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAM48n1AGvtxx9/1Mcff6xkMqnDhw+rq6sr7fzE\nxIT++c9/6n/+5390+vRp/ed//qckaXZ2Vu+//74ePnwoy7LU0dGh//iP/8hFhL80NTWln376Sclk\nUtXV1dq3b1/a+UePHmlkZERzc3NqbGzUSy+9JEmKxWK6fv26fvvtN1mWperqau3duzcXEf4S+czN\n5/Rnb3h4WG+//bZs21ZXV5fOnj2bdn5sbEx///vf9a9//Uu9vb3q7u6WJE1PT+tvf/ubotGoXC6X\n/vGPf+j06dO5iPCXnLw3JfPybajytm1bvb29+uyzz1RQUKA333xTBw4cUGVlZeqaF154Qe+++65+\n+OGHtHs9Ho/eeecdhUIhxeNxvfHGG3r55ZfT7s21ZDKpGzduqK2tTT6fT5FIROXl5fL7/alrNm3a\npObmZk1MTKTd63K51NTUpEAgoEQiocHBQZWWlqbdm2vkMzef058927Z16tQpXb9+XcXFxWpoaFB7\ne7tCoVDqmu3bt+vcuXO6fPly2r0ej0d9fX2qq6tTLBZTfX29Wlpa0u7NNSfvTcnMfBvqx+ajo6Mq\nKytTcXGxvF6vWltbNTIyknaN3+/Xnj175PGkf64JBAKph8nn86miokIPHjxYs9kzEY1GtXXrVm3Z\nskVut1u7du3S5ORk2jWbN29WQUGBLMtKe93n8ykQCEiSvF6v/H6/FhYW1mr0jJDP3HxOf/Zu3ryp\nqqoq7dy5U16vV52dnRoaGkq7JhAIqL6+/pl8RUVFqqurkyTl5+erurpaMzMzazZ7Jpy8NyUz822o\n8n7w4IGKiopSx8FgcFlvAjMzMxobG1t3P/pZWFhQfn5+6jg/P39Zm+jJkyd6+PChgsHgao63YuTL\nzHrM5/Rnb2ZmRqWlpanjHTt2LKuAJycndevWLTU2Nq7meCvm5L0pmZlvQ5X3aojH4+ru7tbZs2fl\n8/lyPc6qSyQSunbtmpqamuT1enM9zqojn7mc/uzFYjF1dHSov78/rUicwsl7U1r7fBuqvAsLCzU7\nO5s6jkajKiwszPj+xcVFdXd369ChQzp48GA2RlyRvLw8xWKx1HEsFlNeXl7G99u2ratXr2r37t2q\nqKjIxogrQr6/tp7zOf3ZKykp0dTUVOp4enpaJSUlGd+/uLiojo4OHT9+XO3t7dkYcUWcvDclM/Nt\nqPJ+8cUXNTU1pV9//VWJRELDw8M6cOBAxvd/8MEHqqys1LFjx7I45fIVFhbq8ePHmp+f19LSksbH\nx1VeXv7c65PJZNrxyMiI/H7/uvuR5P8hXzqT8jn92WtoaND4+Lju37+vp0+f6uLFi2pra3vu9X9c\nuxMnTqimpkZnzpzJ9qjL4uS9KZmZb0P9trnb7dZ7772nt956S7Zt6/Dhw6qsrNS3334ry7J09OhR\nzc3NqbOzU/F4XJZl6csvv9TQ0JDGxsb0/fffq6qqSkePHpVlWTp9+rReffXVXMdKcblcam5u1pUr\nVyRJoVBIfr9fd+7ckWVZqqmpUTwe16VLl5RIJGRZlkZHR9XZ2am5uTndu3dP27Zt0+DgoCSpsbFR\nZWVluYyUhnzm5nP6s+d2u3X+/Hm1tLSk/qtYdXW1Lly4IMuydPLkSUWjUe3fv1/z8/NyuVzq7+/X\n3bt3dfv2bQ0MDKi2tlb79u2TZVnq7e1Va2trrmOlOHlvSmbms/74CWK9CofDySNHjuR6jKyJRCKK\nRqO5HiNrgsGgY/M5OZv0ez6nP3s9PT25HiNrwuGw4/enU/MFg0H19PRYf3ZuQ/3YHAAAJ6C8AQAw\nDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kD\nAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADEN5AwBgGMobAADDUN4AABjG\nSiaTuZ4hIx999NGSbduO/bCRTCZlWVaux8gal8sl27ZzPUZWODmbJHk8Hi0uLuZ6jKxx+vo5PZ+T\n96fb7bb/67/+y/1n5zxrPcxy2bbtOnLkSK7HyJpIJKJoNJrrMbImGAzKqesXiUQcm036PV9PT0+u\nx8iacDjs+PVzej6n7s9wOPzcL6yO/SYLAIBTUd4AABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8A\nAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ\n3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGE2XHn/+OOPOnTokF577TV9/vnnz5yfmJjQsWPHVF9f\nry+++CL1+uzsrLq6uvT666/r8OHDGhgYWMuxMzY1NaWvv/5aX331lX7++ednzj969EjfffedPv30\nU92+fTv1eiwW09DQkC5evKhvvvlGv/zyy1qOnTGnr5+T8w0PDysUCmn37t36+OOPnzk/NjamV155\nRZs2bVJfX1/q9enpaR08eFB79uxRbW2tPvnkk7UcO2NOXjvJ+flM25+eNflT1gnbttXb26vPPvtM\nBQUFevPNN3XgwAFVVlamrnnhhRf07rvv6ocffki71+Px6J133lEoFFI8Htcbb7yhl19+Oe3eXEsm\nk7px44ba2trk8/kUiURUXl4uv9+fumbTpk1qbm7WxMRE2r0ul0tNTU0KBAJKJBIaHBxUaWlp2r25\n5vT1c3I+27Z16tQpXb9+XcXFxWpoaFB7e7tCoVDqmu3bt+vcuXO6fPly2r0ej0d9fX2qq6tTLBZT\nfX29Wlpa0u7NNSevnbQx8pm2PzfUN+/R0VGVlZWpuLhYXq9Xra2tGhkZSbvG7/drz5498njSP9cE\nAoHUYvh8PlVUVOjBgwdrNnsmotGotm7dqi1btsjtdmvXrl2anJxMu2bz5s0qKCiQZVlpr/t8PgUC\nAUmS1+uqVgErAAARmklEQVSV3+/XwsLCWo2eEaevn5Pz3bx5U1VVVdq5c6e8Xq86Ozs1NDSUdk0g\nEFB9ff0z2YqKilRXVydJys/PV3V1tWZmZtZs9kw4ee0k5+czcX9uqPJ+8OCBioqKUsfBYHBZm2hm\nZkZjY2Pau3fvao63YgsLC8rPz08d5+fnL6uAnzx5oocPHyoYDK7meCvm9PVzcr6ZmRmVlpamjnfs\n2LGsN7jJyUndunVLjY2Nqzneijl57STn5zNxf26o8l4N8Xhc3d3dOnv2rHw+X67HWXWJRELXrl1T\nU1OTvF5vrsdZdU5fPyfni8Vi6ujoUH9/f9qHVKdw8tpJzs+31vtzQ5V3YWGhZmdnU8fRaFSFhYUZ\n37+4uKju7m4dOnRIBw8ezMaIK5KXl6dYLJY6jsViysvLy/h+27Z19epV7d69WxUVFdkYcUWcvn5O\nzldSUqKpqanU8fT0tEpKSjK+f3FxUR0dHTp+/Lja29uzMeKKOHntJOfnM3F/bqjyfvHFFzU1NaVf\nf/1ViURCw8PDOnDgQMb3f/DBB6qsrNSxY8eyOOXyFRYW6vHjx5qfn9fS0pLGx8dVXl7+3OuTyWTa\n8cjIiPx+/7r7kdb/cfr6OTlfQ0ODxsfHdf/+fT19+lQXL15UW1vbc6//4948ceKEampqdObMmWyP\nuixOXjvJ+flM3J8b6rfN3W633nvvPb311luybVuHDx9WZWWlvv32W1mWpaNHj2pubk6dnZ2Kx+Oy\nLEtffvmlhoaGNDY2pu+//15VVVU6evSoLMvS6dOn9eqrr+Y6VorL5VJzc7OuXLkiSQqFQvL7/bpz\n544sy1JNTY3i8bguXbqkRCIhy7I0Ojqqzs5Ozc3N6d69e9q2bZsGBwclSY2NjSorK8tlpDROXz8n\n53O73Tp//rxaWlpk27a6urpUXV2tCxcuyLIsnTx5UtFoVPv379f8/LxcLpf6+/t19+5d3b59WwMD\nA6qtrdW+fftkWZZ6e3vV2tqa61gpTl47aWPkM21/Wn/8BLFehcPh5JEjR3I9RtZEIhFFo9Fcj5E1\nwWBQTl2/SCTi2GzS7/l6enpyPUbWhMNhx6+f0/M5dX+Gw2H19PRYf3ZuQ/3YHAAAJ6C8AQAwDOUN\nAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAY\nyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADEN5AwBgGMobAADDUN4AABjGSiaT\nuZ4hIx999NGSbduO/bDh8Xi0uLiY6zGyxsn5XC6XbNvO9RhZ4+S1k1g/0yWTSVmWlesxsiKZTNof\nfvih+8/OedZ6mOWybdt15MiRXI+RNZFIRD09PbkeI2vC4bBj84XDYbE3zcX6mS0cDisajeZ6jKwI\nBoPP/cLq2G+yAAA4FeUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzl\nDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADEN5AwBg\nGMobAADDUN4AABhmw5X3jz/+qEOHDum1117T559//sz5iYkJHTt2TPX19friiy9Sr8/Ozqqrq0uv\nv/66Dh8+rIGBgbUcO2PDw8MKhULavXu3Pv7442fOj42N6ZVXXtGmTZvU19eXen16eloHDx7Unj17\nVFtbq08++WQtx86Y0/M5eX+yduauneT89ZuamtLXX3+tr776Sj///PMz5x89eqTvvvtOn376qW7f\nvp16PRaLaWhoSBcvXtQ333yjX375ZU3m9azJn7JO2Lat3t5effbZZyooKNCbb76pAwcOqLKyMnXN\nCy+8oHfffVc//PBD2r0ej0fvvPOOQqGQ4vG43njjDb388stp9+aabds6deqUrl+/ruLiYjU0NKi9\nvV2hUCh1zfbt23Xu3Dldvnw57V6Px6O+vj7V1dUpFoupvr5eLS0taffm2kbI59T9ydqZu3aS89cv\nmUzqxo0bamtrk8/nUyQSUXl5ufx+f+qaTZs2qbm5WRMTE2n3ulwuNTU1KRAIKJFIaHBwUKWlpWn3\nZsOG+uY9OjqqsrIyFRcXy+v1qrW1VSMjI2nX+P1+7dmzRx5P+ueaQCCQ2mw+n08VFRV68ODBms2e\niZs3b6qqqko7d+6U1+tVZ2enhoaG0q4JBAKqr69/Jl9RUZHq6uokSfn5+aqurtbMzMyazZ4Jp+dz\n8v5k7cxdO8n56xeNRrV161Zt2bJFbrdbu3bt0uTkZNo1mzdvVkFBgSzLSnvd5/MpEAhIkrxer/x+\nvxYWFrI+84Yq7wcPHqioqCh1HAwGl/WQzMzMaGxsTHv37l3N8VZsZmZGpaWlqeMdO3Ys6yGZnJzU\nrVu31NjYuJrjrZjT8zl5f7J2mVmPayc5f/0WFhaUn5+fOs7Pz19WAT958kQPHz5UMBhczfH+1IYq\n79UQj8fV3d2ts2fPyufz5XqcVReLxdTR0aH+/v60zewUTs/n5P3J2pnN6euXSCR07do1NTU1yev1\nZv3P21DlXVhYqNnZ2dRxNBpVYWFhxvcvLi6qu7tbhw4d0sGDB7Mx4oqUlJRoamoqdTw9Pa2SkpKM\n719cXFRHR4eOHz+u9vb2bIy4Ik7P5+T9ydr9tfW8dpLz1y8vL0+xWCx1HIvFlJeXl/H9tm3r6tWr\n2r17tyoqKrIx4jM2VHm/+OKLmpqa0q+//qpEIqHh4WEdOHAg4/s/+OADVVZW6tixY1mccvkaGho0\nPj6u+/fv6+nTp7p48aLa2tqee30ymUw7PnHihGpqanTmzJlsj7osTs/n5P3J2v219bx2kvPXr7Cw\nUI8fP9b8/LyWlpY0Pj6u8vLy517/x3wjIyPy+/1r+s8dG+q3zd1ut9577z299dZbsm1bhw8fVmVl\npb799ltZlqWjR49qbm5OnZ2disfjsixLX375pYaGhjQ2Nqbvv/9eVVVVOnr0qCzL0unTp/Xqq6/m\nOlaK2+3W+fPn1dLSItu21dXVperqal24cEGWZenkyZOKRqPav3+/5ufn5XK51N/fr7t37+r27dsa\nGBhQbW2t9u3bJ8uy1Nvbq9bW1lzHStkI+Zy6P1k7c9dOcv76uVwuNTc368qVK5KkUCgkv9+vO3fu\nyLIs1dTUKB6P69KlS0okErIsS6Ojo+rs7NTc3Jzu3bunbdu2aXBwUJLU2NiosrKyrM5s/fETxHoV\nDoeTR44cyfUYWROJRNTT05PrMbImHA47Nl84HBZ701ysn9nC4bCi0Wiux8iKYDConp4e68/Obagf\nmwMA4ASUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEA\nMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADEN5\nAwBgGMobAADDWMlkMtczZOSjjz5asm3bsR82PB6PFhcXcz1G1rhcLtm2nesxsiKZTMqyrFyPkTVO\nz+d2u7W0tJTrMbLG6evn5PcWl8tl//Of/3T/2TnPWg+zXLZtu44cOZLrMbImEomop6cn12NkTTgc\nllPXLxKJKBqN5nqMrAkGg47P5/Rnz+nr5+D3lud+YXXsN1kAAJyK8gYAwDCUNwAAhqG8AQAwDOUN\nAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAY\nyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADLPhyvvHH3/UoUOH9Nprr+nzzz9/\n5vzExISOHTum+vp6ffHFF6nXZ2dn1dXVpddff12HDx/WwMDAWo6dseHhYYVCIe3evVsff/zxM+fH\nxsb0yiuvaNOmTerr60u9Pj09rYMHD2rPnj2qra3VJ598spZjZ8zp6zc1NaWvv/5aX331lX7++edn\nzj969EjfffedPv30U92+fTv1eiwW09DQkC5evKhvvvlGv/zyy1qOnREnZ5Oc/+w5ff1Me2/xrMmf\nsk7Ytq3e3l599tlnKigo0JtvvqkDBw6osrIydc0LL7ygd999Vz/88EPavR6PR++8845CoZDi8bje\neOMNvfzyy2n35ppt2zp16pSuX7+u4uJiNTQ0qL29XaFQKHXN9u3bde7cOV2+fDntXo/Ho76+PtXV\n1SkWi6m+vl4tLS1p9+aa09cvmUzqxo0bamtrk8/nUyQSUXl5ufx+f+qaTZs2qbm5WRMTE2n3ulwu\nNTU1KRAIKJFIaHBwUKWlpWn35pKTs0nOf/Y2wvqZ9t6yob55j46OqqysTMXFxfJ6vWptbdXIyEja\nNX6/X3v27JHHk/65JhAIpB4mn8+niooKPXjwYM1mz8TNmzdVVVWlnTt3yuv1qrOzU0NDQ2nXBAIB\n1dfXP5OvqKhIdXV1kqT8/HxVV1drZmZmzWbPhNPXLxqNauvWrdqyZYvcbrd27dqlycnJtGs2b96s\ngoICWZaV9rrP51MgEJAkeb1e+f1+LSwsrNXo/5aTs0nOf/acvn4mvrdsqPJ+8OCBioqKUsfBYHBZ\nf8kzMzMaGxvT3r17V3O8FZuZmVFpaWnqeMeOHct6E5icnNStW7fU2Ni4muOtmNPXb2FhQfn5+anj\n/Pz8Zb3JPXnyRA8fPlQwGFzN8VbEydkk5z97Tl8/E99bNlR5r4Z4PK7u7m6dPXtWPp8v1+Osulgs\npo6ODvX396c9rE7h9PVLJBK6du2ampqa5PV6cz3OqnJyNsn5z57T12+t31s2VHkXFhZqdnY2dRyN\nRlVYWJjx/YuLi+ru7tahQ4d08ODBbIy4IiUlJZqamkodT09Pq6SkJOP7FxcX1dHRoePHj6u9vT0b\nI66I09cvLy9PsVgsdRyLxZSXl5fx/bZt6+rVq9q9e7cqKiqyMeKyOTmb5Pxnz+nrZ+J7y4Yq7xdf\nfFFTU1P69ddflUgkNDw8rAMHDmR8/wcffKDKykodO3Ysi1MuX0NDg8bHx3X//n09ffpUFy9eVFtb\n23OvTyaTaccnTpxQTU2Nzpw5k+1Rl8Xp61dYWKjHjx9rfn5eS0tLGh8fV3l5+XOv/+P6jYyMyO/3\nr7t/DpCcnU1y/rPn9PUz8b1lQ/22udvt1nvvvae33npLtm3r8OHDqqys1LfffivLsnT06FHNzc2p\ns7NT8XhclmXpyy+/1NDQkMbGxvT999+rqqpKR48elWVZOn36tF599dVcx0pxu906f/68WlpaZNu2\nurq6VF1drQsXLsiyLJ08eVLRaFT79+/X/Py8XC6X+vv7dffuXd2+fVsDAwOqra3Vvn37ZFmWent7\n1dramutYKU5fP5fLpebmZl25ckWSFAqF5Pf7defOHVmWpZqaGsXjcV26dEmJREKWZWl0dFSdnZ2a\nm5vTvXv3tG3bNg0ODkqSGhsbVVZWlstIKU7OJjn/2dsI62fae4v1x09I61U4HE4eOXIk12NkTSQS\nUU9PT67HyJpwOCynrl8kElE0Gs31GFkTDAYdn8/pz57T18/J7y09PT3Wn53bUD82BwDACShvAAAM\nQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADEN5AwBgGMobAADDUN4A\nABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIax\nkslkrmfIyEcffTRr23Yw13Nki8fjsRcXFx37Ycrlctm2bTsyXzKZtC3LcmQ2yfn53G63vbS05Nh8\nTl8/J7+3uFyu6D//+c+iPztnTHkDAIDfOfLTCgAATkZ5AwBgGMobAADDUN4AABiG8gYAwDCUNwAA\nhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShv\nAAAMQ3kDAGAYyhsAAMP8P1qBrT7BINI0AAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAq8AAAKTCAYAAAA32eFLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3W9MHWXC/vFreviPFJB/JaJZ2wYqotAtVOy61qpRjLaV\nuDRZTdH4QhJSt936YrPG0BBbDQlJN9s0rdpqCa6NNdrYNKRNpCQl1R8h1KXWk7pYu0v6B8qhxWBP\nT+DA/F74nPOEFPbpTA8c7vL9vDKzd2buuXrPmYthDmvZti0AAADABPOiPQEAAADgZlFeAQAAYAzK\nKwAAAIxBeQUAAIAxKK8AAAAwBuUVAAAAxqC8AgAAwBgx0Z7ATKmvr79HUma052GYOEkj0Z6EgcjN\nOTJzh9ycIzN3yM05MnPHt2XLlt7/NsCaC/8nBfX19fdYlvWDbdsJ0Z6LSWzblmVZ0Z6GcSzL0ly4\nriKJteYOuTlHZu6QG2ZQQFLBfyuwc+XJa6Zt2wmVlZXKysqK9lyM0NPTo7a2Nv38888KBoPRno4x\n4uLilJKSItbazWOtuRNaa+R288jMHXJzLpRZWVmZUlJSoj0dYwwPD6uzszNBv/6mfM6XV0lSVlaW\ncnNzoz0NI/h8PklSMBjkw8oBj8cjibXmBGvNndBaI7ebR2bukJtzocxSUlKUnp4e5dncfvjCFgAA\nAIxBeQUAAIAxKK8AAAAwBuUVAAAAxqC8AgAAwBiUVwAAABiD8goAAABjUF4BAABgDMorAAAAjEF5\nBQAAgDEorwAAADAG5RUAAADGoLwCAADAGJRXAAAAGIPyCgAAAGNQXgEAAGAMyisAAACMQXkFAACA\nMSivAAAAMAblFQAAAMagvAIAAMAYlFcAAAAYg/IKAAAAY1BeAQAAYAzKKwAAAIxBeQUAAIAxKK8A\nAAAwBuUVAAAAxqC8AgAAwBiUVwAAABiD8goAAABjxER7ArebnTt3qrGxUX19fSouLtaOHTtUVlY2\n6Viv16u6ujp1dXXpP//5j/72t7/pT3/604Qx7777rg4ePKgzZ84oMTFRK1asUENDg/Lz82fidGbM\n6dOn9c9//lN+v18ZGRn6/e9/r+zs7EnHXrlyRZ2dnRoYGNDw8LB+97vf6cEHH5ww5uTJkzp37pyu\nXr2qmJgYLViwQOXl5UpLS5uJ05kRrDV3WGvOkZk75OYcmbmzf/9+NTU1yefzqaCgQH/9619VVFQ0\n6dizZ89q586d8nq9unjxov7yl7/opZdemjBmz549am1t1blz5xQfH6+SkhL9+c9/1m9+85sZOJv/\nG09eI+jTTz/VG2+8ofr6en377bcqLi7W008/LZ/PN+l4v9+vRYsWqaGhQbm5uZOOaW9v1+uvv66O\njg599dVXGh0d1VNPPaXr169P56nMqB9//FFff/21ysrKVFVVpczMTB0+fHjKcwwGg5o/f77Ky8uV\nnJw86ZhLly6pqKhIL7zwglavXq3x8XEdPnxYwWBwOk9lxrDW3GGtOUdm7pCbc2TmzpEjR9TY2Kja\n2lodOHBA+fn5qqmp0dWrVycdHwgElJeXp02bNikrK2vSMV1dXXrxxRf1ySef6IMPPlAwGFRNTY0C\ngcB0nspNo7xG0Pbt21VTU6Pq6motWbJEu3fvVlJSkj788MNJx5eWlqqhoUHr1q1TXFzcpGNaWlq0\nfv163XfffXrggQe0b98+9fb2qqurazpPZUZ1d3ersLBQBQUFSk9P16OPPqqYmBidOXNm0vHZ2dl6\n+OGHtXjxYs2bN/kSfvbZZ8P7y8jI0KpVqzQ8PKyBgYHpPJUZw1pzh7XmHJm5Q27OkZk7zc3Nqqqq\n0po1a7Rw4ULV1dUpISFBBw8enHT8/fffr82bN6uiokKxsbGTjtm1a5dWr16thQsXKj8/X1u3btWl\nS5fk9Xqn81RuGuU1QkZHR9XV1aUnnngivM2yLD355JP65ptvInacoaEhWZalO++8M2L7jKaxsTH5\nfD7ddddd4W2WZSkvL0/9/f0RO87IyIgsy1J8fHzE9hktrDV3WGvOkZk75OYcmbkzOjoqr9erhx56\nKLzNsiyVl5eru7s7YscZHh6WZVlKTU2N2D5vBeU1Qnw+n8bGxpSTkzNhe05Ojvr6+iJyDNu2tWnT\nJj3yyCMqLCyMyD6jLRAIaHx8XElJSRO2JyYmyu/3R+QYtm3rxIkTWrBgwW1RxFhr7rDWnCMzd8jN\nOTJzZ2hoSGNjY8rIyJiwPSMjY8rXyJyybVsNDQ1aunSpFi1aFJF93iq+sDXNbNuWZVkR2Vdtba28\nXq9OnDgRkf3NFcePH9eVK1dUWVkZ7alMK9Za9M2VtRZJZOYOuTk31zKL1P1g69atOnv2rJqbmyOy\nv0igvEZIZmamPB7PDb/euHz58g1PyNzYsGGDWlpa1N7ePuUXbkyUkJCgefPm3fCT9fXr12/4CdyN\n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\n44PBoObPn6/y8nIlJydPOubSpUsqKirSCy+8oNWrV2t8fFyHDx9WMBiczlOZUZ9++qneeOMN1dfX\n69tvv1VxcbGefvpp+Xy+Scf7/X4tWrRIDQ0Nys3NnXRMe3u7Xn/9dXV0dOirr77S6OionnrqqSn/\nLUxDZu5wjTpHZu6Qm3NHjhxRY2OjamtrdeDAAeXn56umpkZXr16ddHwgEFBeXp42bdqkrKysScd0\ndXXpxRdf1CeffKIPPvhAwWBQNTU1CgQC03kqM2ou3g8orxHU3d2twsJCFRQUKD09XY8++qhiYmJ0\n5syZScdnZ2fr4Ycf1uLFizVv3uT/FM8++2x4fxkZGVq1apWGh4c1MDAwnacyo7Zv366amhpVV1dr\nyZIl2r17t5KSkvThhx9OOr60tFQNDQ1at26d4uLiJh3T0tKi9evX67777tMDDzygffv2qbe3V11d\nXdN5KjOGzNzhGnWOzNwhN+eam5tVVVWlNWvWaOHChaqrq1NCQoIOHjw46fj7779fmzdvVkVFhWJj\nYycds2vXLq1evVoLFy5Ufn6+tm7dqkuXLsnr9U7nqcyouXg/oLxGyNjYmHw+n+66667wNsuylJeX\np/7+/ogdZ2RkRJZlKT4+PmL7jKbR0VF1dXXpiSeeCG+zLEtPPvmkvvnmm4gdZ2hoSJZl6c4774zY\nPqOFzNzhGnWOzNwhN+dGR0fl9Xr10EMPhbdZlqXy8nJ1d3dH7DjDw8OyLEupqakR22c0zdX7AeU1\nQgKBgMbHx5WUlDRhe2Jiovx+f0SOYdu2Tpw4oQULFsyaBXSrfD6fxsbGlJOTM2F7Tk6O+vr6InIM\n27a1adMmPfLIIyosLIzIPqOJzNzhGnWOzNwhN+eGhoY0NjamjIyMCdszMjKm/PW3U7Ztq6GhQUuX\nLtWiRYsiss9om6v3A76wZZDjx4/rypUrqqysjPZUpp1t27IsKyL7qq2tldfr1YkTJyKyv9mKzKJv\nLl2jkUJm7syl3CL1ubZ161adPXtWzc3NEdnfbHa73w8orxGSkJCgefPm3fBT9fXr12/46duN9vZ2\n9fb26vnnn5/yZX4TZWZmyuPx3PCrtMuXL9/wk6QbGzZsUEtLi9rb26d8Md00ZOYO16hzZOYOuTmX\nlpYmj8ejwcHBCdsHBwdveBrrxrZt29Te3q6mpqYpv9xlorl6P+C1gQjxeDzKzMzUhQsXwtts29b5\n8+dveQG1t7fr3LlzWrt2rVJSUm51qrNKbGysli1bptbW1vA227bV2tqqFStW3NK+N2zYoC+//FJt\nbW265557bnWqswaZucM16hyZuUNuzsXGxqqwsFAdHR3hbbZtq6OjQyUlJbe0723btqmtrU179+6d\nVQUsEubq/YAnrxFUXFysY8eOKSsrS9nZ2Tp16pSCwaCWLFkiSWptbVVycrLKy8sl/fpSf+hPgIyP\nj+vatWvy+XyKjY0Nv0x+/Phx9fT06JlnnlFMTEz4J/m4uDjFxNwe/3ybN2/Wyy+/rGXLlmn58uXa\nvn27/H6/XnnlFUlSdXW18vLy9M4770j63xf7bdvWyMiILly4oO7ubt1xxx3h95hqa2u1f/9+HTp0\nSMnJyeGfSlNTU5WQkBCV84wkMnOHa9Q5MnOH3Jxbv3693nrrLRUWFqqoqEjNzc0KBAJau3atJOnN\nN99UTk6ONm7cKOnXz7WffvpJtm1rdHRU/f39+uGHH5SUlKS7775b0q+vCrS0tGjHjh1KTEwMvz+b\nkpJyW3zRTZqb9wPzV/sssnjxYgUCAXV2dsrv9yszM1PPPfecEhMTJUm//PLLhD+B4vf79dlnn4Xf\nS+nu7lZ3d7dyc3PDF+v3338vy7J06NChCcdatWqVCgoKZujMpte6devk8/lUV1en/v5+lZSU6OjR\no+Ff7Zw/f37CB/PFixe1dOnScG6NjY1qbGzUypUrdezYMUnS7t27ZVmWHnvssQnH+uijj1RdXT0z\nJzaNyMwdrlHnyMwdcnOuoqJCQ0ND2rlzpwYHB1VQUKD33nsv/IW0/v5+eTye8PiBgQFVVVWFM2tq\nalJTU5NKS0u1d+9eSdKBAwdkWZZeffXVCcd6++23tWbNmhk6s+k1F+8Hlm3b0Z7DtKuvr/+tpK7B\nwcHb5o85T7f4+HilpaXptddeu+1+zTKdvvvuO33xxRfk5kAoM65PZ0LXKLndPDJzJ5Tb448/rvT0\n9GhPxwi9vb3q7OzkXuDQpUuX9P7770vSsi1btpycahzvvAIAAMAYlFcAAAAYg/IKAAAAY1BeAQAA\nYAzKKwAAAIxBeQUAAIAxKK8AAAAwBuUVAAAAxqC8AgAAwBiUVwAAABiD8goAAABjUF4BAABgDMor\nAAAAjEF5BQAAgDEorwAAADAG5RUAAADGoLwCAADAGJRXAAAAGIPyCgAAAGNQXgEAAGAMyisAAACM\nQXkFAACAMSivAAAAMAblFQAAAMagvAIAAMAYlFcAAAAYg/IKAAAAY1BeAQAAYAzKKwAAAIxBeQUA\nAIAxKK8AAAAwBuUVAAAAxoiJ9gRmUlxcnDweT7SnYYTY2FhJUk9Pj3w+X5RnY47e3l5J5OZEKDOu\nT2dC1yi53TwycyeUW19fn4aHh6M8GzOEPv+5Fzhz9erVmxo3V8prnGVZSklJifY8jGJZltra2qI9\nDSORmzNcn+7Ytk1uDrHW3LEsS16vN9rTMIpt29wLXLBtW5Zlxf23MXOlvI7Ytq3KykplZWVFey5G\n6OnpUVtbG5k5FMqtrKyMG+RN6uvrk9frZa05FFprP//8s4LBYLSnY4S4uDilpKSw1hzifuAc16c7\nMTExSk1NlaSR/zpuZqYzO2RlZSk3Nzfa0zBC6NccZOZMKLeUlBSlp6dHeTZmCP0akrXmTGitBYNB\nbo43KfSqAGvNGe4HznF9Ti++sAUAAABjUF4BAABgDMorAAAAjEF5BQAAgDEorwAAADAG5RUAAADG\noLwCAADAGJRXAAAAGIPyCgAAAGNQXgEAAGAMyisAAACMQXkFAACAMSivAAAAMAblFQAAAMagvAIA\nAMAYlFcAAAAYg/IKAAAAY1BeAQAAYAzKKwAAAIxBeQUAAIAxKK8AAAAwBuUVAAAAxqC8AgAAwBiU\nVwAAABiD8goAAABjUF4BAABgDMorAAAAjEF5BQAAgDEorwAAADAG5RUAAADGoLwCAADAGJTXCNu5\nc6fuvfdeJSYmqry8XJ2dnVOO9Xq9+sMf/qB7771X8+bN09///vcbxrz77rtavny55s+fr5ycHFVW\nVupf//rXdJ5CVJCbc/v371dFRYVKS0v10ksv6fTp01OOPXv2rDZv3qyKigo9+OCD+sc//nHDmD17\n9uiPf/yjysvLtXLlSm3cuFH//ve/p/EMooO15tzp06f18ccf6/3339fnn3+uy5cvTzn2ypUrOnr0\nqD7++GPt2rVLp06dumHMyZMn9fnnn2vPnj3at2+fjhw5oqGhoek8hahgrTlHZu7MtWuU8hpBn376\nqd544w3V19fr22+/VXFxsZ5++mn5fL5Jx/v9fi1atEgNDQ3Kzc2ddEx7e7tef/11dXR06KuvvtLo\n6KieeuopXb9+fTpPZUaRm3NHjhxRY2OjamtrdeDAAeXn56umpkZXr16ddHwgEFBeXp42bdqkrKys\nScd0dXXpxRdf1CeffKIPPvhAwWBQNTU1CgQC03kqM4q15tyPP/6or7/+WmVlZaqqqlJmZqYOHz48\n5fkFg0HNnz9f5eXlSk5OnnTMpUuXVFRUpBdeeEGrV6/W+Pi4Dh8+rGAwOJ2nMqNYa86RmTtz8Rql\nvEbQ9u3bVVNTo+rqai1ZskS7d+9WUlKSPvzww0nHl5aWqqGhQevWrVNcXNykY1paWrR+/Xrdd999\neuCBB7Rv3z719vaqq6trOk9lRpGbc83NzaqqqtKaNWu0cOFC1dXVKSEhQQcPHpx0/P333x9+8hob\nGzvpmF27dmn16tVauHCh8vPztXXrVl26dEler3c6T2VGsdac6+7uVmFhoQoKCpSenq5HH31UMTEx\nOnPmzKTjs7Oz9fDDD2vx4sWaN2/yW8yzzz4b3l9GRoZWrVql4eFhDQwMTOepzCjWmnNk5s5cvEYp\nrxEyOjqqrq4uPfHEE+FtlmXpySef1DfffBOx4wwNDcmyLN15550R22c0kZtzo6Oj8nq9euihh8Lb\nLMtSeXm5uru7I3ac4eFhWZal1NTUiO0zmlhrzo2Njcnn8+muu+4Kb7MsS3l5eerv74/YcUZGRmRZ\nluLj4yO2z2hirTlHZu7M1WuU8hohPp9PY2NjysnJmbA9JydHfX19ETmGbdvatGmTHnnkERUWFkZk\nn9FGbs4NDQ1pbGxMGRkZE7ZnZGRM+es1p2zbVkNDg5YuXapFixZFZJ/RxlpzLhAIaHx8XElJSRO2\nJyYmyu/3R+QYtm3rxIkTWrBgwW1TKFhrzpGZO3P1Go2J9gRud7Zty7KsiOyrtrZWXq9XJ06ciMj+\nZjNycydSmW3dulVnz55Vc3NzRPY3m7HWouv48eO6cuWKKisroz2Vacdac47Mom82XqOU1wjJzMyU\nx+O54TH95cuXb/hJ0o0NGzaopaVF7e3tU76YbiJycy4tLU0ej0eDg4MTtg8ODt7wNNaNbdu2qb29\nXU1NTVN+uctErDXnEhISNG/evBue4Fy/fv2GJz1utLe3q7e3V88///yUXxwxEWvNOTJzZ65eo7w2\nECGxsbFatmyZWltbw9ts21Zra6tWrFhxS/vesGGDvvzyS7W1temee+651anOKuTmXGxsrAoLC9XR\n0RHeZtu2Ojo6VFJSckv73rZtm9ra2rR3797b6gNeYq254fF4lJmZqQsXLoS32bat8+fP33KhaG9v\n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\nBuEVAAAAxiC8AgAAwBiEVwAAABiD8AoAAABjEF4BAABgDMIrAAAAjEF4BQAAgDEIrwAAADAG4RUA\nAADGILwCAADAGIRXAAAAGIPwCgAAAGMQXgEAAGAMwisAAACMQXgFAACAMQivAAAAMAbhFQAAAMYg\nvAIAAMAYhFcAAAAYg/AKAAAAYxBeAQAAYAzCKwAAAIxBeAUAAIAxCK8AAAAwBuE1yXbs2KEJEyYo\nJydHlZWVam5uHnJsOBzWG2+8oQkTJigjI0Pbt28fMGbr1q2aO3euRo0apeLiYlVVVemPP/5I5S14\n4ty5czp48KB2796t+vp6Xb16dcix169f17Fjx3Tw4EHt3LlTZ86cGTDm9OnTqq+v1549e7Rv3z4d\nPXpUnZ2dqbyFYUevuUPdnGN9ukPdnGN9upNuvUZ4TaKvv/5amzZtUk1NjX755RfNmDFDr7zyiiKR\nyKDjo9GoJk6cqNraWpWUlAw6JhgM6t1339WpU6f0448/qqenRy+//LLu3LmTylsZVn/++ad++ukn\nzZkzR8uWLVMgENCRI0eGvMdYLKZRo0apsrJSeXl5g465fPmypk2bptdff12LFy9WX1+fjhw5olgs\nlspbGTb0mjvUzTnWpzvUzTnWpzvp2GuE1yTatm2b1qxZo+rqak2ZMkW7du1Sbm6uPv/880HHz549\nW7W1tVq+fLn8fv+gYxoaGrRixQpNnTpV06dP1759+9TW1qaWlpZU3sqwCoVCKi8vV1lZmcaMGaPn\nnntOPp9Pv/3226Djx44dq6efflqTJk1SRsbgLbxo0aLE+QoLCzV//nzdvHlT165dS+WtDBt6zR3q\n5hzr0x3q5hzr05107DXCa5L09PSopaVFL774YuKYZVl66aWX9PPPPyftOp2dnbIsS4888kjSzuml\n3t5eRSIRjRs3LnHMsiyVlpaqvb09adfp7u6WZVkaMWJE0s7pFXrNHermHOvTHermHOvTnXTtNcJr\nkkQiEfX29qq4uLjf8eLiYl25ciUp17BtWxs2bNCzzz6r8vLypJzTa11dXerr61Nubm6/4zk5OYpG\no0m5hm3bOnnypB599NGH4gWLXnOHujnH+nSHujnH+nQnXXvN5/UEHna2bcuyrKSca+3atQqHwzp5\n8mRSzpcuTpw4oevXr6uqqsrrqaQUveYOdfNWuqzPZEuXurE+vfcg9hrhNUkCgYAyMzMHfEx/9erV\nAe8k3Vi3bp0aGhoUDAaHfDDdRNnZ2crIyBjwDvHOnTsD3km6EQwG1dbWptdee23IB9NNQ6+5Q92c\nY326Q92cY326k669xmMDSZKVlaWKigo1NjYmjtm2rcbGRj3zzDP3de5169bphx9+UFNTk8aPH3+/\nU32gZGZmKhAI6OLFi4ljtm3rwoUL9/2CFQwGdf78eS1dulT5+fn3O9UHBr3mDnVzjvXpDnVzjvXp\nTrr2Gp+8JtHGjRu1cuVKVVRUaO7cudq2bZui0ahWrVolSaqurlZpaak+/vhjSXcfUA+Hw7JtW93d\n3bp48aJCoZBGjhypiRMnSrr7NcehQ4d0+PBh5eXlJd6VFhQUKDs725P7TLYZM2bo+PHjKioq0tix\nY3XmzBnFYjFNmTJFktTY2Ki8vDxVVlZKuvuA+o0bNyRJfX19un37tiKRiLKyslRQUCDp7tccra2t\nWrhwoXw+X+Jdqd/vl89nftvTa+5QN+dYn+5QN+dYn+6kY695P4OHyPLlyxWJRLR582a1t7dr5syZ\nOnbsmIqKiiRJFy5c6PdHv3TpkmbNmpV4nqeurk51dXWaN2+ejh8/LknatWuXLMvS888/3+9aX3zx\nhaqrq4fnxlJs0qRJ6urqUnNzs6LRqAKBgF599VXl5ORIkm7dutXv5zyi0ai+/fbbRN1CoZBCoZBK\nSkq0dOlSSdKvv/4qy7J0+PDhfteaP3++ysrKhunOUodec4e6Ocf6dIe6Ocf6dCcde82ybdvrOaRc\nTU3N/yS1rF69+qF61iWVzp49q++++04dHR0PzI8Sm2DEiBEaPXq06LV7F+81auYMa9S5+PqkZs7w\nuuYc69Mdn8+nwsJCSarYsmXL6aHG8cwrAAAAjEF4BQAAgDEIrwAAADAG4RUAAADGILwCAADAGIRX\nAAAAGIPwCgAAAGMQXgEAAGAMwisAAACMQXgFAACAMQivAAAAMAbhFQAAAMYgvAIAAMAYhFcAAAAY\ng/AKAAAAYxBeAQAAYAzCKwAAAIxBeAUAAIAxCK8AAAAwBuEVAAAAxiC8AgAAwBiEVwAAABiD8AoA\nAABjEF4BAABgDMIrAAAAjEF4BQAAgDEIrwAAADAG4RUAAADGILwCAADAGIRXAAAAGIPwCgAAAGMQ\nXgEAAGAMn9cTGE7Xrl3zegrGuHHjhiTJ50urFrlvmZmZkug1J+K9Rs2cYY06F1+f1MwZXtecY326\nc6/1smzbTvFUvFdTUzPesqzfbdvO9nouJrFtW5ZleT0N41iWpXRYV8lEzdxhjTpHzdxhjTpHr7lj\n23aXZVllW7ZsaRtqTFqEV+lugJUU8HoehvFL6vZ6Egaibs5RM3eom3PUzB3q5hw1cyfyX8FVSqPw\nCgAAAPPxD1sAAAAwBuEVAAAAxiC8AgAAwBiEVwAAABiD8AoAAABjEF4BAABgDMIrAAAAjEF4BQAA\ngDEIrwAAADAG4RUAAADGILwCAADAGIRXAAAAGIPwCgAAAGMQXgEAAGAMwisAAACMQXgFAACAMQiv\nAAAAMAbhFQAAAMYgvAIAAMAYhFcAAAAYg/AKAAAAYxBeAQAAYAzCKwAAAIxBeAUAAIAxCK8AAAAw\nBuEVAAAAxiC8AgAAwBj/B3tfessxFI6oAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2096,7 +2460,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 110, "metadata": { "collapsed": false }, @@ -2113,6 +2477,24 @@ " return self[key]" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -2139,11 +2521,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" - }, - "widgets": { - "state": {}, - "version": "1.1.1" + "version": "3.5.2" } }, "nbformat": 4, From 5c656480d072a11147c19b55da8ca15dac0ba535 Mon Sep 17 00:00:00 2001 From: vfdev Date: Tue, 27 Dec 2016 22:36:30 +0100 Subject: [PATCH 5/5] Fix bugs in uniform cost search --- search-4e.ipynb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/search-4e.ipynb b/search-4e.ipynb index ca531af3d..dfd3146eb 100644 --- a/search-4e.ipynb +++ b/search-4e.ipynb @@ -728,10 +728,12 @@ " explored.add(node.state)\n", " for action in problem.actions(node.state):\n", " child = node.child(problem, action)\n", - " if child.state not in explored and child not in frontier:\n", + " if child.state not in explored and child.state not in frontier:\n", " frontier.add(child)\n", - " elif child in frontier and frontier.cost[child] < child.path_cost:\n", - " frontier.replace(child)" + " elif child.state in frontier:\n", + " incumbent = frontier.states[child.state]\n", + " if child.path_cost < frontier.costfn(incumbent):\n", + " frontier.replace(child)" ] }, {