From 2881c523dede4f61c77538ae33e06358c37d4f30 Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Tue, 12 Jul 2016 13:20:48 -0700 Subject: [PATCH 01/11] Added Hello World File --- projects/1-hello-world/zhong.ipynb | 63 ++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 projects/1-hello-world/zhong.ipynb diff --git a/projects/1-hello-world/zhong.ipynb b/projects/1-hello-world/zhong.ipynb new file mode 100644 index 0000000..0cc0121 --- /dev/null +++ b/projects/1-hello-world/zhong.ipynb @@ -0,0 +1,63 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "My name is Joey. I have a decent amount of experience in compettive programming (i had reached gold in USACO). Outside of computing and programming, I am a avid chess player, swimmer, and badminton player\n" + ] + } + ], + "source": [ + "print('My name is Joey. I have a decent amount of experience in compettive programming (i had reached gold in USACO). Outside of computing and programming, I am a avid chess player, swimmer, and badminton player')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [Root]", + "language": "python", + "name": "Python [Root]" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From c7c63c3a81ff1d91f69a014a0a28696834eb6c02 Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Tue, 12 Jul 2016 13:24:38 -0700 Subject: [PATCH 02/11] Tweak --- projects/1-hello-world/zhong.ipynb | 34 +++--------------------------- 1 file changed, 3 insertions(+), 31 deletions(-) diff --git a/projects/1-hello-world/zhong.ipynb b/projects/1-hello-world/zhong.ipynb index 0cc0121..d09ad4e 100644 --- a/projects/1-hello-world/zhong.ipynb +++ b/projects/1-hello-world/zhong.ipynb @@ -1,41 +1,13 @@ { "cells": [ { - "cell_type": "code", - "execution_count": 1, + "cell_type": "markdown", "metadata": { - "collapsed": false + "collapsed": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "My name is Joey. I have a decent amount of experience in compettive programming (i had reached gold in USACO). Outside of computing and programming, I am a avid chess player, swimmer, and badminton player\n" - ] - } - ], "source": [ - "print('My name is Joey. I have a decent amount of experience in compettive programming (i had reached gold in USACO). Outside of computing and programming, I am a avid chess player, swimmer, and badminton player')\n" + "My name is Joey. I have a decent amount of experience in compettive programming (i had reached gold in USACO). Outside of computing and programming, I am a avid chess player, swimmer, and badminton player" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { From 9b76df22b4421ef505946a4c3c94dffa131a2a2f Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Tue, 12 Jul 2016 13:45:19 -0700 Subject: [PATCH 03/11] Final Edits Made edits and formatting. --- projects/1-explications/Zhong | 0 projects/1-hello-world/zhong.ipynb | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 projects/1-explications/Zhong diff --git a/projects/1-explications/Zhong b/projects/1-explications/Zhong new file mode 100644 index 0000000..e69de29 diff --git a/projects/1-hello-world/zhong.ipynb b/projects/1-hello-world/zhong.ipynb index d09ad4e..c5667c3 100644 --- a/projects/1-hello-world/zhong.ipynb +++ b/projects/1-hello-world/zhong.ipynb @@ -6,7 +6,9 @@ "collapsed": true }, "source": [ - "My name is Joey. I have a decent amount of experience in compettive programming (i had reached gold in USACO). Outside of computing and programming, I am a avid chess player, swimmer, and badminton player" + "Hi Joe! My name is Joey. I am from Toronto, Ontario, Canada and this is my first time visiting California. I am currently 16 years old and I am going into grade 11 next year. \n", + "\n", + "I have a decent amount of experience in compettive programming (i had reached gold in USACO). Outside of computing and programming, I am a avid chess player, swimmer, and badminton player. I hope that by the end of this course, I will learn a lot more about AI and hopefully bea ble to use the lessons in this coruse to create a project of my own. In addition, I hope to make new friends in the next three weeks." ] } ], From 9c8e3a940b294ea498197d0ae335e535d7cf3998 Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Tue, 12 Jul 2016 14:16:10 -0700 Subject: [PATCH 04/11] Added explication file Explication about the komodo dragon chess engine. --- projects/1-explications/Zhong | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/projects/1-explications/Zhong b/projects/1-explications/Zhong index e69de29..9c93eb8 100644 --- a/projects/1-explications/Zhong +++ b/projects/1-explications/Zhong @@ -0,0 +1,5 @@ + Chess engines are relatively recent inventions that completely altered the competitive chess world. Now any chess player training without a chess engine is severely disadvantaged against his/her competitors. One of the first chess AI, Deep Blue, debuted in the 90s and managed to take multiple games off of the world champion at that time, Garry Kasparov. The ability for chess engines to come up with strong moves have dramatically improved over the years. The strongest engines in the world are rated approximately with an elo of 3300, while the strongest players in the world only have an elo of 2800. + + Komodo Dragon is a chess engine that is regarded as the strongest in the world by many Grandmasters and players alike. Komodo proved this by recently winning a competition amongst other chess engines such as Rybka and Fritz. The basis of the engine was written by Don Dailey and US chess grandmaster Larry Kaufman in the C language starting from the 1990s. The purpose of chess engines is to help players analyze their games, because the computer can come up with moves that humans would take forever to think of. Dailey and Kaufman wanted to create a chess engine like no other using new search algorithms and heuristics. + + Most chess engines use the alpha-beta pruning search algorithm in order to give users the best moves, and search algorithms like alpha-beta pruning make up the central concept of the Komodo Dragon. However, Dailey implemented a new evaluation system that improved how the AI "thought" and the Komodo Dragon uses a knowledge based balance evaluation in order to trump its competitor engines. In addition, Kaufman has said that the engine uses some other techniques in order to think more like a human and make moves that wouldn’t seem artificial – something that many other engines have failed to do. From 1f10084981b40c8c5cec3620bb3561304d3f54bb Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Wed, 13 Jul 2016 15:01:33 -0700 Subject: [PATCH 05/11] Finished task --- .../Python and State Machines.ipynb | 9 +- projects/2-state-machines/Zhong.ipynb | 532 ++++++++++++++++++ 2 files changed, 537 insertions(+), 4 deletions(-) create mode 100644 projects/2-state-machines/Zhong.ipynb diff --git a/projects/2-state-machines/Python and State Machines.ipynb b/projects/2-state-machines/Python and State Machines.ipynb index f005eb9..bd0f110 100644 --- a/projects/2-state-machines/Python and State Machines.ipynb +++ b/projects/2-state-machines/Python and State Machines.ipynb @@ -70,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -427,10 +427,11 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [Root]", "language": "python", - "name": "python3" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -442,7 +443,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/projects/2-state-machines/Zhong.ipynb b/projects/2-state-machines/Zhong.ipynb new file mode 100644 index 0000000..e2e9f2c --- /dev/null +++ b/projects/2-state-machines/Zhong.ipynb @@ -0,0 +1,532 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Background" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "State machines, like most transition systems, are defined in terms of their set of states, their initial state, their terminal states, and the valid transitions between the states. State machines are still used widely in game character AI, but they also show up in various guises all over computer science (for example in regular expressions, program verification, cyber-physical systems, ...). A solid understanding of transition systems is key to understanding many different research areas.\n", + "\n", + "Today's assignment is to use state machines in a couple of different ways to get used to reading and writing Python code, and to get a feel for what can be done with state machines.\n", + "\n", + "First, we want to create a data type to represent state machines. In Python, the custom data type is the `class`. We know that it will be initialized with a set of states and edges, an initial state, and some terminal states, and creating a state machine should look something like:\n", + "\n", + "```python\n", + "ab_a_ = StateMachine(\n", + " #We can define the states and edges in one go\n", + " [(\"s1\", \"a\", \"s2\"), (\"s2\", \"b\", \"s3\"), (\"s3\", \"a\", \"s3\")],\n", + " #Initial state\n", + " \"s1\",\n", + " #Terminal states\n", + " [\"s3\"]\n", + ")\n", + "```\n", + "\n", + "To recap:\n", + "\n", + "* `ab_a_ = ...` assigns the result of evaluating the right hand side to the variable `ab_a_`.\n", + "* `StateMachine(...)` creates a new object of the StateMachine class\n", + "* `[...]` is a comma-separated list of arbitrary \"things\". This list could grow or shrink but the key idea is that its length is unknown in advance to the code that's processing it (usually necessitating some kind of iteration or recursion over the length of the list).\n", + "* `(...)` without a word to its left is a \"tuple\", a fixed-length sequence of objects. Here, each 3-tuple defines the source state, the transition symbol, and the target state. (If there were a word to the left of the parentheses, it would be a function call as in the case of `StateMachine(...)`).\n", + "* `\"...\"` is a \"string\", a sequence of characters.\n", + "\n", + "Putting it all together, the line above makes a machine with three states that accepts `aba+`, if written as a regular expression (and stores the machine into the variable `ab_a_`): any string with the prefix `ab` followed by one or more `a`. Here's `ab(cab)+d`, `ab` followed by one or more repetitions of `cab` ending with a `d`:\n", + "\n", + "```python\n", + "ab_cab_d = StateMachine(\n", + " [(\"s1\", \"a\", \"s2\"),\n", + " (\"s2\", \"b\", \"s3\"), # The same so far...\n", + " (\"s3\", \"c\", \"s4\"),\n", + " (\"s4\", \"a\", \"s5\"),\n", + " (\"s5\", \"b\", \"s6\"),\n", + " (\"s6\", \"c\", \"s4\"), # Note the loop back to s4 on \"c\"\n", + " (\"s6\", \"d\", \"s7\")], # Or else the continuation to s7 on \"d\"\n", + " \"s1\",\n", + " [\"s7\"]\n", + ")\n", + "```\n", + "\n", + "We have two questions of interest for any transition system:\n", + "\n", + "* What is the current configuration?\n", + "* What configurations are accessible from the current configuration, and how?\n", + "\n", + "In our case, we can use e.g. `ab_a_.state` to get its current state identifier, and `ab_a_.out_edges()` to get a Python `dict` of the successors (with `ab_a_.out_edges().keys()` yielding the symbols and the `ab_a_.out_edgdes().values()` giving the successor states).\n", + "\n", + "There is one operation on state machines that we're interested in right now:\n", + "\n", + "* Advance the state machine along a particular available edge.\n", + "\n", + "We can write e.g. `ab_a_.advance(\"a\")` to advance the `ab_a_` machine by feeding it the symbol `\"a\"`. If it starts in state `\"s1\"`, this will put it into state `\"s2\"`. Then we can call `ab_a_.advance(\"b\")` to feed it a `\"b\"` and advance it to `\"s3\"`, and so on. It is an error to call `advance` with an unavailable or invalid symbol.\n", + "\n", + "Now that we know what the StateMachine class should look like, we can define it. Recall that Python is indentation-sensitive:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class StateMachine:\n", + " # __init__ defines the function to be called when `StateMachine(...)` is invoked.\n", + " # Note that, like other instance methods on `StateMachine`, the first argument is `self`:\n", + " # the particular state machine being operated upon (in this case, initialized). `self` is\n", + " # provided implicitly in most cases.\n", + " # `edges` should be a list of 3-tuples of strings, init-state should be a string, and terminals a list of strings.\n", + " def __init__(self, edges, init_state, terminals):\n", + " # We create a `states` variable on `self` to store the transition system information.\n", + " # It will be a dict whose keys are state identifiers and whose values are themselves dicts\n", + " # of successor states keyed by symbols.\n", + " self.states = dict()\n", + " # `for X in C` iterates over each member `X` of collection `C`.\n", + " # Since we know `C` (`edges`) contains 3-tuples, we can \"unpack\" them using the tuple notation in place of `X`.\n", + " for (src, symbol, dest) in edges:\n", + " # Ensure that the state referred to by `src` exists in the transition system as a dict (again, symbols->states):\n", + " if src not in self.states:\n", + " self.states[src] = dict()\n", + " # Ditto for `dest`.\n", + " if dest not in self.states:\n", + " self.states[dest] = dict()\n", + " # Ensure that the symbol is not already used in an out-edge of src. This is a deterministic state machine which\n", + " # can't make \"guesses\" in such cases.\n", + " if symbol in self.states[src]:\n", + " # Exceptions are informative failures that other code can catch and deal with; they represent exceptional\n", + " # cases which this code is not in a position to recover from.\n", + " raise Exception(\"This StateMachine only supports DFAs, so each state can have at most one out edge for each symbol.\")\n", + " # Finally, connect the `s`ou`rc`e state to the `dest`ination state along `symbol`.\n", + " self.states[src][symbol] = dest\n", + " # This state machine starts in the initial state\n", + " self.state = init_state\n", + " # And we remember the terminal states so that we know when we're accepting.\n", + " # The list is packed into a `set()`, which permits us to say `state_id in self.terminal_states` to simplify checking.\n", + " # You can think of sets as being like dicts of type Anything->True: \n", + " # The object is in the set if and only if the key is present.\n", + " self.terminal_states = set(terminals)\n", + "\n", + " # Determining the available out-edges is straightforward because of the way we've chosen to represent the\n", + " # transition system.\n", + " def out_edges(self):\n", + " # Return the out edges of the currently active state.\n", + " return self.states[self.state]\n", + " \n", + " # A state machine is in a terminal state if its current state is terminal\n", + " def is_terminal(self):\n", + " # Is the current state in the set of terminal states?\n", + " return self.state in self.terminal_states\n", + "\n", + " # A state machine is stuck if it has no out edges.\n", + " def is_stuck(self):\n", + " return len(self.out_edges()) == 0\n", + " \n", + " # Finally, to advance the state machine by a symbol...\n", + " def advance(self, symbol):\n", + " # We reassign the machine's state to be the target state denoted by that symbol, among the current out edges.\n", + " self.state = self.out_edges()[symbol]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With all that done, we can finally say:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial state: s1\n", + "Accepting? False\n", + "After a: s2\n", + "After ab: s3\n", + "Next steps: {'a': 's3'}\n", + "Accepting? True\n" + ] + } + ], + "source": [ + "ab_a_ = StateMachine(\n", + " #We can define the states and edges in one go\n", + " [(\"s1\", \"a\", \"s2\"), (\"s2\", \"b\", \"s3\"), (\"s3\", \"a\", \"s3\")],\n", + " #Initial state\n", + " \"s1\",\n", + " #Terminal states\n", + " [\"s3\"]\n", + ")\n", + "print(\"Initial state:\", ab_a_.state) # note, no parens after `state` because it's a value field and not a function\n", + "print(\"Accepting?\", ab_a_.is_terminal()) # parens after `is_terminal` to _call_ it.\n", + "ab_a_.advance(\"a\")\n", + "print(\"After a:\", ab_a_.state)\n", + "ab_a_.advance(\"b\")\n", + "print(\"After ab:\", ab_a_.state)\n", + "print(\"Next steps:\", ab_a_.out_edges())\n", + "print(\"Accepting?\", ab_a_.is_terminal())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first part of the assignment is to define the function `check(...)` below:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def check(sm, string):\n", + " for c in string:\n", + " if c in sm.out_edges():\n", + " sm.advance(c)\n", + " else:\n", + " return False\n", + " return sm.is_terminal()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It should give the correct results for at least these examples, and we encourage you to try out more tests." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Test suite 1. Should not throw any errors.\n", + "# (First, we define a function to produce the test state machine so we can use a fresh one every time.)\n", + "def test1():\n", + " # This one accepts \"h(e(llo|y) | i(hi)*)\n", + " return StateMachine(\n", + " [(\"s1\", \"h\", \"s2\"), (\"s2\", \"e\", \"s3\"), \n", + " (\"s3\", \"y\", \"s4\"), \n", + " (\"s3\", \"l\", \"s5\"), (\"s5\", \"l\", \"s6\"), (\"s6\", \"o\", \"s7\"),\n", + " (\"s2\", \"i\", \"s8\"), (\"s8\", \"h\", \"s9\"), (\"s9\", \"i\", \"s8\")\n", + " ],\n", + " \"s1\",\n", + " [\"s4\", \"s7\", \"s8\"]\n", + " )\n", + "assert check(test1(), \"hello\")\n", + "assert check(test1(), \"hey\")\n", + "assert check(test1(), \"hi\")\n", + "assert check(test1(), \"hihi\")\n", + "assert check(test1(), \"hihihi\")\n", + "assert not check(test1(), \"greetings\")\n", + "assert not check(test1(), \"hel\")\n", + "assert not check(test1(), \"helloy\")\n", + "assert not check(test1(), \"hih\")\n", + "assert not check(test1(), \"heyhey\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, define a state machine which accepts email addresses consisting only of the letter \"x\" and the symbols \"@\" and \".\" (in other words, you don't need a ton of edges). Devise tests for it below (try to be sinister---get a partner to come up with adversarial examples too)." + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def test2():\n", + " # TODO: define transition system here:\n", + " return StateMachine([(\"s1\", \"x\", \"s2\"), (\"s2\", \"x\", \"s2\"), (\"s2\", \"@\", \"s3\"), (\"s3\", \"x\", \"s4\"),\n", + " (\"s4\", \"x\", \"s4\"), (\"s4\", \".\", \"s5\"), (\"s5\", \"x\", \"s6\"), (\"s6\", \"x\", \"s6\"), \n", + " (\"s1\", \".\", \"s7\"), (\"s7\", \"x\", \"s8\"), (\"s8\", \"x\", \"s8\"), (\"s8\", \"@\", \"s2\")], \n", + " \"s1\",\n", + " [\"s6\"])\n", + "# TODO: tests go here\n", + "\n", + "\n", + "assert not check(test2(), \"@x.x\")\n", + "assert not check(test2(), \"x@.x\")\n", + "assert not check(test2(), \"x@x.\")\n", + "assert not check(test2(), \"x@x\")\n", + "assert not check(test2(), \"x.x\")\n", + "assert not check(test2(), \"x@\")\n", + "assert not check(test2(), \"x@x..x\")\n", + "#assert check(test2(), \"xxx\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define a function which, given a state machine, generates all the strings of a given (exact) length that the state machine would accept.\n", + "\n", + "If you have an intuition on how to do this, feel free to try it! Insert your attempt and its tests in the empty code cell just after this one. Then come back and take a look at the approach below." + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['x.x@x', 'xx.x@x', 'x.xx@x', 'x.x@xx', 'x.x@@x.', 'xxx.x@x', 'xx.xx@x', 'x.xxx@x', 'xx.x@xx', 'x.xx@xx', 'x.x@xxx', 'xx.x@@x.', 'x.xx@@x.', 'x.x@x@x.', 'x.x@@xx.', 'xxxx.x@x', 'xxx.xx@x', 'xx.xxx@x', 'x.xxxx@x', 'xxx.x@xx', 'xx.xx@xx', 'x.xxx@xx', 'xx.x@xxx', 'x.xx@xxx', 'x.x@xxxx', 'xxx.x@@x.', 'xx.xx@@x.', 'x.xxx@@x.', 'xx.x@x@x.', 'x.xx@x@x.', 'x.x@xx@x.', 'xx.x@@xx.', 'x.xx@@xx.', 'x.x@x@xx.', 'x.x@@xxx.', 'xxxxx.x@x', 'xxxx.xx@x', 'xxx.xxx@x', 'xx.xxxx@x', 'x.xxxxx@x', 'xxxx.x@xx', 'xxx.xx@xx', 'xx.xxx@xx', 'x.xxxx@xx', 'xxx.x@xxx', 'xx.xx@xxx', 'x.xxx@xxx', 'xx.x@xxxx', 'x.xx@xxxx', 'x.x@xxxxx', 'xxxx.x@@x.', 'xxx.xx@@x.', 'xx.xxx@@x.', 'x.xxxx@@x.', 'xxx.x@x@x.', 'xx.xx@x@x.', 'x.xxx@x@x.', 'xx.x@xx@x.', 'x.xx@xx@x.', 'x.x@xxx@x.', 'xxx.x@@xx.', 'xx.xx@@xx.', 'x.xxx@@xx.', 'xx.x@x@xx.', 'x.xx@x@xx.', 'x.x@xx@xx.', 'xx.x@@xxx.', 'x.xx@@xxx.', 'x.x@x@xxx.', 'x.x@@xxxx.', 'xxxxxx.x@x', 'xxxxx.xx@x', 'xxxx.xxx@x', 'xxx.xxxx@x', 'xx.xxxxx@x', 'x.xxxxxx@x', 'xxxxx.x@xx', 'xxxx.xx@xx', 'xxx.xxx@xx', 'xx.xxxx@xx', 'x.xxxxx@xx', 'xxxx.x@xxx', 'xxx.xx@xxx', 'xx.xxx@xxx', 'x.xxxx@xxx', 'xxx.x@xxxx', 'xx.xx@xxxx', 'x.xxx@xxxx', 'xx.x@xxxxx', 'x.xx@xxxxx', 'x.x@xxxxxx']\n" + ] + } + ], + "source": [ + "def dfs(sm, length, s):\n", + " if length == 0:\n", + " if sm.is_terminal():\n", + " return [s]\n", + " else:\n", + " return []\n", + " \n", + " temp = sm.state\n", + " ret = []\n", + " \n", + " for e in sm.out_edges():\n", + " sm.advance(e)\n", + " ret += dfs(sm, length - 1, e + s)\n", + " sm.state = temp\n", + " \n", + " return ret\n", + "\n", + "\n", + "assert len(dfs(test2(), 0, \"\")) == 0\n", + "assert len(dfs(test2(), 1, \"\")) == 0\n", + "assert len(dfs(test2(), 2, \"\")) == 0\n", + "assert len(dfs(test2(), 3, \"\")) == 0\n", + "assert len(dfs(test2(), 4, \"\")) == 0\n", + "assert len(dfs(test2(), 5, \"\")) == 1\n", + "assert len(dfs(test2(), 6, \"\")) == 3\n", + "assert len(dfs(test2(), 7, \"\")) == 7\n", + "assert len(dfs(test2(), 8, \"\")) == 14\n", + "\n", + "all_samples = []\n", + "for i in range(0, 11):\n", + " all_samples = all_samples + dfs(test2(), i, \"\")\n", + "print(all_samples)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that any path through a state machine ending in a terminal state is a valid string, and each step of the path is associated with a symbol (i.e., a letter). To combine symbols together into strings, you can use string concatenation:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ab = \"a\" + \"b\"\n", + "print(ab)\n", + "abc = ab + \"c\"\n", + "print(abc)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can combine lists the same way:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lst_abc = [\"a\",\"b\"] + [\"c\"]\n", + "print(lst_abc)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All that's left is enumerating the valid paths of a given length and assembling those into strings. The skeleton below is a _recursive_ function that calls itself repeatedly, branching out according to each option. You can imagine that the call to `sample()` is the root of a tree of calls to `sample2`, and the paths through that tree are paths through the state machine---the path itself is \"stored\" in the third argument to `sample2`. In other words:\n", + "\n", + "* To get the possible paths of length `K` from a state machine `SM`:\n", + " * Initialize `S` to `SM`'s current state.\n", + " * Initialize the `result` to `[]`\n", + " * For each available out-edge at `S`:\n", + " * Advance `SM` along that edge\n", + " * Get the possible paths of length `K-1` from `SM` and add them to the result\n", + " * Put `SM` back into state `S` (so we can advance it along the next available out edge)\n", + " * Yield `result`\n", + "\n", + "It's up to you to figure out how to find the possible paths of length 0. Hint: How many such paths can there be for a given call to `sample2(sm, 0, sofar)`? What aspects of the state machine's status does it depend on?" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Starter function that calls sample2() with an empty string as argument. This is just to \"accumulate\" paths into\n", + "# that argument without tracking a bunch of data externally.\n", + "def sample(sm, length):\n", + " return sample2(sm, length, \"\")\n", + "\n", + "# sample2 samples paths of length \"length\" from the state machine sm as of its current state.\n", + "# sofar is the path assembled so far.\n", + "# sample2 returns a list of paths.\n", + "def sample2(sm, length, sofar):\n", + " if length == 0:\n", + " # TODO: What path(s) should be returned? When?\n", + " return []\n", + " state = sm.state\n", + " result = []\n", + " # TODO: implement the rest of the pseudocode above\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AssertionError", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32massert\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAssertionError\u001b[0m: " + ] + } + ], + "source": [ + "assert len(sample(test2(), 0)) == 0\n", + "assert len(sample(test2(), 1)) == 0\n", + "assert len(sample(test2(), 2)) == 0\n", + "assert len(sample(test2(), 3)) == 0\n", + "assert len(sample(test2(), 4)) == 0\n", + "assert len(sample(test2(), 5)) == 1\n", + "assert len(sample(test2(), 6)) == 3\n", + "assert len(sample(test2(), 7)) == 7\n", + "assert len(sample(test2(), 8)) == 14\n", + "\n", + "all_samples = []\n", + "for i in range(0, 9):\n", + " all_samples = all_samples + sample(test2(), i)\n", + "print(all_samples)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# What's next?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you like (and have time), define more test state machines in new test cells (test3, test4, etc). What types of string are easy to recognize, and which seem hard---or even impossible? You might want to try some of these and determine whether they're possible within the limits of state machines:\n", + "\n", + "* Phone numbers\n", + "* URLs\n", + "* Palindromes\n", + "* HTML tags\n", + "* English-language numbers (e.g. \"seventy-one\", \"nineteen\", \"six\", \"one hundred and one\")\n", + "* Roman numerals\n", + "\n", + "Another (bigger) project might be to write a regular expression compiler to generate state machines from regular expressions---even just supporting concatenation and Kleene star would be a fun exercise for an evening!\n", + "\n", + "If you have an interest in the theory behind computer science, you might want to implement a non-deterministic automaton which can be in (or start in) several states simultaneously, may have out-edges to multiple distinct states on a given symbol, or may even have \"null\" or \"epsilon\" transitions which can be taken without consuming any input at all! Another good project here might involve taking the intersection or union of two languages (by manipulating their state machines)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [Root]", + "language": "python", + "name": "Python [Root]" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 1de49ba5a8a035dc853ba0c95bdf1aeb24454270 Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Wed, 13 Jul 2016 15:18:24 -0700 Subject: [PATCH 06/11] Delete example file --- .../Python and State Machines.ipynb | 451 ------------------ 1 file changed, 451 deletions(-) delete mode 100644 projects/2-state-machines/Python and State Machines.ipynb diff --git a/projects/2-state-machines/Python and State Machines.ipynb b/projects/2-state-machines/Python and State Machines.ipynb deleted file mode 100644 index bd0f110..0000000 --- a/projects/2-state-machines/Python and State Machines.ipynb +++ /dev/null @@ -1,451 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Background" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "State machines, like most transition systems, are defined in terms of their set of states, their initial state, their terminal states, and the valid transitions between the states. State machines are still used widely in game character AI, but they also show up in various guises all over computer science (for example in regular expressions, program verification, cyber-physical systems, ...). A solid understanding of transition systems is key to understanding many different research areas.\n", - "\n", - "Today's assignment is to use state machines in a couple of different ways to get used to reading and writing Python code, and to get a feel for what can be done with state machines.\n", - "\n", - "First, we want to create a data type to represent state machines. In Python, the custom data type is the `class`. We know that it will be initialized with a set of states and edges, an initial state, and some terminal states, and creating a state machine should look something like:\n", - "\n", - "```python\n", - "ab_a_ = StateMachine(\n", - " #We can define the states and edges in one go\n", - " [(\"s1\", \"a\", \"s2\"), (\"s2\", \"b\", \"s3\"), (\"s3\", \"a\", \"s3\")],\n", - " #Initial state\n", - " \"s1\",\n", - " #Terminal states\n", - " [\"s3\"]\n", - ")\n", - "```\n", - "\n", - "To recap:\n", - "\n", - "* `ab_a_ = ...` assigns the result of evaluating the right hand side to the variable `ab_a_`.\n", - "* `StateMachine(...)` creates a new object of the StateMachine class\n", - "* `[...]` is a comma-separated list of arbitrary \"things\". This list could grow or shrink but the key idea is that its length is unknown in advance to the code that's processing it (usually necessitating some kind of iteration or recursion over the length of the list).\n", - "* `(...)` without a word to its left is a \"tuple\", a fixed-length sequence of objects. Here, each 3-tuple defines the source state, the transition symbol, and the target state. (If there were a word to the left of the parentheses, it would be a function call as in the case of `StateMachine(...)`).\n", - "* `\"...\"` is a \"string\", a sequence of characters.\n", - "\n", - "Putting it all together, the line above makes a machine with three states that accepts `aba+`, if written as a regular expression (and stores the machine into the variable `ab_a_`): any string with the prefix `ab` followed by one or more `a`. Here's `ab(cab)+d`, `ab` followed by one or more repetitions of `cab` ending with a `d`:\n", - "\n", - "```python\n", - "ab_cab_d = StateMachine(\n", - " [(\"s1\", \"a\", \"s2\"),\n", - " (\"s2\", \"b\", \"s3\"), # The same so far...\n", - " (\"s3\", \"c\", \"s4\"),\n", - " (\"s4\", \"a\", \"s5\"),\n", - " (\"s5\", \"b\", \"s6\"),\n", - " (\"s6\", \"c\", \"s4\"), # Note the loop back to s4 on \"c\"\n", - " (\"s6\", \"d\", \"s7\")], # Or else the continuation to s7 on \"d\"\n", - " \"s1\",\n", - " [\"s7\"]\n", - ")\n", - "```\n", - "\n", - "We have two questions of interest for any transition system:\n", - "\n", - "* What is the current configuration?\n", - "* What configurations are accessible from the current configuration, and how?\n", - "\n", - "In our case, we can use e.g. `ab_a_.state` to get its current state identifier, and `ab_a_.out_edges()` to get a Python `dict` of the successors (with `ab_a_.out_edges().keys()` yielding the symbols and the `ab_a_.out_edgdes().values()` giving the successor states).\n", - "\n", - "There is one operation on state machines that we're interested in right now:\n", - "\n", - "* Advance the state machine along a particular available edge.\n", - "\n", - "We can write e.g. `ab_a_.advance(\"a\")` to advance the `ab_a_` machine by feeding it the symbol `\"a\"`. If it starts in state `\"s1\"`, this will put it into state `\"s2\"`. Then we can call `ab_a_.advance(\"b\")` to feed it a `\"b\"` and advance it to `\"s3\"`, and so on. It is an error to call `advance` with an unavailable or invalid symbol.\n", - "\n", - "Now that we know what the StateMachine class should look like, we can define it. Recall that Python is indentation-sensitive:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "class StateMachine:\n", - " # __init__ defines the function to be called when `StateMachine(...)` is invoked.\n", - " # Note that, like other instance methods on `StateMachine`, the first argument is `self`:\n", - " # the particular state machine being operated upon (in this case, initialized). `self` is\n", - " # provided implicitly in most cases.\n", - " # `edges` should be a list of 3-tuples of strings, init-state should be a string, and terminals a list of strings.\n", - " def __init__(self, edges, init_state, terminals):\n", - " # We create a `states` variable on `self` to store the transition system information.\n", - " # It will be a dict whose keys are state identifiers and whose values are themselves dicts\n", - " # of successor states keyed by symbols.\n", - " self.states = dict()\n", - " # `for X in C` iterates over each member `X` of collection `C`.\n", - " # Since we know `C` (`edges`) contains 3-tuples, we can \"unpack\" them using the tuple notation in place of `X`.\n", - " for (src, symbol, dest) in edges:\n", - " # Ensure that the state referred to by `src` exists in the transition system as a dict (again, symbols->states):\n", - " if src not in self.states:\n", - " self.states[src] = dict()\n", - " # Ditto for `dest`.\n", - " if dest not in self.states:\n", - " self.states[dest] = dict()\n", - " # Ensure that the symbol is not already used in an out-edge of src. This is a deterministic state machine which\n", - " # can't make \"guesses\" in such cases.\n", - " if symbol in self.states[src]:\n", - " # Exceptions are informative failures that other code can catch and deal with; they represent exceptional\n", - " # cases which this code is not in a position to recover from.\n", - " raise Exception(\"This StateMachine only supports DFAs, so each state can have at most one out edge for each symbol.\")\n", - " # Finally, connect the `s`ou`rc`e state to the `dest`ination state along `symbol`.\n", - " self.states[src][symbol] = dest\n", - " # This state machine starts in the initial state\n", - " self.state = init_state\n", - " # And we remember the terminal states so that we know when we're accepting.\n", - " # The list is packed into a `set()`, which permits us to say `state_id in self.terminal_states` to simplify checking.\n", - " # You can think of sets as being like dicts of type Anything->True: \n", - " # The object is in the set if and only if the key is present.\n", - " self.terminal_states = set(terminals)\n", - "\n", - " # Determining the available out-edges is straightforward because of the way we've chosen to represent the\n", - " # transition system.\n", - " def out_edges(self):\n", - " # Return the out edges of the currently active state.\n", - " return self.states[self.state]\n", - " \n", - " # A state machine is in a terminal state if its current state is terminal\n", - " def is_terminal(self):\n", - " # Is the current state in the set of terminal states?\n", - " return self.state in self.terminal_states\n", - "\n", - " # A state machine is stuck if it has no out edges.\n", - " def is_stuck(self):\n", - " return len(self.out_edges()) == 0\n", - " \n", - " # Finally, to advance the state machine by a symbol...\n", - " def advance(self, symbol):\n", - " # We reassign the machine's state to be the target state denoted by that symbol, among the current out edges.\n", - " self.state = self.out_edges()[symbol]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With all that done, we can finally say:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "ab_a_ = StateMachine(\n", - " #We can define the states and edges in one go\n", - " [(\"s1\", \"a\", \"s2\"), (\"s2\", \"b\", \"s3\"), (\"s3\", \"a\", \"s3\")],\n", - " #Initial state\n", - " \"s1\",\n", - " #Terminal states\n", - " [\"s3\"]\n", - ")\n", - "print(\"Initial state:\", ab_a_.state) # note, no parens after `state` because it's a value field and not a function\n", - "print(\"Accepting?\", ab_a_.is_terminal()) # parens after `is_terminal` to _call_ it.\n", - "ab_a_.advance(\"a\")\n", - "print(\"After a:\", ab_a_.state)\n", - "ab_a_.advance(\"b\")\n", - "print(\"After ab:\", ab_a_.state)\n", - "print(\"Next steps:\", ab_a_.out_edges())\n", - "print(\"Accepting?\", ab_a_.is_terminal())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Assignment 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first part of the assignment is to define the function `check(...)` below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def check(sm, string):\n", - " return True # FIXME: if and only if `sm` accepts `string`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It should give the correct results for at least these examples, and we encourage you to try out more tests." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Test suite 1. Should not throw any errors.\n", - "# (First, we define a function to produce the test state machine so we can use a fresh one every time.)\n", - "def test1():\n", - " # This one accepts \"h(e(llo|y) | i(hi)*)\n", - " return StateMachine(\n", - " [(\"s1\", \"h\", \"s2\"), (\"s2\", \"e\", \"s3\"), \n", - " (\"s3\", \"y\", \"s4\"), \n", - " (\"s3\", \"l\", \"s5\"), (\"s5\", \"l\", \"s6\"), (\"s6\", \"o\", \"s7\"),\n", - " (\"s2\", \"i\", \"s8\"), (\"s8\", \"h\", \"s9\"), (\"s9\", \"i\", \"s8\")\n", - " ],\n", - " \"s1\",\n", - " [\"s4\", \"s7\", \"s8\"]\n", - " )\n", - "assert check(test1(), \"hello\")\n", - "assert check(test1(), \"hey\")\n", - "assert check(test1(), \"hi\")\n", - "assert check(test1(), \"hihi\")\n", - "assert check(test1(), \"hihihi\")\n", - "assert not check(test1(), \"greetings\")\n", - "assert not check(test1(), \"hel\")\n", - "assert not check(test1(), \"helloy\")\n", - "assert not check(test1(), \"hih\")\n", - "assert not check(test1(), \"heyhey\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, define a state machine which accepts email addresses consisting only of the letter \"x\" and the symbols \"@\" and \".\" (in other words, you don't need a ton of edges). Devise tests for it below (try to be sinister---get a partner to come up with adversarial examples too)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def test2():\n", - " # TODO: define transition system here:\n", - " return StateMachine([],\n", - " \"s1\",\n", - " [])\n", - "# TODO: tests go here\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Assignment 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define a function which, given a state machine, generates all the strings of a given (exact) length that the state machine would accept.\n", - "\n", - "If you have an intuition on how to do this, feel free to try it! Insert your attempt and its tests in the empty code cell just after this one. Then come back and take a look at the approach below." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def try_sample(sm, length):\n", - " return []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that any path through a state machine ending in a terminal state is a valid string, and each step of the path is associated with a symbol (i.e., a letter). To combine symbols together into strings, you can use string concatenation:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "ab = \"a\" + \"b\"\n", - "print(ab)\n", - "abc = ab + \"c\"\n", - "print(abc)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can combine lists the same way:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "lst_abc = [\"a\",\"b\"] + [\"c\"]\n", - "print(lst_abc)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "All that's left is enumerating the valid paths of a given length and assembling those into strings. The skeleton below is a _recursive_ function that calls itself repeatedly, branching out according to each option. You can imagine that the call to `sample()` is the root of a tree of calls to `sample2`, and the paths through that tree are paths through the state machine---the path itself is \"stored\" in the third argument to `sample2`. In other words:\n", - "\n", - "* To get the possible paths of length `K` from a state machine `SM`:\n", - " * Initialize `S` to `SM`'s current state.\n", - " * Initialize the `result` to `[]`\n", - " * For each available out-edge at `S`:\n", - " * Advance `SM` along that edge\n", - " * Get the possible paths of length `K-1` from `SM` and add them to the result\n", - " * Put `SM` back into state `S` (so we can advance it along the next available out edge)\n", - " * Yield `result`\n", - "\n", - "It's up to you to figure out how to find the possible paths of length 0. Hint: How many such paths can there be for a given call to `sample2(sm, 0, sofar)`? What aspects of the state machine's status does it depend on?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Starter function that calls sample2() with an empty string as argument. This is just to \"accumulate\" paths into\n", - "# that argument without tracking a bunch of data externally.\n", - "def sample(sm, length):\n", - " return sample2(sm, length, \"\")\n", - "\n", - "# sample2 samples paths of length \"length\" from the state machine sm as of its current state.\n", - "# sofar is the path assembled so far.\n", - "# sample2 returns a list of paths.\n", - "def sample2(sm, length, sofar):\n", - " if length == 0:\n", - " # TODO: What path(s) should be returned? When?\n", - " return []\n", - " state = sm.state\n", - " result = []\n", - " # TODO: implement the rest of the pseudocode above\n", - " return result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "assert len(sample(test2(), 0)) == 0\n", - "assert len(sample(test2(), 1)) == 0\n", - "assert len(sample(test2(), 2)) == 0\n", - "assert len(sample(test2(), 3)) == 0\n", - "assert len(sample(test2(), 4)) == 0\n", - "assert len(sample(test2(), 5)) == 1\n", - "assert len(sample(test2(), 6)) == 3\n", - "assert len(sample(test2(), 7)) == 7\n", - "assert len(sample(test2(), 8)) == 14\n", - "\n", - "all_samples = []\n", - "for i in range(0, 9):\n", - " all_samples = all_samples + sample(test2(), i)\n", - "print(all_samples)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# What's next?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you like (and have time), define more test state machines in new test cells (test3, test4, etc). What types of string are easy to recognize, and which seem hard---or even impossible? You might want to try some of these and determine whether they're possible within the limits of state machines:\n", - "\n", - "* Phone numbers\n", - "* URLs\n", - "* Palindromes\n", - "* HTML tags\n", - "* English-language numbers (e.g. \"seventy-one\", \"nineteen\", \"six\", \"one hundred and one\")\n", - "* Roman numerals\n", - "\n", - "Another (bigger) project might be to write a regular expression compiler to generate state machines from regular expressions---even just supporting concatenation and Kleene star would be a fun exercise for an evening!\n", - "\n", - "If you have an interest in the theory behind computer science, you might want to implement a non-deterministic automaton which can be in (or start in) several states simultaneously, may have out-edges to multiple distinct states on a given symbol, or may even have \"null\" or \"epsilon\" transitions which can be taken without consuming any input at all! Another good project here might involve taking the intersection or union of two languages (by manipulating their state machines)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python [Root]", - "language": "python", - "name": "Python [Root]" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} From 262e494cce9b04ab05a06d4ef84b9314e15d9937 Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Mon, 18 Jul 2016 08:56:33 -0700 Subject: [PATCH 07/11] u --- projects/3-mazes/Maze Solvers.ipynb | 200 +++++++++++++++++++--------- 1 file changed, 134 insertions(+), 66 deletions(-) diff --git a/projects/3-mazes/Maze Solvers.ipynb b/projects/3-mazes/Maze Solvers.ipynb index ca32553..a5771de 100644 --- a/projects/3-mazes/Maze Solvers.ipynb +++ b/projects/3-mazes/Maze Solvers.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 232, + "execution_count": 228, "metadata": { "collapsed": false }, @@ -23,7 +23,9 @@ "import matplotlib.patches as patches\n", "import matplotlib.axes as axes\n", "import copy\n", - "import random" + "import random\n", + "from collections import defaultdict\n", + "import heapq as hq\n" ] }, { @@ -37,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 233, + "execution_count": 234, "metadata": { "collapsed": false }, @@ -51,9 +53,9 @@ }, { "data": { - "image/png": "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\nQGJXBTWJFV4AAAAASUVORK5CYII=\n", + "image/png": "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\nNCK+L+mniSFZLywrMZ+UaW3FfG9ExKFi+6yko7r8mpcsayw5l5R3feeLzavV+Uyu9/127udv2HxS\nxvXZnpK0WtKXBgyZ9vqqCIlRX3xVZj5Juqs4vdple8kM55pJPaO4sKyStdlepM5ZzN6eXdnXmJhL\nyri+4lT8oKQ3JH0vIvb1DMm6thLzSXmfv89L+oz6h5E0g/VNysVU+yUtjIil6nwPZXvN9eRUydps\nz5X0DUmPFT/lKzNkrqzri4h3I+J2SVOS7qz4B0aZ+bKtz/Z9kk4VZ2dWpjOUKkLipKSFXfenisd6\nx9w4ZEy2+SLi7KXTvojYLel9tq+b4Xxl6sm1tqGqWJvtK9V50X4tInb0GZJtjcPmquq5i4ifSXpR\n0r09uyp5/gbNl3l9d0u63/arkv5O0j22t/WMmfb6qgiJ9y6+sn2VOhdf9X7KulPSOum9Kzr7XnyV\na77u91y2l6nzq9+3ZjiflE7pnGsbOl8Fa5OkL0s6EhFfGLA/5xqTc+Vcn+3rbc8rtq+V9FFJx3qG\nZVtbmflyri8iHo+IhRHx6+q8Dl6IiHU9w6a9vjJXXE630JFefFVmPklrbT8q6aKkC5Iemul8tr8u\naaWkD9j+iaSNkq6qYm1l5lPGtRXz3S3pk5IOF++lQ9Lj6vz2KOsay8yVeX0flPRVd/78wRxJzxZr\nqerCwKHzZV5fX7NdHxdTAUialA8uAcwQIQEgiZAAkERIAEgiJAAkERIAkggJAEmEBICk/wcIaVhE\n+nYwOwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -68,7 +70,8 @@ " \"?\":\"orange\",\n", " \"!\":\"red\",\n", " \"x\":\"green\",\"@\":\"gray\",\n", - " \"#\":\"sienna\",\".\":\"white\"}\n", + " \"#\":\"sienna\",\".\":\"white\",\n", + " \"O\": \"red\"}\n", " \n", " def __init__(self,rows):\n", " self.grid = [list(r) for r in rows]\n", @@ -76,8 +79,11 @@ " height = len(self.grid)\n", " width = len(self.grid[0])\n", " self.exit_pos = None\n", + " self.height = height\n", + " self.width = width\n", " self.player_pos = None\n", " self.player_alive = True\n", + " self.can_switch = True;\n", " for y in range(0,height):\n", " assert len(self.grid[y]) == width, \"All rows must be equal length!\"\n", " for x in range(0,width):\n", @@ -90,6 +96,22 @@ " assert self.player_pos == None\n", " self.player_pos = (x,y)\n", " self.grid[y][x] = \".\"\n", + " \n", + " #def __lt__(self, other):\n", + " #return False\n", + " \n", + " def __eq__(self,other):\n", + " return self.grid == other.grid and self.player_pos == other.player_pos and self.player_alive == other.player_alive\n", + " \n", + " def __neq__(self,other):\n", + " return not self == other\n", + " \n", + " def __hash__(self):\n", + " return hash(str(self.grid)) % 1000007 + hash(self.player_pos) % 1000007 + hash(self.player_alive) % 1000007\n", + " \n", + " def __comp__ (self, other):\n", + " if self == other: return 0\n", + " return __comp__(id(self), id(other))\n", " \n", " def clone(self):\n", " return copy.deepcopy(self)\n", @@ -114,6 +136,8 @@ " self.grid[y][x] = self.toggle_cell(switchnum,self.grid[y][x])\n", " \n", " def is_free(self,x,y):\n", + " if self.grid[y][x] == \"X\":\n", + " return True\n", " if y < 0 or y >= len(self.grid):\n", " return False\n", " if x < 0 or x >= len(self.grid[0]):\n", @@ -147,9 +171,20 @@ " [\"switch\"] if can_switch else []\n", " )\n", " \n", + " def moves(self, x,y):\n", + " can_switch = self.grid[y][x].isnumeric()\n", + " return [(dx,dy) for (dx,dy) in [(-1,0),(1,0),(0,-1),(0,1)] if self.is_free(x+dx,y+dy)] + (\n", + " [\"switch\"] if can_switch else []\n", + " )\n", + " \n", + " \n", " def is_at_exit(self):\n", " return self.player_alive and self.player_pos == self.exit_pos\n", " \n", + " def print_path(self, path):\n", + " for p in path:\n", + " self.grid[p[1]][p[0]] = 'O'\n", + " \n", " def draw(self):\n", " fig1 = plt.figure()\n", " ax1 = fig1.add_subplot(1,1,1, aspect='equal')\n", @@ -191,6 +226,8 @@ " \"#0?#\",\n", " \"a@##\"\n", " ])\n", + "\n", + "a = set([sample])\n", "sample.move_player(0,1)\n", "print(sample.available_moves())\n", "sample.move_player(1,0)\n", @@ -214,30 +251,65 @@ }, { "cell_type": "code", - "execution_count": 234, + "execution_count": 235, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ + "\n", + "def dist(a, b):\n", + " return abs(a[0] - b[0]) + abs(a[1] - b[1])\n", + "\n", "def heuristic(maze):\n", " # Return a path which solves the maze: a sequence of elements like (dx,dy) or \"switch\".\n", " # You can use maze.exit_pos and query maze.grid[row][column] to investigate the maze.\n", - " return []" + " \n", + " #print(maze.exit_pos)\n", + " pq = [(maze, 0, 0, 0)]\n", + " vis = set([maze])\n", + " \n", + " while pq:\n", + " \n", + " cm, priority, cost, p = hq.heappop(pq)\n", + " cur = cm.player_pos\n", + " print(cur)\n", + " if cur == maze.exit_pos:\n", + " return p\n", + " \n", + " for dir in (cm.available_moves()):\n", + " temp = cm.clone()\n", + " \n", + " if dir is \"switch\":\n", + " temp.toggle()\n", + " if temp not in vis:\n", + " hq.heappush(pq, (cm, priority, cost, p + 1))\n", + " vis.add(temp)\n", + " \n", + " else:\n", + " temp.move_player(dir[0], dir[1])\n", + " priority = dist(temp.player_pos, temp.exit_pos) + cost \n", + " \n", + " if temp not in vis:\n", + " hq.heappush(pq,(temp, priority, cost + 1, p + 1))\n", + " vis.add(temp)\n", + " \n", + " return \"Unsolveable\"\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 235, + "execution_count": 236, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\nJHmuDYZ9HtEsgboXoQEgIn4I/LBQLWat5S2iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkC\nDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQJdvxgsaSHwI+CC6ufBqn2GmTWkTs+aX0t6\nX0QclXQesFXSqojY2oP6zFqh1q5pRBytbi6sHnOwWEVmLVS30/eApB3AK8APIsKt980aVKt5VESc\nBK6UdCGwRdJ1VSOp3zIf+pqW7NUJsGR0hC+uvqToHPOhd2ov+pouGW3u3+cpxfqani4iDkv6NrCS\nabq5zYe+pv3YS3Oq+fBc9WuP2WJ9TSW9UdJodXsI+ACwc25lmtl06mwR3wR8Q53/ygeA+yPikbJl\nmbVLndMX48BVPajFrLX8yRqzBBxEswQcRLMEHESzBBxEswQcRLMEHESzBBxEswQcRLMEHESzBBxE\nswQcRLMEHESzBBxEswQcRLMEHESzBOq0ylgq6VFJT0kal7SuF4WZtUmdVhnHgb+JiJ2SRoBtkrZE\nxJ7CtZm1RtctYkS8EhE7q9uTwATw5tKFmbXJrN4jSnorsAJ4rEQxZm1Vu69ptVu6Cbit2jKeoWSD\n4SWjI33fNBc6zX9Lmw8NhtevX8/zI803AD7d0SNHeNsz3210zKINhiUtoBPC+yPiwZmWK9lguHR3\nbIC1Y+NuMFxT6QbDd911V7GxTxletKjxMYs1GK58HdgdEXfPvjQz66bO6YtVwCeAP5a0Q9J2SdeX\nL82sPeo0GN4KnNeDWsxay5+sMUvAQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEvA\nQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEugzjf0vyZpn6Qne1GQWRvV2SLeC/xJ6ULM2qxOg+EfAwd7\nUItZa/k9olkCtRsM11GywXAv9KKJ8ZLR8s9JL9ajdBPj9evXM9KDBsNNm2uDYdVpEitpGfAfEfGO\nsywTG9ZcMesCzOazqml11/+x6u6aqvoxswLqnL74JvCfwHJJL0i6pXxZZu1Sp8Hwx3tRiFmb+aip\nWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZ\nArWCKOl6SXsk/UzSZ0sXZdY2db6hPwD8I53epm8HbpJ0WenCppo4MOk5WjTHfFiH2aizRbwa+O+I\n+N+IeA34V+DPypZ1prl0xvIc/TvHfFiH2agTxDcDe0+7/2L1NzNriA/WmCXQta+ppGuAOyPi+ur+\n7UBExBemLNe9QapZC9Xpa1oniOcBTwOrgZeBnwA3RcREE0WaWb12iick/TWwhc6u7NccQrNm1Wq5\nb2ZlnfPBmtIn+3txoVRJSyU9KukpSeOS1hWYY6GkxyTtqOb5+6bnqOYZkLRd0kOFxn9e0q5qPX5S\naI5RSQ9Imqieq3c2PP7yqv7t1e9DTb/mkj5X1f6kpI2SLjjrAyJizj90gvw/wDLgfGAncNm5jDnN\nHO8GVgBPNjnulDl+H1hR3R6h85640fWoxh6ufp8H/BewqsAcnwL+BXio0HP1LPCGUq9FNccG4Jbq\n9gLgwoJzDQA/B97S4JjLqufpgur+vwE3n+0x57pFLH6yP3pwodSIeCUidla3J4EJCpwrjYij1c2F\ndP4BNLpekpYCNwBfbXLcqdNQ8LSXpAuBayPiXoCIOB4Rh0vNB7wfeCYi9nZdsr7DwG+ARZIWAMN0\nwj6jc31C593JfklvpbMFfqzA2AOSdgCvAD+IiN0NT/EV4NNAyTf+ATws6XFJtxYY/xLgF5LurXYd\n75E0VGCeUz4KfKvJASPiIPBl4AXgJeBXEfH9sz3GJ/RPI2kE2ATcVm0ZGxURJyPiSmAp8B5J1zU1\ntqQPA/uqLXvJy+itioir6Gx5Pynp3Q2PvwC4Cvinap6jwO0NzwGApPOBG4EHGh73UjpvEZYBfwCM\nSDrrxZzONYgvARefdn9p9be+U+1CbALuj4gHS85V7Wp9G1jZ4LCrgBslPUvnf/j3SbqvwfEBiIiX\nq98HgM103p406UVgb0Q8Ud3fRCeYJXwI2FatS5NWAlsj4pcRcQIYA951tgecaxAfB/5Q0rLqqNDH\ngBJH63pxodSvA7sj4u4Sg0t6o6TR6vYQ8AE6B7caERF3RMTFEXEpndfh0Yi4uanxASQNV3sNSFoE\nfBD4aZNzRMQ+YK+k5dWfVgNN78KfchMN75ZWngaukTSozvXNV9M57jCjrif0zyZ6cLK/ulDqe4Hf\nk/QC8PlTb+QbnGMV8AlgvHoPF8AdEfHdBqd5E/CN6oUZoLPlfaTB8XvhImBz9XHGBcDGiNhSYJ51\nwMZq1/FZoPGL40oapnOg5i+bHjsidlV7I9uAE8AO4J6z1lMdXjWz15EP1pgl4CCaJeAgmiXgIJol\n4CCaJeAgmiXgIJol4CCaJfB/quNiKOmyu7oAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOIAAAEACAYAAACu66rqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADgdJREFUeJzt3V+MXHd5xvHvs3bi3fU2Cy12CpiYoMpKgoIcq00iTFqo\nAzUBBWGpgoAUOaroRWkdpTUQ5SbxRS9AQjRSK1UREAM1EGW7blIp0BiCQFA1dmI72cTr0sZJ7fyz\njQBbazvIjt9ezHHlrnc9Z9fnN3l3z/ORVjuzOvP7vWfGj8+Zc2beo4jAzN5YfW90AWbmIJql4CCa\nJeAgmiXgIJol4CCaJVAriJJulzRW/WwoXZRZ23QNoqR3A38G/D6wEviopHeVLsysTepsEa8EHo+I\n30TE68BPgHVlyzJrlzpBfAa4QdKbJQ0CNwHvKFuWWbss7LZAROyV9EVgGzAB7AJeL12YWZtopp81\nlfS3wIGI+MdJf/eHVs2mEBHqtkzXLSKApCURcVjSZcDHgeunWm7zuqtnVuEMbN1zkI9fdWmx8T1H\nrjnmwzoArB8dq7VcrSAC/yzpt4GTwF9ExNHZFmZm56oVxIj4w9KFmLXZnPlkzRVLFnuOFs0xH9Zh\nJmZ8sGbagaQo+R7RbC5aPzpW62DNnNkims1nDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6i\nWQIOolkCDqJZAg6iWQIOolkCDqJZAnUbDN8h6RlJT0vaIuni0oWZtUmdBsNvA/4KWBUR76Hzrf5P\nli7MrE3q9qxZACyWdBoYBF4uV5JZ+3TdIkbEy8CXgf3AS8CvI+IHpQsza5OuW0RJbwI+BiwHjgAj\nkj4VEd+evOzWPQf/7/YVSxZz5ZKhxgrd8G/jHD12qrHxpjLQ38+J114rOsfS4SG+tObyonN8/ofP\nc+jIRNE5Bgb6OXGi3HNVenwo81qMH55g7+FjM35cnV3TG4F9EfFLAEmjwHuBc4JYskfk0WOn4J5i\nwwNw4p7XaKqHz3Skru1LLtihIxM9WY+Sc5Qe/8wcTbtyydD/2wA9tPdQrcfVOWq6H7heUr86la8B\nxmdTpJlNrc57xO3ACJ1rXjwFCLivcF1mrVK3wfAmYFPhWsxay5+sMUvAQTRLwEE0S8BBNEvAQTRL\nwEE0S8BBNEvAQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEugTl/TFZJ2SdpZ/T4i\naUMvijNri67f0I+InwPXAEjqA14Ethauy6xVZrpreiPwXEQcKFGMWVvNNIifAL5TohCzNqvbch9J\nFwE3A3dOt0zJBsO6COKexoab0qL+RcX7ji4dbu45mc7AQH/x9ejvLztH6fGh8zw1rWSD4TM+DDwZ\nEYenW6Bkg+E4SU8azm5ed3XROXrhxIneNEou+VytHx1zg+Fp3IJ3S82KqHt9xEE6B2pGy5Zj1k51\nGwwfB5YUrsWstfzJGrMEHESzBBxEswQcRLMEHESzBBxEswQcRLMEHESzBBxEswQcRLMEHESzBBxE\nswQcRLMEHESzBBxEswQcRLME6n5Df1jSg5LGJT0r6brShZm1Sd3mUfcCj0TEn0paCAwWrMmsdboG\nUdIlwA0RsR4gIk4BRwvXZdYqdXZNLwd+Ien+6voX90kaKF2YWZvU2TVdCKwCPhsRT0j6OzpNhu+e\nvGDJBsO9aJpbouHsZJ//4fMcOjJRdI652px38vhzcR1KNhh+ETgQEU9U90eAL0y1YMkGw71qmlva\noSMTPVmPuf5czdXXu1iD4Yg4CByQtKL60xpgzyxqNLNp1D1qugHYUl3/Yh9wW7mSzNqnboPhp4A/\nKFyLWWv5kzVmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhm\nCTiIZgk4iGYJ1Po+oqQXgCPAaeBkRFxbsiiztqn7Df3TwPsj4lclizFrq7q7pprBsmY2Q3XDFcA2\nSTskfaZkQWZtVHfXdHVEvCJpCZ1AjkfET0sWZtYmdZtHvVL9PixpK3AtcE4Q53qD4f7+ftaPjhWf\noxfrMReb804efy6uQ7EGw5IGgb6ImJC0GPgQsGmqZedDg2HPUX+OktrWYLjOFvFSYKukqJbfEhGP\nzqZIM5ta1yBGxPPAyh7UYtZaPiVhloCDaJaAg2iWgINoloCDaJaAg2iWgINoloCDaJaAg2iWgINo\nloCDaJaAg2iWgINoloCDaJaAg2iWgINolkDtIErqk7RT0sMlCzJro5lsEW8H9pQqxKzNagVR0jLg\nJuCrZcsxa6e6W8SvAJ+j02jYzBrWNYiSPgIcjIjddFrvl+2jZ9ZCddoprgZulnQTMAD8lqRvRsSt\nkxecDw2Ge9HUdj6sR+lmzHO1SXKxBsMRcRdwF4CkPwL+ZqoQwvxoMLx53dVF5+iF9aNjc76J8Vxt\nkjzbBsM+j2iWQN2L0AAQET8GflyoFrPW8hbRLAEH0SwBB9EsAQfRLAEH0SwBB9EsAQfRLAEH0SwB\nB9EsAQfRLAEH0SwBB9EsAQfRLAEH0SwBB9EsAQfRLIGuXwyWtAj4CXBxtfxIRGwqXZhZm9TpWfMb\nSR+IiOOSFgA/k/S9iNjeg/rMWqHWrmlEHK9uLqITXvc3NWtQ3U7ffZJ2Aa8C2yJiR9myzNqlVvOo\niDgNXCPpEuBfJF0VEedcB2M+9DUt2asTYOnwEF9ac3nROeZD79Re9DVdOtzcv88zivU1PVtEHJX0\nI2AtU1yQZj70NZ2LvTQnmw/P1VztMVusr6mkt0garm4PAB8E9s6uTDObSp0t4luBb0jqoxPcByLi\nkbJlmbVLndMXY8CqHtRi1lr+ZI1ZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZ\nAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAnVaZSyT9JikZyWNSdrQi8LM2qROq4xTwF9HxG5JQ8CT\nkh6NCPetMWtI1y1iRLwaEbur2xPAOPD20oWZtcmM3iNKeiewEni8RDFmbVW7r2m1WzoC3F5tGc9R\nssHw0uGhOd80FzrNf0ubDw2GN27cyAtDzTcAPtvxY8e46rnvNzpm0QbDkhbSCeG3IuKh6ZYr2WC4\ndHdsgPWjY24wXFPpBsObNpW/4Njg4sWNj1mswXDl68CeiLh35qWZWTd1Tl+sBj4N/LGkXZJ2Slpb\nvjSz9qjTYPhnwIIe1GLWWv5kjVkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkC\nDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCdb6h/zVJByU93YuCzNqozhbxfuBPShdi1mZ1Ggz/FPhV\nD2oxay2/RzRLoHaD4TpKNhjuhV40MV46XP456cV6lG5ivHHjRoZ60GC4abNtMKw6TWIlLQf+NSLe\nc55lYvO6q2dcgNl8VjWt7vo/Vt1dU1U/ZlZAndMX3wb+HVghab+k28qXZdYudRoMf6oXhZi1mY+a\nmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCa\nJVAriJLWStor6eeSvlC6KLO2qfMN/T7g7+n0Nn03cIukK0oXNtn44QnP0aI55sM6zESdLeK1wH9F\nxP9ExEngu8DHypZ1rtl0xvIcc3eO+bAOM1EniG8HDpx1/8Xqb2bWEB+sMUuga19TSdcD90TE2ur+\nnUBExBcnLde9QapZC9Xpa1oniAuA/wTWAK8A24FbImK8iSLNrF47xdcl/SXwKJ1d2a85hGbNqtVy\n38zKuuCDNaVP9vfiQqmSlkl6TNKzksYkbSgwxyJJj0vaVc1xd9NzVPP0Sdop6eFC478g6alqPbYX\nmmNY0oOSxqvX5LqGx19R1b+z+n2k6ddc0h2SnpH0tKQtki4+7wMiYtY/dIL838By4CJgN3DFhYw5\nxRzvA1YCTzc57qQ5fhdYWd0eovOeuNH1qMYerH4vAP4DuLbAHHcA/wQ8XOi52ge8udRrUc2xGbit\nur0QuKTgXH3Ay8A7GhzzbdXzdHF1/wHg1vM95kK3iMVP9kcPLpQaEa9GxO7q9gQwToFzpRFxvLq5\niM4/sEbfF0haBtwEfLXJcSdPQ8HTXpIuAW6IiPsBIuJURBwtNR9wI/BcRBzouuTMLAAWS1oIDNIJ\n+7Qu9Amddyf7Jb2Tzhb48QJj90naBbwKbIuIHQ1P8RXgczQc8EkC2CZph6TPFBj/cuAXku6vdh3v\nkzRQYJ4zPgF8p8kBI+Jl4MvAfuAl4NcR8YPzPcYn9M8iaQgYAW6vtoyNiojTEXENsAy4TtJVTY0t\n6SPAwWrLXvIyeqsjYhWdLe9nJb2v4fEXAquAf6jmOQ7c2fAcAEi6CLgZeLDhcd9EZ89wOZ3d1CFJ\n572Y04UG8SXgsrPuL6v+NudUuxAjwLci4qGSc1W7Wj8C1jY47GrgZkn76PwP/wFJ32xwfAAi4pXq\n92FgK523J016ETgQEU9U90foBLOEDwNPVuvSpBuBfRHxy4h4HRgF3nu+B1xoEHcAvydpeXVU6JNA\niaN1vbhQ6teBPRFxb4nBJb1F0nB1ewD4ILC3qfEj4q6IuCwi3kXndXgsIm5tanwASYPVXgOSFgMf\nAp5pco6IOAgckLSi+tMaYE+Tc5zlFhreLa3sB66X1K/O9c3X0DnuMK2uJ/TPJ3pwsr+6UOr7gd+R\ntB+4+8wb+QbnWA18Ghir3sMFcFdEfL/Bad4KfKP6Wlkf8EBEPNLg+L1wKbC1+jjjQmBLRDxaYJ4N\nwJZq13Ef0PjFcSUN0tly/XnTY0fEdkkjwC7gZPX7vvPWUx1eNbM3kA/WmCXgIJol4CCaJeAgmiXg\nIJol4CCaJeAgmiXgIJol8L9rYl7TkKjgYwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -245,9 +317,9 @@ }, { "data": { - "image/png": "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\nQmCC\n", + "image/png": "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\nR8AbDLvtAJBAeQJAAuUJAAmUJwAkUJ4AkEB5AkAC5QkACZQnACRQngCQQHkCQALlCQAJlCcAJFCe\nAJDQqDxt77A9afu/bH+hVCgAqF26PG2fJ+lvJV0r6XJJH7W9pVSw1TQxM9vrCCuqPZ9Uf8ba80n1\nZ6w9n7S6GZtsef6+pGci4qcR8Yqkb0vaWSbW6pqcmet1hBXVnk+qP2Pt+aT6M9aeT1rdjE3K822S\njs07/nz3NAB4w+MNIwBIcETkftC+UtJtEbGje/wWSRERX110vtwFAEAFImLJwVJNyvN8SU9L2i7p\nfyQ9LOmjETGRDQkA/SI9AC4ifm37LyQdUGf3/26KE8Bakd7yBIC1rLU3jGr/AL3tTbYP2X7K9hHb\nu3qdaSm2z7P9qO0Hep1lKbbX2/6O7YnubfneXmdazPanbT9p+wnb99l+cwWZ7rY9ZfuJeae91fYB\n20/bfsj2+sry7e7ez4dtf9f2hb3Kt1zGef/3Wduv2v7Nti6/lfLskw/Qn5L0mYi4XNIfSPpkhRkl\n6WZJ470OsYI7JX0vIkYl/Y6kql66sX2xpE9J2hYR71HnpaobeptKknSPOo+P+W6RdDAi3iXpkKQv\nrnqq/7dUvgOSLo+IKyQ9o97mk5bOKNubJF0j6adtXnhbW57Vf4A+Il6KiMPdw7PqPOir+pxq95fg\ng5K+0essS+luebw/Iu6RpIg4FREv9zjWUs6XNGR7naQLJL3Y4zyKiB9K+sWik3dKurd7+F5JH17V\nUPMslS8iDkbEq92j/yFp06oHW5hnqdtQkr4u6XNtX35b5dlXH6C3famkKyT9uLdJznL6l6DWF6Y3\nS/qZ7Xu6Ly3cZXuw16Hmi4gXJX1N0lFJL0j6ZUQc7G2qZW2IiCmp8+QuaUOP86zkzyQ92OsQi9m+\nTtKxiDjS9mWt+Q/J2x6WtEfSzd0t0CrY/pCkqe7Wsbv/arNO0jZJfxcR2yT9Sp1dz2rYfos6W3SX\nSLpY0rDtG3ub6pxV+aRp+y8lvRIR9/c6y3zdJ+5bJX1p/sltXV5b5fmCpLfPO76pe1pVurtxeyT9\nU0Ts73WeRa6SdJ3tZyX9s6Q/sv2PPc602PPqPMs/0j2+R50yrcnVkp6NiJ9HxK8l7ZX0vh5nWs6U\n7Y2SZPsiSdM9znMW22PqvJRU4xPQOyVdKulx28+p0zs/sd3KFnxb5fmfkn7L9iXddzZvkFTju8Xf\nlDQeEXf2OshiEXFrRLw9It6hzu13KCI+3utc83V3MY/Zvqx70nbV9+bWUUlX2h6wbXUy1vKm1uI9\nigckjXUPf0JSr5/QF+SzvUOdl5Gui4j/7Vmqhc5kjIgnI+KiiHhHRGxW58n9dyOilSehVsqz+wx/\n+gP0T0n6dm0foLd9laSPSfqA7ce6r9nt6HWuPrRL0n22D6vzbvtXepxngYh4WJ0t4sckPa7OA+2u\nnoaSZPt+ST+SdJnto7ZvknS7pGtsn/7Lvdsry/c3koYl/Vv38fL3vcq3Qsb5Qi3utvMheQBIWPNv\nGAFABuUJAAmUJwAkUJ4AkEB5AkAC5QkACZQnACRQngCQ8H/AGJvttLXzoQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -255,9 +327,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -317,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 236, + "execution_count": 238, "metadata": { "collapsed": false }, @@ -326,14 +398,27 @@ "name": "stdout", "output_type": "stream", "text": [ - "[]\n", - "[]\n" + "(6, 1)\n", + "(5, 1)\n" + ] + }, + { + "ename": "TypeError", + "evalue": "unorderable types: Maze() < Maze()", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmaze1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmaze2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmazeUnsolvable1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mheuristic\u001b[0;34m(maze)\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtemp\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mvis\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 35\u001b[0;31m \u001b[0mhq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mheappush\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpq\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtemp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpriority\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcost\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 36\u001b[0m \u001b[0mvis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtemp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: unorderable types: Maze() < Maze()" ] } ], "source": [ "print(heuristic(maze1()))\n", - "print(heuristic(maze2()))" + "print(heuristic(maze2()))\n", + "print(heuristic(mazeUnsolvable1()))" ] }, { @@ -345,16 +430,16 @@ }, { "cell_type": "code", - "execution_count": 237, + "execution_count": 145, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n/D+POh+f+M9ZsgAAAABJRU5ErkJggg==\n", + "image/png": "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\nG6OvTDFBAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -362,9 +447,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -407,7 +492,7 @@ }, { "cell_type": "code", - "execution_count": 238, + "execution_count": 237, "metadata": { "collapsed": false }, @@ -416,8 +501,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "[]\n", - "[]\n" + "(3, 9)\n", + "(4, 9)\n", + "(4, 8)\n", + "(5, 8)\n" + ] + }, + { + "ename": "TypeError", + "evalue": "unorderable types: Maze() < Maze()", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmaze3\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmaze4\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mheuristic\u001b[0;34m(maze)\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtemp\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mvis\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 35\u001b[0;31m \u001b[0mhq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mheappush\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpq\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtemp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpriority\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcost\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 36\u001b[0m \u001b[0mvis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtemp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: unorderable types: Maze() < Maze()" ] } ], @@ -439,7 +538,7 @@ }, { "cell_type": "code", - "execution_count": 239, + "execution_count": null, "metadata": { "collapsed": true }, @@ -461,42 +560,11 @@ }, { "cell_type": "code", - "execution_count": 240, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\nrkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "def maze5():\n", " return Maze([\n", @@ -548,7 +616,7 @@ }, { "cell_type": "code", - "execution_count": 241, + "execution_count": null, "metadata": { "collapsed": true }, @@ -570,9 +638,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [Root]", "language": "python", - "name": "python3" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -584,7 +652,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.2" } }, "nbformat": 4, From 6def2294fa85862ef74cf71aea3e41f233e4048a Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Mon, 18 Jul 2016 13:33:40 -0700 Subject: [PATCH 08/11] Edits --- projects/3-mazes/Maze Solvers.ipynb | 69 +++++++++-------------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/projects/3-mazes/Maze Solvers.ipynb b/projects/3-mazes/Maze Solvers.ipynb index a5771de..efde04c 100644 --- a/projects/3-mazes/Maze Solvers.ipynb +++ b/projects/3-mazes/Maze Solvers.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 228, + "execution_count": 1, "metadata": { "collapsed": false }, @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 234, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -55,7 +55,7 @@ "data": { "image/png": "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\nNCK+L+mniSFZLywrMZ+UaW3FfG9ExKFi+6yko7r8mpcsayw5l5R3feeLzavV+Uyu9/127udv2HxS\nxvXZnpK0WtKXBgyZ9vqqCIlRX3xVZj5Juqs4vdple8kM55pJPaO4sKyStdlepM5ZzN6eXdnXmJhL\nyri+4lT8oKQ3JH0vIvb1DMm6thLzSXmfv89L+oz6h5E0g/VNysVU+yUtjIil6nwPZXvN9eRUydps\nz5X0DUmPFT/lKzNkrqzri4h3I+J2SVOS7qz4B0aZ+bKtz/Z9kk4VZ2dWpjOUKkLipKSFXfenisd6\nx9w4ZEy2+SLi7KXTvojYLel9tq+b4Xxl6sm1tqGqWJvtK9V50X4tInb0GZJtjcPmquq5i4ifSXpR\n0r09uyp5/gbNl3l9d0u63/arkv5O0j22t/WMmfb6qgiJ9y6+sn2VOhdf9X7KulPSOum9Kzr7XnyV\na77u91y2l6nzq9+3ZjiflE7pnGsbOl8Fa5OkL0s6EhFfGLA/5xqTc+Vcn+3rbc8rtq+V9FFJx3qG\nZVtbmflyri8iHo+IhRHx6+q8Dl6IiHU9w6a9vjJXXE630JFefFVmPklrbT8q6aKkC5Iemul8tr8u\naaWkD9j+iaSNkq6qYm1l5lPGtRXz3S3pk5IOF++lQ9Lj6vz2KOsay8yVeX0flPRVd/78wRxJzxZr\nqerCwKHzZV5fX7NdHxdTAUialA8uAcwQIQEgiZAAkERIAEgiJAAkERIAkggJAEmEBICk/wcIaVhE\n+nYwOwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -109,9 +109,9 @@ " def __hash__(self):\n", " return hash(str(self.grid)) % 1000007 + hash(self.player_pos) % 1000007 + hash(self.player_alive) % 1000007\n", " \n", - " def __comp__ (self, other):\n", - " if self == other: return 0\n", - " return __comp__(id(self), id(other))\n", + " def __lt__(self, other):\n", + " if self == other: return False\n", + " return id(self) < id(other)\n", " \n", " def clone(self):\n", " return copy.deepcopy(self)\n", @@ -251,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 235, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -273,7 +273,7 @@ " \n", " cm, priority, cost, p = hq.heappop(pq)\n", " cur = cm.player_pos\n", - " print(cur)\n", + " #print(cur)\n", " if cur == maze.exit_pos:\n", " return p\n", " \n", @@ -300,7 +300,7 @@ }, { "cell_type": "code", - "execution_count": 236, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -309,7 +309,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOIAAAEACAYAAACu66rqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADgdJREFUeJzt3V+MXHd5xvHvs3bi3fU2Cy12CpiYoMpKgoIcq00iTFqo\nAzUBBWGpgoAUOaroRWkdpTUQ5SbxRS9AQjRSK1UREAM1EGW7blIp0BiCQFA1dmI72cTr0sZJ7fyz\njQBbazvIjt9ezHHlrnc9Z9fnN3l3z/ORVjuzOvP7vWfGj8+Zc2beo4jAzN5YfW90AWbmIJql4CCa\nJeAgmiXgIJol4CCaJVAriJJulzRW/WwoXZRZ23QNoqR3A38G/D6wEviopHeVLsysTepsEa8EHo+I\n30TE68BPgHVlyzJrlzpBfAa4QdKbJQ0CNwHvKFuWWbss7LZAROyV9EVgGzAB7AJeL12YWZtopp81\nlfS3wIGI+MdJf/eHVs2mEBHqtkzXLSKApCURcVjSZcDHgeunWm7zuqtnVuEMbN1zkI9fdWmx8T1H\nrjnmwzoArB8dq7VcrSAC/yzpt4GTwF9ExNHZFmZm56oVxIj4w9KFmLXZnPlkzRVLFnuOFs0xH9Zh\nJmZ8sGbagaQo+R7RbC5aPzpW62DNnNkims1nDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6i\nWQIOolkCDqJZAg6iWQIOolkCDqJZAnUbDN8h6RlJT0vaIuni0oWZtUmdBsNvA/4KWBUR76Hzrf5P\nli7MrE3q9qxZACyWdBoYBF4uV5JZ+3TdIkbEy8CXgf3AS8CvI+IHpQsza5OuW0RJbwI+BiwHjgAj\nkj4VEd+evOzWPQf/7/YVSxZz5ZKhxgrd8G/jHD12qrHxpjLQ38+J114rOsfS4SG+tObyonN8/ofP\nc+jIRNE5Bgb6OXGi3HNVenwo81qMH55g7+FjM35cnV3TG4F9EfFLAEmjwHuBc4JYskfk0WOn4J5i\nwwNw4p7XaKqHz3Skru1LLtihIxM9WY+Sc5Qe/8wcTbtyydD/2wA9tPdQrcfVOWq6H7heUr86la8B\nxmdTpJlNrc57xO3ACJ1rXjwFCLivcF1mrVK3wfAmYFPhWsxay5+sMUvAQTRLwEE0S8BBNEvAQTRL\nwEE0S8BBNEvAQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEugTl/TFZJ2SdpZ/T4i\naUMvijNri67f0I+InwPXAEjqA14Ethauy6xVZrpreiPwXEQcKFGMWVvNNIifAL5TohCzNqvbch9J\nFwE3A3dOt0zJBsO6COKexoab0qL+RcX7ji4dbu45mc7AQH/x9ejvLztH6fGh8zw1rWSD4TM+DDwZ\nEYenW6Bkg+E4SU8azm5ed3XROXrhxIneNEou+VytHx1zg+Fp3IJ3S82KqHt9xEE6B2pGy5Zj1k51\nGwwfB5YUrsWstfzJGrMEHESzBBxEswQcRLMEHESzBBxEswQcRLMEHESzBBxEswQcRLMEHESzBBxE\nswQcRLMEHESzBBxEswQcRLME6n5Df1jSg5LGJT0r6brShZm1Sd3mUfcCj0TEn0paCAwWrMmsdboG\nUdIlwA0RsR4gIk4BRwvXZdYqdXZNLwd+Ien+6voX90kaKF2YWZvU2TVdCKwCPhsRT0j6OzpNhu+e\nvGDJBsO9aJpbouHsZJ//4fMcOjJRdI652px38vhzcR1KNhh+ETgQEU9U90eAL0y1YMkGw71qmlva\noSMTPVmPuf5czdXXu1iD4Yg4CByQtKL60xpgzyxqNLNp1D1qugHYUl3/Yh9wW7mSzNqnboPhp4A/\nKFyLWWv5kzVmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhm\nCTiIZgk4iGYJ1Po+oqQXgCPAaeBkRFxbsiiztqn7Df3TwPsj4lclizFrq7q7pprBsmY2Q3XDFcA2\nSTskfaZkQWZtVHfXdHVEvCJpCZ1AjkfET0sWZtYmdZtHvVL9PixpK3AtcE4Q53qD4f7+ftaPjhWf\noxfrMReb804efy6uQ7EGw5IGgb6ImJC0GPgQsGmqZedDg2HPUX+OktrWYLjOFvFSYKukqJbfEhGP\nzqZIM5ta1yBGxPPAyh7UYtZaPiVhloCDaJaAg2iWgINoloCDaJaAg2iWgINoloCDaJaAg2iWgINo\nloCDaJaAg2iWgINoloCDaJaAg2iWgINolkDtIErqk7RT0sMlCzJro5lsEW8H9pQqxKzNagVR0jLg\nJuCrZcsxa6e6W8SvAJ+j02jYzBrWNYiSPgIcjIjddFrvl+2jZ9ZCddoprgZulnQTMAD8lqRvRsSt\nkxecDw2Ge9HUdj6sR+lmzHO1SXKxBsMRcRdwF4CkPwL+ZqoQwvxoMLx53dVF5+iF9aNjc76J8Vxt\nkjzbBsM+j2iWQN2L0AAQET8GflyoFrPW8hbRLAEH0SwBB9EsAQfRLAEH0SwBB9EsAQfRLAEH0SwB\nB9EsAQfRLAEH0SwBB9EsAQfRLAEH0SwBB9EsAQfRLIGuXwyWtAj4CXBxtfxIRGwqXZhZm9TpWfMb\nSR+IiOOSFgA/k/S9iNjeg/rMWqHWrmlEHK9uLqITXvc3NWtQ3U7ffZJ2Aa8C2yJiR9myzNqlVvOo\niDgNXCPpEuBfJF0VEedcB2M+9DUt2asTYOnwEF9ac3nROeZD79Re9DVdOtzcv88zivU1PVtEHJX0\nI2AtU1yQZj70NZ2LvTQnmw/P1VztMVusr6mkt0garm4PAB8E9s6uTDObSp0t4luBb0jqoxPcByLi\nkbJlmbVLndMXY8CqHtRi1lr+ZI1ZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZ\nAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAnVaZSyT9JikZyWNSdrQi8LM2qROq4xTwF9HxG5JQ8CT\nkh6NCPetMWtI1y1iRLwaEbur2xPAOPD20oWZtcmM3iNKeiewEni8RDFmbVW7r2m1WzoC3F5tGc9R\nssHw0uGhOd80FzrNf0ubDw2GN27cyAtDzTcAPtvxY8e46rnvNzpm0QbDkhbSCeG3IuKh6ZYr2WC4\ndHdsgPWjY24wXFPpBsObNpW/4Njg4sWNj1mswXDl68CeiLh35qWZWTd1Tl+sBj4N/LGkXZJ2Slpb\nvjSz9qjTYPhnwIIe1GLWWv5kjVkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkC\nDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCdb6h/zVJByU93YuCzNqozhbxfuBPShdi1mZ1Ggz/FPhV\nD2oxay2/RzRLoHaD4TpKNhjuhV40MV46XP456cV6lG5ivHHjRoZ60GC4abNtMKw6TWIlLQf+NSLe\nc55lYvO6q2dcgNl8VjWt7vo/Vt1dU1U/ZlZAndMX3wb+HVghab+k28qXZdYudRoMf6oXhZi1mY+a\nmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCa\nJVAriJLWStor6eeSvlC6KLO2qfMN/T7g7+n0Nn03cIukK0oXNtn44QnP0aI55sM6zESdLeK1wH9F\nxP9ExEngu8DHypZ1rtl0xvIcc3eO+bAOM1EniG8HDpx1/8Xqb2bWEB+sMUuga19TSdcD90TE2ur+\nnUBExBcnLde9QapZC9Xpa1oniAuA/wTWAK8A24FbImK8iSLNrF47xdcl/SXwKJ1d2a85hGbNqtVy\n38zKuuCDNaVP9vfiQqmSlkl6TNKzksYkbSgwxyJJj0vaVc1xd9NzVPP0Sdop6eFC478g6alqPbYX\nmmNY0oOSxqvX5LqGx19R1b+z+n2k6ddc0h2SnpH0tKQtki4+7wMiYtY/dIL838By4CJgN3DFhYw5\nxRzvA1YCTzc57qQ5fhdYWd0eovOeuNH1qMYerH4vAP4DuLbAHHcA/wQ8XOi52ge8udRrUc2xGbit\nur0QuKTgXH3Ay8A7GhzzbdXzdHF1/wHg1vM95kK3iMVP9kcPLpQaEa9GxO7q9gQwToFzpRFxvLq5\niM4/sEbfF0haBtwEfLXJcSdPQ8HTXpIuAW6IiPsBIuJURBwtNR9wI/BcRBzouuTMLAAWS1oIDNIJ\n+7Qu9Amddyf7Jb2Tzhb48QJj90naBbwKbIuIHQ1P8RXgczQc8EkC2CZph6TPFBj/cuAXku6vdh3v\nkzRQYJ4zPgF8p8kBI+Jl4MvAfuAl4NcR8YPzPcYn9M8iaQgYAW6vtoyNiojTEXENsAy4TtJVTY0t\n6SPAwWrLXvIyeqsjYhWdLe9nJb2v4fEXAquAf6jmOQ7c2fAcAEi6CLgZeLDhcd9EZ89wOZ3d1CFJ\n572Y04UG8SXgsrPuL6v+NudUuxAjwLci4qGSc1W7Wj8C1jY47GrgZkn76PwP/wFJ32xwfAAi4pXq\n92FgK523J016ETgQEU9U90foBLOEDwNPVuvSpBuBfRHxy4h4HRgF3nu+B1xoEHcAvydpeXVU6JNA\niaN1vbhQ6teBPRFxb4nBJb1F0nB1ewD4ILC3qfEj4q6IuCwi3kXndXgsIm5tanwASYPVXgOSFgMf\nAp5pco6IOAgckLSi+tMaYE+Tc5zlFhreLa3sB66X1K/O9c3X0DnuMK2uJ/TPJ3pwsr+6UOr7gd+R\ntB+4+8wb+QbnWA18Ghir3sMFcFdEfL/Bad4KfKP6Wlkf8EBEPNLg+L1wKbC1+jjjQmBLRDxaYJ4N\nwJZq13Ef0PjFcSUN0tly/XnTY0fEdkkjwC7gZPX7vvPWUx1eNbM3kA/WmCXgIJol4CCaJeAgmiXg\nIJol4CCaJeAgmiXgIJol8L9rYl7TkKjgYwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -319,7 +319,7 @@ "data": { "image/png": "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\nR8AbDLvtAJBAeQJAAuUJAAmUJwAkUJ4AkEB5AkAC5QkACZQnACRQngCQQHkCQALlCQAJlCcAJFCe\nAJDQqDxt77A9afu/bH+hVCgAqF26PG2fJ+lvJV0r6XJJH7W9pVSw1TQxM9vrCCuqPZ9Uf8ba80n1\nZ6w9n7S6GZtsef6+pGci4qcR8Yqkb0vaWSbW6pqcmet1hBXVnk+qP2Pt+aT6M9aeT1rdjE3K822S\njs07/nz3NAB4w+MNIwBIcETkftC+UtJtEbGje/wWSRERX110vtwFAEAFImLJwVJNyvN8SU9L2i7p\nfyQ9LOmjETGRDQkA/SI9AC4ifm37LyQdUGf3/26KE8Bakd7yBIC1rLU3jGr/AL3tTbYP2X7K9hHb\nu3qdaSm2z7P9qO0Hep1lKbbX2/6O7YnubfneXmdazPanbT9p+wnb99l+cwWZ7rY9ZfuJeae91fYB\n20/bfsj2+sry7e7ez4dtf9f2hb3Kt1zGef/3Wduv2v7Nti6/lfLskw/Qn5L0mYi4XNIfSPpkhRkl\n6WZJ470OsYI7JX0vIkYl/Y6kql66sX2xpE9J2hYR71HnpaobeptKknSPOo+P+W6RdDAi3iXpkKQv\nrnqq/7dUvgOSLo+IKyQ9o97mk5bOKNubJF0j6adtXnhbW57Vf4A+Il6KiMPdw7PqPOir+pxq95fg\ng5K+0essS+luebw/Iu6RpIg4FREv9zjWUs6XNGR7naQLJL3Y4zyKiB9K+sWik3dKurd7+F5JH17V\nUPMslS8iDkbEq92j/yFp06oHW5hnqdtQkr4u6XNtX35b5dlXH6C3famkKyT9uLdJznL6l6DWF6Y3\nS/qZ7Xu6Ly3cZXuw16Hmi4gXJX1N0lFJL0j6ZUQc7G2qZW2IiCmp8+QuaUOP86zkzyQ92OsQi9m+\nTtKxiDjS9mWt+Q/J2x6WtEfSzd0t0CrY/pCkqe7Wsbv/arNO0jZJfxcR2yT9Sp1dz2rYfos6W3SX\nSLpY0rDtG3ub6pxV+aRp+y8lvRIR9/c6y3zdJ+5bJX1p/sltXV5b5fmCpLfPO76pe1pVurtxeyT9\nU0Ts73WeRa6SdJ3tZyX9s6Q/sv2PPc602PPqPMs/0j2+R50yrcnVkp6NiJ9HxK8l7ZX0vh5nWs6U\n7Y2SZPsiSdM9znMW22PqvJRU4xPQOyVdKulx28+p0zs/sd3KFnxb5fmfkn7L9iXddzZvkFTju8Xf\nlDQeEXf2OshiEXFrRLw9It6hzu13KCI+3utc83V3MY/Zvqx70nbV9+bWUUlX2h6wbXUy1vKm1uI9\nigckjXUPf0JSr5/QF+SzvUOdl5Gui4j/7Vmqhc5kjIgnI+KiiHhHRGxW58n9dyOilSehVsqz+wx/\n+gP0T0n6dm0foLd9laSPSfqA7ce6r9nt6HWuPrRL0n22D6vzbvtXepxngYh4WJ0t4sckPa7OA+2u\nnoaSZPt+ST+SdJnto7ZvknS7pGtsn/7Lvdsry/c3koYl/Vv38fL3vcq3Qsb5Qi3utvMheQBIWPNv\nGAFABuUJAAmUJwAkUJ4AkEB5AkAC5QkACZQnACRQngCQ8H/AGJvttLXzoQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -329,7 +329,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -389,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 238, + "execution_count": 9, "metadata": { "collapsed": false }, @@ -398,20 +398,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "(6, 1)\n", - "(5, 1)\n" - ] - }, - { - "ename": "TypeError", - "evalue": "unorderable types: Maze() < Maze()", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmaze1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmaze2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmazeUnsolvable1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mheuristic\u001b[0;34m(maze)\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtemp\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mvis\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 35\u001b[0;31m \u001b[0mhq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mheappush\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpq\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtemp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpriority\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcost\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 36\u001b[0m \u001b[0mvis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtemp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: unorderable types: Maze() < Maze()" + "11\n", + "26\n", + "Unsolveable\n" ] } ], @@ -430,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 145, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -439,7 +428,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU8AAAD7CAYAAADq4RYlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAERJJREFUeJzt3XuMXOV5x/HfD3utXbyNSaW1EbECTlJsg0IpEg0NinIx\nCDcoXCIhcWkT0yqS2zSgJA0hVC24lSKCiBJ6SS0SQmjERcI1mFwoV4GURA0QMDZ416WFhFtZbxRi\nax272PD0jxk7u8vuevc979nzDvP9SJZmxrPPeXZm5zfvmZkzjyNCAIDZOazpBgCgExGeAJCA8ASA\nBIQnACQgPAEgAeEJAAnm170B23wWCkDHighPdnnt4SlJ3/n4e+diM8nu2Dasc49b0nQbUyq9P6n8\nHkvvTyq/x9L7k/L3uGbj1in/j912AEhAeAJAAsJT0oqBhU23MK3S+5PK77H0/qTyeyy9P2lue3Td\nx7bbjtJf8wSAyazZuHXKN4xYeQJAAsITABIQngCQgPAEgASEJwAkIDwBIAHhCQAJCE8ASEB4AkCC\nQ4an7RtsD9veMuayt9u+1/Z22/fYXlRvmwBQlpmsPG+UdMaEyy6XdH9ELJf0oKQv5W4MAEp2yPCM\niB9JenXCxWdLuql9+iZJ52TuCwCKlvqa5+KIGJakiHhF0uJ8LQFA+XK9YcSoDQBdJXUMx7DtJREx\nbPtISTumu/Id24YPnl4xsFArB/oTNytdcs+gdu3en/zzk3nbwvn6xzNWZqu37d2rdfjCfN8rODo6\nqmuvvTZbvcWL+nXNqmXZ6knSZQ88px07R7PVy91j7v4kqa+vV3v27C22Xifchr0LerT3tX3Z6h1x\n+AJ9ffXy5J8fHBnV0MjuGV13puHp9r8D7pK0RtJXJH1S0qbpfjjnTJFdu/dLV2Ur16p5Vd4wzhmc\nktTf36+c37tqT/r1hJXs2DladI+5+5NaPeb+nbvxNtzy/eoLg0e3/Lf++urv6tVdMwu+qawc6B+3\nuNs0NPW6cCYfVbpF0k8kHWv7edsXS7pa0um2t0ta1T4PAHPuQHBee/mfzul2D7nyjIgLp/iv0zL3\nAgCzMjY4Tz7hPXO6bY4wAtCRmgxOifAE0IGaDk6J8ATQYUoITonwBNBBSglOifAE0CFKCk6J8ATQ\nAUoLTonwBFC4EoNTIjwBFKzU4JQITwCFKjk4JcITQIFKD06J8ARQmE4ITonwBFCQTglOifAEUIhO\nCk6J8ARQgE4LTonwBNCwTgxOifAE0LBODE4pfYZRY9wjxVX5a+b0m927s88wyjlSobe3V2s2bs1W\n70DNknvM3V8dNbvxNuyZP0+v7tqtP79ifZZ6vQsyP5in0XHhGftUyxyVnI77n//IWm/Nxq1Fz8qp\no2bp9Q7U/M7H35utXun3c6f83cwVdtsBIAHhCQAJCE8ASEB4AkACwhMAEhCeAJCA8ASABIQnACQg\nPAEgAeEJAAkITwBIQHgCQALCEwASEJ4AkKBSeNr+rO2nbG+xfbPtBbkaA4CSJYen7aMkfUbSSRFx\nglrfDXp+rsYAoGRVvwx5nqSFtt+QdLikl6u3BADlS155RsTLkr4q6XlJL0n6dUTcn6sxAChZ8srT\n9hGSzpZ0tKSdkjbYvjAibpl43Tu2DR88vWJgoVYO9KduVn01zFHp6+3NWu+yB57Tjp2j2er19ZU9\nK6eOmqXXk1r3S+56Jf/OnfB3U/U+GRwZ1dDI7hldt8pu+2mSno2IX0mS7Y2S3i/pTeF57nFLKmxm\nvD179yquPCdbPUnyujuz1tuxczT7XJaSZ+VI5fdY1/ydnPbs2Vv075z7PpbquZ+rWDnQP25xt2lo\nx5TXrfJu+/OSTrHd61bHqyQNVqgHAB2jymuej0jaIOkJSU9KsqTrM/UFAEWr9G57RKyTtC5TLwDQ\nMTjCCAASEJ4AkIDwBIAEhCcAJCA8ASBB1WPbG3HVQ3ycFECzWHkCQILOXHl+aGXWeuse3p61HoC3\nPlaeAJCA8ASABIQnACQgPAEgAeEJAAkITwBIQHgCQALCEwASdNyH5Pt65mWfOdQ7/zCt2bg1X73C\nhlpNVo9haHlqlvx3U8ffYc7fVyr/sTKdjgvPPfter2WQV86hcl53Z1FDrSbas2evzvzbM7PW/ME/\n/CBrvdKHodVRs/SBbXUNDiz5sTIddtsBIEHHrTyRx8f+7mNZ6+VeeQKlY+UJAAkITwBIQHgCQALC\nEwASEJ4AkIDwBIAEhCcAJCA8ASAB4QkACTjCqEt97++/13QLQEdj5QkACVh5dimObQeqqbTytL3I\n9u22B20/bft9uRoDgJJVXXleJ+mHEXGe7fmSDs/QEwAULzk8bb9N0gciYo0kRcR+Sbsy9QUARauy\n275M0i9t32j7cdvX2+7L1RgAlKzKbvt8SSdJ+nREPGb765Iul3TlxCvesW344OkVAwu1cqA/eaN1\nzN/pnZ93LlLpc1kW9PZobc/arDV7enu6ap5PHTXrqFfyfVJHzaqPlcGRUQ2N7J7RdauE54uSXoiI\nx9rnN0j64mRXPPe4JRU2M17u2TZS+bNecv/BvrZ337iZTQ/9fETn3f6obj/vZH3omIGkml53p9bv\nW5+rRa3tWVv0fKA6anZbvTpqVn2srBzoH7e42zS0Y8rrJu+2R8SwpBdsH9u+aJWkban10IwcwQl0\no6rvtl8i6WbbPZKelXRx9ZYwVwhOIF2l8IyIJyWdnKkXzCGCE6iGI4y6VB3ByfHy6CYc296lWHEC\n1bDy7FJ1BGfO4+U5Vh6lY+UJAAkIT1T20M9Hmm4BmHOEJyo58K490G0ITyQb+3EnoNsQnkjC50TR\n7QhPzBrBCRCemCWCE2ghPDFjBCfwW4QnZoTgBMbjCCMc0kyDk2Pb0U1YeWJarDiBybHyxJRmG5wc\n245u0nHhWccMo9wzgnL3mLu/xQsXzGpm04dv+vEhr9PTOz/rXKTS5wPVUbPb6tVRM/djZTodF551\nzTDKKXePufu75ozlWetJ9cxtKnmulFTP/J2Sf+dumGE0G7zmCQAJCE8ASEB4AkACwhMAEhCeAJCA\n8ASABIQnACQgPAEgAeEJAAkITwBIQHgCQALCEwASEJ4AkIDwBIAElcPT9mG2H7d9V46GAKAT5Fh5\nXippW4Y6ANAxKoWn7aWSPirpW3naAYDOUHXl+TVJX5CU9+ulAaBwyeFp+0xJwxGxWZLb/wCgKzh1\nfojtL0v6E0n7JfVJ+h1JGyPiExOuF2evWHzw/IqBhVo50J/c8F/c/Yz27Nmb/POT6e3t1d69+WqW\nXq+vrzf7bZi7Zu56uW/DOmqW/jt3ym34r3/8e8k/PzgyqqGR3QfPbxraoYiYdGGYPAAuIq6QdIUk\n2f6gpM9PDM4Dzj1uSepm3qSuAXBrLzg9W731t95X9OCtugZ5lT68bP2+9dnqSdLanrXF/84lD6iT\n6vmdq1g50D9ucbdpaMeU1+246Zl1+cuLzshWa/2t92WrBaBMWcIzIh6W9HCOWkAn2P7w9qZbQMM4\nwgiYpe0Pb9c3z/9m022gYYQnMAsHgvNTt32q6VbQMMITmKGxwbn8g8ubbgcNIzyBGSA4MRHhCRwC\nwYnJEJ7ANAhOTIXwBKZAcGI6hCcwCYITh8IRRm3fuPmepltAIQhOzAQrT2AMghMzxcqzjWPbQXBi\nNlh5AiI4MXuEJ7oewYkUhCe6GsGJVIQnuhbBiSoIT3QlghNVJc8wmvEG7Mj51f2XPfCcduwczVZP\nknoX9Gjva/uy1WOeT3n1enp7tG9vvvtYkhb09ei1Pflqln4bdsLfTdUZRhO1x4TknWHUlGtWLWu6\nhY6Xe26MVP6cpU6Zv9NN9eqoWXWG0Wyw2w4ACQhPAEhAeAJAAsITABIQngCQgPAEgASEJwAkIDwB\nIAHhCQAJCE8ASEB4AkACwhMAEhCeAJCA8ASABMnhaXup7QdtP217q+1LcjYGACWr8n2e+yV9LiI2\n2+6X9DPb90bEUKbeAKBYySvPiHglIja3T49KGpT0jlyNAUDJsrzmafsYSSdK+mmOegBQuspjONq7\n7BskXdpegb7JHduGD55eMbBQKwf6q24WFSxe1J99XEFfX2/WmnXUW7Nxa7Z6Umv+Ts4eS6+X+z6p\no+biRdWyZXBkVEMju2d03UoD4GzPl/R9SXdHxHVTXCfrADggBXObkGK6AXBVd9u/LWnbVMEJAG9V\nVT6qdKqkiyR9xPYTth+3vTpfawBQruTXPCPix5LmZewFADoGRxgBQALCEwASEJ4AkIDwBIAEhCcA\nJCA8ASAB4QkACQhPAEhAeAJAAsITABIQngCQgPAEgASEJwAkIDwBIAHhCQAJCE8ASFB5ABzQCbpx\n6F3VYWiYHuGJrnDNqmVNt4C3GHbbASAB4QkACQhPAEhAeAJAAsITABIQngCQgPAEgASEJwAkIDwB\nIAHhCQAJCE8ASEB4AkACwhMAElQKT9urbQ/Z/i/bX8zVFACULjk8bR8m6Z8lnSHpeEkX2F6Rq7G5\nNDgy2nQL0yq9P6n8HkvvTyq/x9L7k+a2xyorzz+U9ExE/CIi9km6TdLZedqaW0Mju5tuYVql9yeV\n32Pp/Unl91h6f9Lc9lglPN8h6YUx519sXwYAb3m8YQQACRwRaT9onyLpqohY3T5/uaSIiK9MuF7a\nBgCgABEx6WCpKuE5T9J2Sask/a+kRyRdEBGDqU0CQKdIHgAXEa/b/itJ96q1+38DwQmgWySvPAGg\nm9X2hlHpH6C3vdT2g7aftr3V9iVN9zQZ24fZftz2XU33Mhnbi2zfbnuwfVu+r+meJrL9WdtP2d5i\n+2bbCwro6Qbbw7a3jLns7bbvtb3d9j22FxXW3zXt+3mz7X+3/bam+puqxzH/93nbb9j+3bq2X0t4\ndsgH6PdL+lxEHC/pjyR9usAeJelSSduabmIa10n6YUSslPT7kop66cb2UZI+I+mkiDhBrZeqzm+2\nK0nSjWo9Psa6XNL9EbFc0oOSvjTnXf3WZP3dK+n4iDhR0jNqtj9p8h5le6mk0yX9os6N17XyLP4D\n9BHxSkRsbp8eVetBX9TnVNt/BB+V9K2me5lMe+XxgYi4UZIiYn9E7Gq4rcnMk7TQ9nxJh0t6ueF+\nFBE/kvTqhIvPlnRT+/RNks6Z06bGmKy/iLg/It5on/1PSUvnvLHx/Ux2G0rS1yR9oe7t1xWeHfUB\netvHSDpR0k+b7eRNDvwRlPrC9DJJv7R9Y/ulhett9zXd1FgR8bKkr0p6XtJLkn4dEfc329WUFkfE\nsNR6cpe0uOF+pvNnku5uuomJbJ8l6YWI2Fr3trr+Q/K2+yVtkHRpewVaBNtnShpur47d/lea+ZJO\nkvQvEXGSpN+otetZDNtHqLWiO1rSUZL6bV/YbFczVuSTpu2/kbQvIm5pupex2k/cV0i6cuzFdW2v\nrvB8SdI7x5xf2r6sKO3duA2SvhsRm5ruZ4JTJZ1l+1lJt0r6sO1/a7iniV5U61n+sfb5DWqFaUlO\nk/RsRPwqIl6XtFHS+xvuaSrDtpdIku0jJe1ouJ83sb1GrZeSSnwCerekYyQ9afs5tXLnZ7ZrWcHX\nFZ6PSnqP7aPb72yeL6nEd4u/LWlbRFzXdCMTRcQVEfHOiHiXWrffgxHxiab7Gqu9i/mC7WPbF61S\neW9uPS/pFNu9tq1Wj6W8qTVxj+IuSWvapz8pqekn9HH92V6t1stIZ0XE/zXW1XgHe4yIpyLiyIh4\nV0QsU+vJ/Q8iopYnoVrCs/0Mf+AD9E9Luq20D9DbPlXSRZI+YvuJ9mt2q5vuqwNdIulm25vVerf9\nyw33M05EPKLWivgJSU+q9UC7vtGmJNm+RdJPJB1r+3nbF0u6WtLptg8cuXd1Yf39k6R+Sfe1Hy/f\naKq/aXocK1TjbjsfkgeABF3/hhEApCA8ASAB4QkACQhPAEhAeAJAAsITABIQngCQgPAEgAT/D6Ys\nG6OvTDFBAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -449,7 +438,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -492,7 +481,7 @@ }, { "cell_type": "code", - "execution_count": 237, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -501,22 +490,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "(3, 9)\n", - "(4, 9)\n", - "(4, 8)\n", - "(5, 8)\n" - ] - }, - { - "ename": "TypeError", - "evalue": "unorderable types: Maze() < Maze()", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmaze3\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmaze4\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mheuristic\u001b[0;34m(maze)\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtemp\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mvis\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 35\u001b[0;31m \u001b[0mhq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mheappush\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpq\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtemp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpriority\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcost\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 36\u001b[0m \u001b[0mvis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtemp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: unorderable types: Maze() < Maze()" + "Unsolveable\n", + "Unsolveable\n" ] } ], From 4baa970d60d2b5619e2e5299646ad9402157c3cd Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Tue, 19 Jul 2016 09:02:00 -0700 Subject: [PATCH 09/11] Update --- projects/3-mazes/Maze Solvers.ipynb | 45 +++++++++++++++++++---------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/projects/3-mazes/Maze Solvers.ipynb b/projects/3-mazes/Maze Solvers.ipynb index efde04c..9d68dc8 100644 --- a/projects/3-mazes/Maze Solvers.ipynb +++ b/projects/3-mazes/Maze Solvers.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -55,7 +55,7 @@ "data": { "image/png": "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\nNCK+L+mniSFZLywrMZ+UaW3FfG9ExKFi+6yko7r8mpcsayw5l5R3feeLzavV+Uyu9/127udv2HxS\nxvXZnpK0WtKXBgyZ9vqqCIlRX3xVZj5Juqs4vdple8kM55pJPaO4sKyStdlepM5ZzN6eXdnXmJhL\nyri+4lT8oKQ3JH0vIvb1DMm6thLzSXmfv89L+oz6h5E0g/VNysVU+yUtjIil6nwPZXvN9eRUydps\nz5X0DUmPFT/lKzNkrqzri4h3I+J2SVOS7qz4B0aZ+bKtz/Z9kk4VZ2dWpjOUKkLipKSFXfenisd6\nx9w4ZEy2+SLi7KXTvojYLel9tq+b4Xxl6sm1tqGqWJvtK9V50X4tInb0GZJtjcPmquq5i4ifSXpR\n0r09uyp5/gbNl3l9d0u63/arkv5O0j22t/WMmfb6qgiJ9y6+sn2VOhdf9X7KulPSOum9Kzr7XnyV\na77u91y2l6nzq9+3ZjiflE7pnGsbOl8Fa5OkL0s6EhFfGLA/5xqTc+Vcn+3rbc8rtq+V9FFJx3qG\nZVtbmflyri8iHo+IhRHx6+q8Dl6IiHU9w6a9vjJXXE630JFefFVmPklrbT8q6aKkC5Iemul8tr8u\naaWkD9j+iaSNkq6qYm1l5lPGtRXz3S3pk5IOF++lQ9Lj6vz2KOsay8yVeX0flPRVd/78wRxJzxZr\nqerCwKHzZV5fX7NdHxdTAUialA8uAcwQIQEgiZAAkERIAEgiJAAkERIAkggJAEmEBICk/wcIaVhE\n+nYwOwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -84,6 +84,7 @@ " self.player_pos = None\n", " self.player_alive = True\n", " self.can_switch = True;\n", + " self.path = []\n", " for y in range(0,height):\n", " assert len(self.grid[y]) == width, \"All rows must be equal length!\"\n", " for x in range(0,width):\n", @@ -109,9 +110,14 @@ " def __hash__(self):\n", " return hash(str(self.grid)) % 1000007 + hash(self.player_pos) % 1000007 + hash(self.player_alive) % 1000007\n", " \n", + " def _is_valid_operand(self, other):\n", + " return (hasattr(other, \"grid\") and hasattr(other, \"player_pos\") and hasattr(other, \"player_alive\"))\n", + " \n", " def __lt__(self, other):\n", - " if self == other: return False\n", - " return id(self) < id(other)\n", + " if not self._is_valid_operand(other):\n", + " return NotImplemented\n", + " return ((self.grid, self.player_pos, self.player_alive) <\n", + " (other.grid, other.player_pos, other.player_alive))\n", " \n", " def clone(self):\n", " return copy.deepcopy(self)\n", @@ -251,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -300,7 +306,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -309,7 +315,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOIAAAEACAYAAACu66rqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADgdJREFUeJzt3V+MXHd5xvHvs3bi3fU2Cy12CpiYoMpKgoIcq00iTFqo\nAzUBBWGpgoAUOaroRWkdpTUQ5SbxRS9AQjRSK1UREAM1EGW7blIp0BiCQFA1dmI72cTr0sZJ7fyz\njQBbazvIjt9ezHHlrnc9Z9fnN3l3z/ORVjuzOvP7vWfGj8+Zc2beo4jAzN5YfW90AWbmIJql4CCa\nJeAgmiXgIJol4CCaJVAriJJulzRW/WwoXZRZ23QNoqR3A38G/D6wEviopHeVLsysTepsEa8EHo+I\n30TE68BPgHVlyzJrlzpBfAa4QdKbJQ0CNwHvKFuWWbss7LZAROyV9EVgGzAB7AJeL12YWZtopp81\nlfS3wIGI+MdJf/eHVs2mEBHqtkzXLSKApCURcVjSZcDHgeunWm7zuqtnVuEMbN1zkI9fdWmx8T1H\nrjnmwzoArB8dq7VcrSAC/yzpt4GTwF9ExNHZFmZm56oVxIj4w9KFmLXZnPlkzRVLFnuOFs0xH9Zh\nJmZ8sGbagaQo+R7RbC5aPzpW62DNnNkims1nDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6i\nWQIOolkCDqJZAg6iWQIOolkCDqJZAnUbDN8h6RlJT0vaIuni0oWZtUmdBsNvA/4KWBUR76Hzrf5P\nli7MrE3q9qxZACyWdBoYBF4uV5JZ+3TdIkbEy8CXgf3AS8CvI+IHpQsza5OuW0RJbwI+BiwHjgAj\nkj4VEd+evOzWPQf/7/YVSxZz5ZKhxgrd8G/jHD12qrHxpjLQ38+J114rOsfS4SG+tObyonN8/ofP\nc+jIRNE5Bgb6OXGi3HNVenwo81qMH55g7+FjM35cnV3TG4F9EfFLAEmjwHuBc4JYskfk0WOn4J5i\nwwNw4p7XaKqHz3Skru1LLtihIxM9WY+Sc5Qe/8wcTbtyydD/2wA9tPdQrcfVOWq6H7heUr86la8B\nxmdTpJlNrc57xO3ACJ1rXjwFCLivcF1mrVK3wfAmYFPhWsxay5+sMUvAQTRLwEE0S8BBNEvAQTRL\nwEE0S8BBNEvAQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEugTl/TFZJ2SdpZ/T4i\naUMvijNri67f0I+InwPXAEjqA14Ethauy6xVZrpreiPwXEQcKFGMWVvNNIifAL5TohCzNqvbch9J\nFwE3A3dOt0zJBsO6COKexoab0qL+RcX7ji4dbu45mc7AQH/x9ejvLztH6fGh8zw1rWSD4TM+DDwZ\nEYenW6Bkg+E4SU8azm5ed3XROXrhxIneNEou+VytHx1zg+Fp3IJ3S82KqHt9xEE6B2pGy5Zj1k51\nGwwfB5YUrsWstfzJGrMEHESzBBxEswQcRLMEHESzBBxEswQcRLMEHESzBBxEswQcRLMEHESzBBxE\nswQcRLMEHESzBBxEswQcRLME6n5Df1jSg5LGJT0r6brShZm1Sd3mUfcCj0TEn0paCAwWrMmsdboG\nUdIlwA0RsR4gIk4BRwvXZdYqdXZNLwd+Ien+6voX90kaKF2YWZvU2TVdCKwCPhsRT0j6OzpNhu+e\nvGDJBsO9aJpbouHsZJ//4fMcOjJRdI652px38vhzcR1KNhh+ETgQEU9U90eAL0y1YMkGw71qmlva\noSMTPVmPuf5czdXXu1iD4Yg4CByQtKL60xpgzyxqNLNp1D1qugHYUl3/Yh9wW7mSzNqnboPhp4A/\nKFyLWWv5kzVmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhm\nCTiIZgk4iGYJ1Po+oqQXgCPAaeBkRFxbsiiztqn7Df3TwPsj4lclizFrq7q7pprBsmY2Q3XDFcA2\nSTskfaZkQWZtVHfXdHVEvCJpCZ1AjkfET0sWZtYmdZtHvVL9PixpK3AtcE4Q53qD4f7+ftaPjhWf\noxfrMReb804efy6uQ7EGw5IGgb6ImJC0GPgQsGmqZedDg2HPUX+OktrWYLjOFvFSYKukqJbfEhGP\nzqZIM5ta1yBGxPPAyh7UYtZaPiVhloCDaJaAg2iWgINoloCDaJaAg2iWgINoloCDaJaAg2iWgINo\nloCDaJaAg2iWgINoloCDaJaAg2iWgINolkDtIErqk7RT0sMlCzJro5lsEW8H9pQqxKzNagVR0jLg\nJuCrZcsxa6e6W8SvAJ+j02jYzBrWNYiSPgIcjIjddFrvl+2jZ9ZCddoprgZulnQTMAD8lqRvRsSt\nkxecDw2Ge9HUdj6sR+lmzHO1SXKxBsMRcRdwF4CkPwL+ZqoQwvxoMLx53dVF5+iF9aNjc76J8Vxt\nkjzbBsM+j2iWQN2L0AAQET8GflyoFrPW8hbRLAEH0SwBB9EsAQfRLAEH0SwBB9EsAQfRLAEH0SwB\nB9EsAQfRLAEH0SwBB9EsAQfRLAEH0SwBB9EsAQfRLIGuXwyWtAj4CXBxtfxIRGwqXZhZm9TpWfMb\nSR+IiOOSFgA/k/S9iNjeg/rMWqHWrmlEHK9uLqITXvc3NWtQ3U7ffZJ2Aa8C2yJiR9myzNqlVvOo\niDgNXCPpEuBfJF0VEedcB2M+9DUt2asTYOnwEF9ac3nROeZD79Re9DVdOtzcv88zivU1PVtEHJX0\nI2AtU1yQZj70NZ2LvTQnmw/P1VztMVusr6mkt0garm4PAB8E9s6uTDObSp0t4luBb0jqoxPcByLi\nkbJlmbVLndMXY8CqHtRi1lr+ZI1ZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZ\nAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAnVaZSyT9JikZyWNSdrQi8LM2qROq4xTwF9HxG5JQ8CT\nkh6NCPetMWtI1y1iRLwaEbur2xPAOPD20oWZtcmM3iNKeiewEni8RDFmbVW7r2m1WzoC3F5tGc9R\nssHw0uGhOd80FzrNf0ubDw2GN27cyAtDzTcAPtvxY8e46rnvNzpm0QbDkhbSCeG3IuKh6ZYr2WC4\ndHdsgPWjY24wXFPpBsObNpW/4Njg4sWNj1mswXDl68CeiLh35qWZWTd1Tl+sBj4N/LGkXZJ2Slpb\nvjSz9qjTYPhnwIIe1GLWWv5kjVkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkC\nDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCdb6h/zVJByU93YuCzNqozhbxfuBPShdi1mZ1Ggz/FPhV\nD2oxay2/RzRLoHaD4TpKNhjuhV40MV46XP456cV6lG5ivHHjRoZ60GC4abNtMKw6TWIlLQf+NSLe\nc55lYvO6q2dcgNl8VjWt7vo/Vt1dU1U/ZlZAndMX3wb+HVghab+k28qXZdYudRoMf6oXhZi1mY+a\nmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCa\nJVAriJLWStor6eeSvlC6KLO2qfMN/T7g7+n0Nn03cIukK0oXNtn44QnP0aI55sM6zESdLeK1wH9F\nxP9ExEngu8DHypZ1rtl0xvIcc3eO+bAOM1EniG8HDpx1/8Xqb2bWEB+sMUuga19TSdcD90TE2ur+\nnUBExBcnLde9QapZC9Xpa1oniAuA/wTWAK8A24FbImK8iSLNrF47xdcl/SXwKJ1d2a85hGbNqtVy\n38zKuuCDNaVP9vfiQqmSlkl6TNKzksYkbSgwxyJJj0vaVc1xd9NzVPP0Sdop6eFC478g6alqPbYX\nmmNY0oOSxqvX5LqGx19R1b+z+n2k6ddc0h2SnpH0tKQtki4+7wMiYtY/dIL838By4CJgN3DFhYw5\nxRzvA1YCTzc57qQ5fhdYWd0eovOeuNH1qMYerH4vAP4DuLbAHHcA/wQ8XOi52ge8udRrUc2xGbit\nur0QuKTgXH3Ay8A7GhzzbdXzdHF1/wHg1vM95kK3iMVP9kcPLpQaEa9GxO7q9gQwToFzpRFxvLq5\niM4/sEbfF0haBtwEfLXJcSdPQ8HTXpIuAW6IiPsBIuJURBwtNR9wI/BcRBzouuTMLAAWS1oIDNIJ\n+7Qu9Amddyf7Jb2Tzhb48QJj90naBbwKbIuIHQ1P8RXgczQc8EkC2CZph6TPFBj/cuAXku6vdh3v\nkzRQYJ4zPgF8p8kBI+Jl4MvAfuAl4NcR8YPzPcYn9M8iaQgYAW6vtoyNiojTEXENsAy4TtJVTY0t\n6SPAwWrLXvIyeqsjYhWdLe9nJb2v4fEXAquAf6jmOQ7c2fAcAEi6CLgZeLDhcd9EZ89wOZ3d1CFJ\n572Y04UG8SXgsrPuL6v+NudUuxAjwLci4qGSc1W7Wj8C1jY47GrgZkn76PwP/wFJ32xwfAAi4pXq\n92FgK523J016ETgQEU9U90foBLOEDwNPVuvSpBuBfRHxy4h4HRgF3nu+B1xoEHcAvydpeXVU6JNA\niaN1vbhQ6teBPRFxb4nBJb1F0nB1ewD4ILC3qfEj4q6IuCwi3kXndXgsIm5tanwASYPVXgOSFgMf\nAp5pco6IOAgckLSi+tMaYE+Tc5zlFhreLa3sB66X1K/O9c3X0DnuMK2uJ/TPJ3pwsr+6UOr7gd+R\ntB+4+8wb+QbnWA18Ghir3sMFcFdEfL/Bad4KfKP6Wlkf8EBEPNLg+L1wKbC1+jjjQmBLRDxaYJ4N\nwJZq13Ef0PjFcSUN0tly/XnTY0fEdkkjwC7gZPX7vvPWUx1eNbM3kA/WmCXgIJol4CCaJeAgmiXg\nIJol4CCaJeAgmiXgIJol8L9rYl7TkKjgYwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -319,7 +325,7 @@ "data": { "image/png": "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\nR8AbDLvtAJBAeQJAAuUJAAmUJwAkUJ4AkEB5AkAC5QkACZQnACRQngCQQHkCQALlCQAJlCcAJFCe\nAJDQqDxt77A9afu/bH+hVCgAqF26PG2fJ+lvJV0r6XJJH7W9pVSw1TQxM9vrCCuqPZ9Uf8ba80n1\nZ6w9n7S6GZtsef6+pGci4qcR8Yqkb0vaWSbW6pqcmet1hBXVnk+qP2Pt+aT6M9aeT1rdjE3K822S\njs07/nz3NAB4w+MNIwBIcETkftC+UtJtEbGje/wWSRERX110vtwFAEAFImLJwVJNyvN8SU9L2i7p\nfyQ9LOmjETGRDQkA/SI9AC4ifm37LyQdUGf3/26KE8Bakd7yBIC1rLU3jGr/AL3tTbYP2X7K9hHb\nu3qdaSm2z7P9qO0Hep1lKbbX2/6O7YnubfneXmdazPanbT9p+wnb99l+cwWZ7rY9ZfuJeae91fYB\n20/bfsj2+sry7e7ez4dtf9f2hb3Kt1zGef/3Wduv2v7Nti6/lfLskw/Qn5L0mYi4XNIfSPpkhRkl\n6WZJ470OsYI7JX0vIkYl/Y6kql66sX2xpE9J2hYR71HnpaobeptKknSPOo+P+W6RdDAi3iXpkKQv\nrnqq/7dUvgOSLo+IKyQ9o97mk5bOKNubJF0j6adtXnhbW57Vf4A+Il6KiMPdw7PqPOir+pxq95fg\ng5K+0essS+luebw/Iu6RpIg4FREv9zjWUs6XNGR7naQLJL3Y4zyKiB9K+sWik3dKurd7+F5JH17V\nUPMslS8iDkbEq92j/yFp06oHW5hnqdtQkr4u6XNtX35b5dlXH6C3famkKyT9uLdJznL6l6DWF6Y3\nS/qZ7Xu6Ly3cZXuw16Hmi4gXJX1N0lFJL0j6ZUQc7G2qZW2IiCmp8+QuaUOP86zkzyQ92OsQi9m+\nTtKxiDjS9mWt+Q/J2x6WtEfSzd0t0CrY/pCkqe7Wsbv/arNO0jZJfxcR2yT9Sp1dz2rYfos6W3SX\nSLpY0rDtG3ub6pxV+aRp+y8lvRIR9/c6y3zdJ+5bJX1p/sltXV5b5fmCpLfPO76pe1pVurtxeyT9\nU0Ts73WeRa6SdJ3tZyX9s6Q/sv2PPc602PPqPMs/0j2+R50yrcnVkp6NiJ9HxK8l7ZX0vh5nWs6U\n7Y2SZPsiSdM9znMW22PqvJRU4xPQOyVdKulx28+p0zs/sd3KFnxb5fmfkn7L9iXddzZvkFTju8Xf\nlDQeEXf2OshiEXFrRLw9It6hzu13KCI+3utc83V3MY/Zvqx70nbV9+bWUUlX2h6wbXUy1vKm1uI9\nigckjXUPf0JSr5/QF+SzvUOdl5Gui4j/7Vmqhc5kjIgnI+KiiHhHRGxW58n9dyOilSehVsqz+wx/\n+gP0T0n6dm0foLd9laSPSfqA7ce6r9nt6HWuPrRL0n22D6vzbvtXepxngYh4WJ0t4sckPa7OA+2u\nnoaSZPt+ST+SdJnto7ZvknS7pGtsn/7Lvdsry/c3koYl/Vv38fL3vcq3Qsb5Qi3utvMheQBIWPNv\nGAFABuUJAAmUJwAkUJ4AkEB5AkAC5QkACZQnACRQngCQ8H/AGJvttLXzoQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -329,7 +335,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU8AAAD7CAYAAADq4RYlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADutJREFUeJzt3W+MnXWZxvHrgmo6zCzVTaYl2AjVDXZKdNkmKisxm3Ug\nNJiAmGyCmGjZt64lalTEF+KbDTYYl/33gogVN7AmdtuUbHTp1iYmrllZhEJhZlizEFtgmRmjlsxY\nDJV7X5wz3ZnpzLS9n98z53eY7ydpcub09Pdc50+v8zznnDm3I0IAgPNzQa8DAEA/ojwBIIHyBIAE\nyhMAEihPAEigPAEgYV3bG7DNZ6EA9K2I8FLnt16ekvTtj757NTaTtn9sUjdv29TrGMuqPZ9Uf8ba\n80n1Z6w9n1Q+4859R5f9Ow7bASCB8gSABMpT0tbhwV5HWFHt+aT6M9aeT6o/Y+35pNXN6LZ/t912\n1P6aJwAsZee+o8u+YcSeJwAkUJ4AkEB5AkAC5QkACZQnACRQngCQQHkCQALlCQAJlCcAJJy1PG3f\nb3vS9lPzznur7YO2n7X9iO0N7cYEgLqcy57nHknXLzrvDkmHIuJdkg5L+lLpYABQs7OWZ0T8WNKv\nF519k6QHuqcfkPSRwrkAoGrZ1zw3RsSkJEXEy5I2losEAPUr9YYRozYArCnZMRyTtjdFxKTtSyRN\nrXTh/WOTp09vHR7UyPBQcrPSrkfG9crsqfS/X8rFg+v0t9ePFFtv7J07dNFgue8VnJmZ0T333FNs\nvY0bhrR7dEux9STpCz98XlMnZoqtVzpj6XySNDCwXidPvlrtemvxNmx6ncenZzQxPXtOlz3X8nT3\nz5yHJe2U9DVJn5R0YKV/XHKmyCuzp6S7ii3XWfOusmVcsjglaWhoSCW/d9Ve8usJG5k6MVN1xtL5\npE7G0teZ27D5ek2MDA8t2Lk7MLH8fuG5fFTpIUk/kXSF7WO2b5N0t6TrbD8rabT7MwCsGWfd84yI\nW5f5q2sLZwGAvsFvGAFAAuUJAAmUJwAkUJ4AkEB5AkAC5QkACZQnACRQngCQQHkCQALlCQAJlCcA\nJFCeAJBAeQJAAuUJAAmUJwAkUJ4AkJCdYdQzfpMUd5Vfs6Tfzs4Wn2FUcqTC+vXrtXPf0WLrza1Z\nc8bS+dpYk9uwuYGB9cXWOpu+K894Ta3MUSlp2//8W9H1du47WvWsnDbWrH29uTW//dF3F1uv9vu5\nXx43q4XDdgBIoDwBIIHyBIAEyhMAEihPAEigPAEggfIEgATKEwASKE8ASKA8ASCB8gSABMoTABIo\nTwBIoDwBIKFRedr+jO2nbT9l+0Hbby4VDABqli5P25dK+rSk7RHxHnW+G/SWUsEAoGZNvwz5QkmD\ntl+XdJGkl5pHAoD6pfc8I+IlSV+XdEzSi5J+ExGHSgUDgJql9zxtv0XSTZIuk3RC0l7bt0bEQ4sv\nu39s8vTprcODGhkeym5WAwPl56iUnnvyhR8+r6kTM8XWK32d+2EWTe3rSeUfN7Xfz/3wuGl6n4xP\nz2hievacLtvksP1aSc9FxK8kyfY+SR+QdEZ53rxtU4PNLHTy5KvVzzCaOjFTfC5LzbNypPoztjV/\np6TSj+025gOVvI+ldu7nJkaGhxbs3B2YmFr2sk3ebT8m6Wrb691JPCppvMF6ANA3mrzm+aikvZKe\nkPSkJEu6r1AuAKhao3fbI+Krkr5aKAsA9A1+wwgAEihPAEigPAEggfIEgATKEwASKE8ASKA8ASCB\n8gSABMoTABIoTwBIoDwBIIHyBIAEyhMAEihPAEigPAEggfIEgISmo4dXXT8MgCudsfZ8c2uWXq8f\nhpft3He06Ho1X+eBgbLXV6pvANz56Lvy7IcBcG0M8ipprd6GbVznmjPWPpRPauc6rxYO2wEggfIE\ngATKEwASKE8ASKA8ASCB8gSABMoTABIoTwBIoDwBIIHyBIAEyhMAEihPAEigPAEggfIEgIRG5Wl7\ng+3v2R63/Yzt95cKBgA1a/p9nvdK+n5E/IXtdZIuKpAJAKqXLk/bF0v6YETslKSIOCXplUK5AKBq\nTQ7bt0j6pe09th+3fZ/tgVLBAKBmTQ7b10naLulTEfGY7b+RdIekryy+4P6xydOntw4PamR4KL3R\nNubvlJ5FUzrjxg3522sp/XAb1j7Pp40121iv5vukjTWbzjAan57RxPTsOV22SXm+IOl4RDzW/Xmv\npC8udcGbt21qsJmF2pq/U/PsmNL65Tas/T4pPdOnH27DfnjcNDEyPLRg5+7AxNSyl00ftkfEpKTj\ntq/onjUqaSy7HgD0k6bvtu+S9KDtN0l6TtJtzSMBQP0alWdEPCnpvYWyAEDf4DeMACCB8gSABMoT\nABIoTwBIoDwBIIHyBIAEyhMAEihPAEigPAEggfIEgATKEwASKE8ASKA8ASCB8gSABMoTABKafhny\nqmtr/k7pOSolZ8ds3DCk3aNbiq5X+21Y+zyfuTVrv841r9fGmk1nGJ2PvivPtubvlJxv08Zsm5JK\nFvGctTbPp401++Fx2A+34WrhsB0AEihPAEigPAEggfIEgATKEwASKE8ASKA8ASCB8gSABMoTABIo\nTwBIoDwBIIHyBIAEyhMAEihPAEhoXJ62L7D9uO2HSwQCgH5QYs/zdkljBdYBgL7RqDxtb5Z0g6Rv\nlokDAP2h6Z7nNyR9XlLZr5cGgMqly9P2hyVNRsQRSe7+AYA1ockMo2sk3Wj7BkkDkv7A9nci4hOL\nL7h/bPL06a3DgxoZHkpvtI0BcKWHRpXOWHp42cDAep08+Wqx9ebWrHnYWL8MLyt5P6/V27CJ8ekZ\nTUzPntNl0+UZEXdKulOSbP+ZpM8tVZySdPO2TdnNnKGtAXAllc7YL8PQ1uLwsrV0nUtfX6m+YYkj\nw0MLdu4OTEwte1k+5wkACUVGD0fEjyT9qMRaANAP2PMEgATKEwASKE8ASKA8ASCB8gSABMoTABIo\nTwBIoDwBIIHyBIAEyhMAEihPAEigPAEggfIEgATKEwASKE8ASKA8ASChyJchr6aNG4aKj83YuCE/\nU2m59UrPZemHWTRrbf7OWps5VPo+nluzphlG56PvynP36JZeRzir2jOWnhsj1T9nqV/m76yl9dpY\ns/QT5Eo4bAeABMoTABIoTwBIoDwBIIHyBIAEyhMAEihPAEigPAEggfIEgATKEwASKE8ASKA8ASCB\n8gSABMoTABLS5Wl7s+3Dtp+xfdT2rpLBAKBmTb7P85Skz0bEEdtDkn5m+2BETBTKBgDVSu95RsTL\nEXGke3pG0rikt5UKBgA1K/Kap+3LJV0l6acl1gOA2jUew9E9ZN8r6fbuHugZ9o9Nnj69dXhQI8Nl\nZwbh/LQxB6r0nKU21qt9/k7t65W+T9pYs+k8svHpGU1Mz57TZd1kfojtdZL+VdIPIuLeZS4TpWfH\nAOeLuU3I6D5ulmz3poft35I0tlxxAsAbVZOPKl0j6eOSPmT7CduP295RLhoA1Cv9mmdE/IekCwtm\nAYC+wW8YAUAC5QkACZQnACRQngCQQHkCQALlCQAJlCcAJFCeAJBAeQJAAuUJAAmUJwAkUJ4AkEB5\nAkAC5QkACZQnACRQngCQ0HgAHNAP1uLQu6bD0LAyyhNrwu7RLb2OgDcYDtsBIIHyBIAEyhMAEihP\nAEigPAEggfIEgATKEwASKE8ASKA8ASCB8gSABMoTABIoTwBIoDwBIKFRedreYXvC9n/b/mKpUABQ\nu3R52r5A0t9Lul7SlZI+ZntrqWCraXx6ptcRVlR7Pqn+jLXnk+rPWHs+aXUzNtnzfJ+kn0fELyLi\nNUnflXRTmVira2J6ttcRVlR7Pqn+jLXnk+rPWHs+aXUzNinPt0k6Pu/nF7rnAcAbHm8YAUCCIyL3\nD+2rJd0VETu6P98hKSLia4sul9sAAFQgIpYcLNWkPC+U9KykUUn/K+lRSR+LiPFsSADoF+kBcBHx\ne9t/JemgOof/91OcANaK9J4nAKxlrb1hVPsH6G1vtn3Y9jO2j9re1etMS7F9ge3HbT/c6yxLsb3B\n9vdsj3dvy/f3OtNitj9j+2nbT9l+0PabK8h0v+1J20/NO++ttg/aftb2I7Y3VJZvd/d+PmL7X2xf\n3Kt8y2Wc93efs/267T9sa/utlGeffID+lKTPRsSVkv5U0qcqzChJt0sa63WIFdwr6fsRMSLpjyVV\n9dKN7UslfVrS9oh4jzovVd3S21SSpD3q/P+Y7w5JhyLiXZIOS/rSqqf6f0vlOyjpyoi4StLP1dt8\n0tIZZXuzpOsk/aLNjbe151n9B+gj4uWIONI9PaPOf/qqPqfafRDcIOmbvc6ylO6exwcjYo8kRcSp\niHilx7GWcqGkQdvrJF0k6aUe51FE/FjSrxedfZOkB7qnH5D0kVUNNc9S+SLiUES83v3xPyVtXvVg\nC/MsdRtK0jckfb7t7bdVnn31AXrbl0u6StJPe5vkDHMPglpfmN4i6Ze293RfWrjP9kCvQ80XES9J\n+rqkY5JelPSbiDjU21TL2hgRk1LnyV3Sxh7nWclfSvpBr0MsZvtGSccj4mjb21rzH5K3PSRpr6Tb\nu3ugVbD9YUmT3b1jd//UZp2k7ZL+ISK2S/qtOoee1bD9FnX26C6TdKmkIdu39jbVOavySdP2lyW9\nFhEP9TrLfN0n7jslfWX+2W1tr63yfFHS2+f9vLl7XlW6h3F7Jf1TRBzodZ5FrpF0o+3nJP2zpD+3\n/Z0eZ1rsBXWe5R/r/rxXnTKtybWSnouIX0XE7yXtk/SBHmdazqTtTZJk+xJJUz3OcwbbO9V5KanG\nJ6B3Srpc0pO2n1end35mu5U9+LbK878k/ZHty7rvbN4iqcZ3i78laSwi7u11kMUi4s6IeHtEvEOd\n2+9wRHyi17nm6x5iHrd9RfesUdX35tYxSVfbXm/b6mSs5U2txUcUD0va2T39SUm9fkJfkM/2DnVe\nRroxIn7Xs1QLnc4YEU9HxCUR8Y6I2KLOk/ufREQrT0KtlGf3GX7uA/TPSPpubR+gt32NpI9L+pDt\nJ7qv2e3oda4+tEvSg7aPqPNu+1/3OM8CEfGoOnvET0h6Up3/aPf1NJQk2w9J+omkK2wfs32bpLsl\nXWd77jf37q4s399JGpL0793/L//Yq3wrZJwv1OJhOx+SB4CENf+GEQBkUJ4AkEB5AkAC5QkACZQn\nACRQngCQQHkCQALlCQAJ/wcU+HVoCQewRQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -389,7 +395,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 22, "metadata": { "collapsed": false }, @@ -419,7 +425,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -428,7 +434,7 @@ "data": { "image/png": "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\nG6OvTDFBAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -438,7 +444,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -481,7 +487,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 25, "metadata": { "collapsed": false }, @@ -519,6 +525,14 @@ }, "outputs": [], "source": [ + "class Tree:\n", + " \n", + " def __init__(self):\n", + " self.parent = None\n", + " self.child = set()\n", + " self.moves = set()\n", + "\n", + "\n", "def mcts(maze,iterations):\n", " # Return the expected value (a number between 0 for \"player dead\", 1 for \"made it to the end\")\n", " # for a budget of `iterations` rollouts.\n", @@ -526,6 +540,7 @@ " # Here, don't look at maze.exit_pos or maze.grid:\n", " # you're only allowed to query `maze.available_moves()`, `maze.player_alive`, and `maze.is_at_exit`.\n", "\n", + " \n", " # After training for `iterations` rollouts, run an agent through the maze using that learned policy \n", " # for a large number of times and return the average reward:\n", " # (best_path, expected_reward, test_reward)\n", From 37f9cec0ac6eb8e983b58761e91b116f24567345 Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Wed, 20 Jul 2016 13:28:12 -0700 Subject: [PATCH 10/11] Finished Perceptrons --- projects/6-perceptron/Perceptrons.ipynb | 6 +- projects/6-perceptron/Zhong.ipynb | 335 ++++++++++++++++++++++++ 2 files changed, 338 insertions(+), 3 deletions(-) create mode 100644 projects/6-perceptron/Zhong.ipynb diff --git a/projects/6-perceptron/Perceptrons.ipynb b/projects/6-perceptron/Perceptrons.ipynb index c2e9823..75cf19a 100644 --- a/projects/6-perceptron/Perceptrons.ipynb +++ b/projects/6-perceptron/Perceptrons.ipynb @@ -153,9 +153,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [Root]", "language": "python", - "name": "python3" + "name": "Python [Root]" }, "language_info": { "codemirror_mode": { @@ -167,7 +167,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/projects/6-perceptron/Zhong.ipynb b/projects/6-perceptron/Zhong.ipynb new file mode 100644 index 0000000..6877c12 --- /dev/null +++ b/projects/6-perceptron/Zhong.ipynb @@ -0,0 +1,335 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from random import uniform, choice\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def plot_xys(xy_l_tuples,sz=15):\n", + " t_yes = [a[0] for a in xy_l_tuples if a[1] == 1]\n", + " t_no = [a[0] for a in xy_l_tuples if a[1] == 0]\n", + " plt.plot([x for (x,y) in t_yes],[y for (x,y) in t_yes],'go',markersize=sz)\n", + " plt.plot([x for (x,y) in t_no],[y for (x,y) in t_no],'ro',markersize=sz)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def tuple_append(tpl,elt):\n", + " return tuple(list(tpl)+[elt])\n", + "\n", + "def perceptron(training, epochs):\n", + " # some parameters, maybe interesting to make these arguments\n", + " rate = 1.0\n", + " # how many weights do we need?\n", + " feature_count = len(training[0][0])\n", + " # pad each training example with a dummy 1 input\n", + " training = [(tuple_append(ins,1), label) for (ins,label) in training]\n", + " # initialize weights to random values\n", + " weights = [uniform(0,0.05) for _r in range(0,feature_count+1)]\n", + " # let's store the errors found during training\n", + " errors = []\n", + " for i in range(0,epochs):\n", + " # in each epoch, pick a subset of the training set (just one for now)\n", + " (example,actual) = choice(training)\n", + " # calculate the perceptron activation and the predicted category\n", + " # Note: You can use dot(vec1, vec2) to get the dot product between two sequential collections.\n", + " # calculate the error between predicted and actual and add it to errors\n", + " \n", + " activation = np.dot(weights, example)\n", + " predicted = 1 if activation >= 0 else 0\n", + " error = actual - predicted\n", + " errors.append(error)\n", + " # update each weight according to the perceptron update rule\n", + " \n", + " \n", + " for i in range(0, len(weights)):\n", + " weights[i] += example[i] * error\n", + " return (errors,weights)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADzpJREFUeJzt3H+I3Hedx/Hnq8ZKDW2hFgMmtnfXXCyKNYomAQs3tnJN\nBYn4z7X1KhaVwF1U8A9TK22X1qr548Bri0rugiKnRLDC5TzFinSR3jUxQrbRM+kmVWKTSrz6o8Ze\neqThfX/sXDpdk8zs7uxs9pPnAwb2O/PZ77z5svvMN9+Z2VQVkqQ2XbDQA0iS5o+Rl6SGGXlJapiR\nl6SGGXlJapiRl6SG9Y18km1JjibZe5Y19yc5kGQiyerhjihJmq1BzuS/DNxwpgeT3AhcVVV/CWwE\nvjSk2SRJc9Q38lX1KPC7syzZAHy1u3YXcGmSZcMZT5I0F8O4Jr8ceKpn+0j3PknSAvOFV0lq2JIh\n7OMI8Nqe7RXd+/5EEv9QjiTNQlVlNt836Jl8urfT2QG8HyDJOuD3VXX0TDuqM9weWrqUiYkJquq8\nuN19990LPsO5cvNYeCzO92OxZ88eXvm3r4QxTn+bg75n8km+DnSAVyX5JXA3cCFQVbW1qr6T5F1J\nDgLPAbfNZpA9y5dz46pVs/lWSVrUXve617Hif1YwyeTQ99038lV1ywBrNs1liD8AL1+3josuumgu\nu5GkRemiiy5i7WvXMvm/k/CK4e77nHjh9Z+XLeN9d9650GOMVKfTWegRzhkeixd5LF50vh2Luzbd\nxbInhv/u81SN7rXQJH/ybDsuuYT/3ryZD95xx8jmkKRz0X3/eB9bJrZw7M+OvfSBsfl/4XXo/gD8\nw7JlBl6Suj71sU9x++rbWbZ3GTw/nH2O/Ez+oaVLmVixgpevXcstd97JVStXjuz5JWkxOHjwIPc+\neC87f7mTI0uP8Ny/PDfrM/mRR35iYoJVq1b5Iqsk9XH8+HEmJydZvXr14on8KJ9PklqQZPFdk5ck\nzT8jL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAj\nL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kN\nM/KS1DAjL0kNM/KS1DAjL0kNGyjySdYn2Z9kMsnm0zx+SZIdSSaS/CTJB4Y+qSRpxlJVZ1+QXABM\nAtcDTwO7gZuqan/Pmk8Cl1TVJ5NcDjwBLKuqF6btq/o9nyTppZJQVZnN9w5yJr8GOFBVh6rqBLAd\n2DBtTQEXd7++GPjN9MBLkkZvkMgvB57q2T7cva/Xg8DrkzwNPA58bDjjSZLmYsmQ9nMDsKeqrkty\nFfD9JNdU1R+nLxwbGzv1dafTodPpDGkESWrD+Pg44+PjQ9nXINfk1wFjVbW+u307UFW1pWfNt4HP\nVtV/dLd/AGyuqh9P25fX5CVphub7mvxuYGWSK5NcCNwE7Ji25hDwzu4wy4BVwM9nM5AkaXj6Xq6p\nqpNJNgEPM/WPwraq2pdk49TDtRX4NPCVJHu73/aJqvrtvE0tSRpI38s1Q30yL9dI0ozN9+UaSdIi\nZeQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQl\nqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFG\nXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaNlDkk6xPsj/JZJLNZ1jTSbIn\nyU+TPDLcMSVJs5GqOvuC5AJgErgeeBrYDdxUVft71lwK/Cfw11V1JMnlVfXMafZV/Z5PkvRSSaiq\nzOZ7BzmTXwMcqKpDVXUC2A5smLbmFuChqjoCcLrAS5JGb5DILwee6tk+3L2v1yrgsiSPJNmd5NZh\nDShJmr0lQ9zPW4DrgKXAY0keq6qDQ9q/JGkWBon8EeCKnu0V3ft6HQaeqarngeeT/BB4E/AnkR8b\nGzv1dafTodPpzGxiSWrc+Pg44+PjQ9nXIC+8vgx4gqkXXn8F/Ai4uar29ay5GngAWA+8AtgF/E1V\n/WzavnzhVZJmaC4vvPY9k6+qk0k2AQ8zdQ1/W1XtS7Jx6uHaWlX7k3wP2AucBLZOD7wkafT6nskP\n9ck8k5ekGZvvt1BKkhYpIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPy\nktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQw\nIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9J\nDRso8knWJ9mfZDLJ5rOse1uSE0neO7wRJUmz1TfySS4AHgRuAN4A3Jzk6jOs+xzwvWEPKUmanUHO\n5NcAB6rqUFWdALYDG06z7iPAN4FfD3E+SdIcDBL55cBTPduHu/edkuQ1wHuq6otAhjeeJGkuhvXC\n6+eB3mv1hl6SzgFLBlhzBLiiZ3tF975ebwW2JwlwOXBjkhNVtWP6zsbGxk593el06HQ6MxxZkto2\nPj7O+Pj4UPaVqjr7guRlwBPA9cCvgB8BN1fVvjOs/zLwb1X1rdM8Vv2eT5L0UkmoqlldIel7Jl9V\nJ5NsAh5m6vLOtqral2Tj1MO1dfq3zGYQSdLw9T2TH+qTeSYvSTM2lzN5P/EqSQ0z8pLUMCMvSQ0z\n8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLU\nMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMv\nSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUsIEin2R9kv1JJpNsPs3jtyR5vHt7NMkb\nhz+qJGmmUlVnX5BcAEwC1wNPA7uBm6pqf8+adcC+qno2yXpgrKrWnWZf1e/5JEkvlYSqymy+d5Az\n+TXAgao6VFUngO3Aht4FVbWzqp7tbu4Els9mGEnScA0S+eXAUz3bhzl7xD8EfHcuQ0mShmPJMHeW\n5B3AbcC1Z1ozNjZ26utOp0On0xnmCJK06I2PjzM+Pj6UfQ1yTX4dU9fY13e3bweqqrZMW3cN8BCw\nvqqePMO+vCYvSTM039fkdwMrk1yZ5ELgJmDHtAGuYCrwt54p8JKk0et7uaaqTibZBDzM1D8K26pq\nX5KNUw/XVuBO4DLgC0kCnKiqNfM5uCSpv76Xa4b6ZF6ukaQZm+/LNZKkRcrIS1LDjLwkNczIS1LD\njLwkNczIS1LDjLwkNczIS1LDjLwkNczIS1LDjLwkNczIS1LDjLwkNczIS1LDjLwkNczIS1LDjLwk\nNczIS1LDjLwkNczIS1LDjLwkNczIS1LDjLwkNczIS1LDjLwkNczIS1LDjLwkNczIS1LDjLwkNczI\nS1LDjLwkNczIS1LDRh75iYkJjh8/PuqnlaRF5/jx40xMTMxpH0uGNMvAfvH2t/OtFStYsnYt77vr\nLq5auXLUI0jSOe3Jgwf52j338MKuXbz58OE57StVNaSxBniy5NSzHQP+adkyLv3oR/ngHXeMbAZJ\nOpdtu+8+nn3gAT589CgXd+8LUFWZzf4GulyTZH2S/Ukmk2w+w5r7kxxIMpFkdb99Xgx8/OhRXv25\nz7HtM5+Z4diS1J5t993Hq7ds4eM9gZ+rvpFPcgHwIHAD8Abg5iRXT1tzI3BVVf0lsBH40qADvPvY\nMZ69/36ePHhwRoMvduPj4ws9wjnDY/Eij8WLzrdj8eTBgzz7wAO8+9ixoe53kDP5NcCBqjpUVSeA\n7cCGaWs2AF8FqKpdwKVJlg06xIeOHuVr99476PImnG8/wGfjsXiRx+JF59ux+No99/Dho0eHvt9B\nIr8ceKpn+3D3vrOtOXKaNWd0CXBi507fdSPpvHT8+HFe2LVraJdoep0z75N/85EjTE5OLvQYkjRy\nTzzxxJzfRXMmfd9dk2QdMFZV67vbtwNVVVt61nwJeKSqvtHd3g/8VVUdnbav0b2VR5IaMtt31wzy\nPvndwMokVwK/Am4Cbp62Zgfw98A3uv8o/H564OcypCRpdvpGvqpOJtkEPMzU5Z1tVbUvycaph2tr\nVX0nybuSHASeA26b37ElSYMY6YehJEmjNS8vvM7Hh6cWq37HIsktSR7v3h5N8saFmHMUBvm56K57\nW5ITSd47yvlGacDfkU6SPUl+muSRUc84KgP8jlySZEe3FT9J8oEFGHPeJdmW5GiSvWdZM/NuVtVQ\nb0z9w3EQuBJ4OTABXD1tzY3Av3e/XgvsHPYc58JtwGOxDri0+/X68/lY9Kz7AfBt4L0LPfcC/lxc\nCvwXsLy7fflCz72Ax+KTwGf//zgAvwGWLPTs83AsrgVWA3vP8PisujkfZ/Lz/uGpRaTvsaiqnVX1\nbHdzJzP4fMEiM8jPBcBHgG8Cvx7lcCM2yLG4BXioqo4AVNUzI55xVAY5FgWn3kJ+MfCbqnphhDOO\nRFU9CvzuLEtm1c35iPy8f3hqERnkWPT6EPDdeZ1o4fQ9FkleA7ynqr7I1N9katUgPxergMuSPJJk\nd5JbRzbdaA1yLB4EXp/kaeBx4GMjmu1cM6tujvxPDev0kryDqXclXbvQsyygzwO912RbDn0/S4C3\nANcBS4HHkjxWVefXH3macgOwp6quS3IV8P0k11TVHxd6sMVgPiJ/BLiiZ3tF977pa17bZ00LBjkW\nJLkG2Aqsr6qz/XdtMRvkWLwV2J4kTF17vTHJiaraMaIZR2WQY3EYeKaqngeeT/JD4E1MXb9uySDH\n4jbgswBV9WSSXwBXAz8eyYTnjll1cz4u15z68FSSC5n68NT0X9IdwPvh1CdqT/vhqQb0PRZJrgAe\nAm6tqicXYMZR6Xssquovurc/Z+q6/N81GHgY7HfkX4Frk7wsySuZeqFt34jnHIVBjsUh4J0A3WvQ\nq4Cfj3TK0Qln/h/srLo59DP58sNTpwxyLIA7gcuAL3TPYE9U1ZqFm3p+DHgsXvItIx9yRAb8Hdmf\n5HvAXuAksLWqfraAY8+LAX8uPg18peethZ+oqt8u0MjzJsnXgQ7wqiS/BO4GLmSO3fTDUJLUsHPm\nr1BKkobPyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw/4P4LBAXZvwSAcAAAAASUVORK5C\nYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYMAAAEACAYAAABRQBpkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGHhJREFUeJzt3X+MZXV5x/HPMzM7s92lUlFZhBWwoAgmlfLHFksaxwKy\n2AZsYizYFDW2waa0pm0ahZqw+5/+0RiN+AOLBEwtrTbCij+Kho6GGCmtrr8AXX8ty4JrFZcI3fn9\n9I9zD3P3cu/MPd9z5n6/33Pfr2TCzJ17z33msDmfc57znHPN3QUAGG8TsQsAAMRHGAAACAMAAGEA\nABBhAAAQYQAAUENhYGa3mNkRM/vWOs95v5kdMLP9ZnZ+E+8LAGhGU0cGt0q6bNAvzexySWe5+0sk\nXSvpww29LwCgAY2EgbvfJ+mX6zzlSkm3d557v6QTzWxHE+8NAKhvVOcMTpN0qOvnw53HAAAJ4AQy\nAEBTI3qfw5Je1PXzzs5jz2Jm3CwJACpyd6vz+iaPDKzz1c8+SddIkpldKOmoux8ZtCB3H/rr2mtd\ne/cO//zN+HrkEdf0dPXXXXaZ6/bbB//+xhtvjPp3pfLFemBdsC7W/2pCI0cGZvYJSbOSnmdmj0i6\nUdK0JHf3m939c2b2WjP7gaSnJb2lifeVpPl5aXm5qaWNtoYUagcAqaEwcPc3DvGc65p4r14pbFDn\n56XV1eJrosKxVgq1A4DUghPICwvxN6gLC8V/V1aqv2692mdnZ4NrahPWwxrWxRrWRbOyD4MU9q7n\n54v/Vq1jo9r5x15gPaxhXaxhXTSLMGioBqn5MACAUck+DBYWqrdnNqMGKaxNFLt2AJBaEAYp7F1z\nZAAgd4RBQzVIhAGAfGUfBilNE1Wpwz2N2gFAakEYpLB3HXJksLxcXJcQu3YAkAiDxmqQqtUR2loC\ngM2QfRikMJETMk0UOoEEAJsh+zDgyAAA6ss6DJaXiz3r2BtUwgBA7rIOg5ApnlTqSKV2AJAyD4NU\n9q45MgCQO8IgUh2p1A4AUuZhkMpETkgdhAGAlGQdBqlsUEPqSCXIAEAiDKLVkUrtACBlHgYLC9LM\nTPwNakgd8/PS9HT82gFAyjwM5uel7dvjb1BD6lhYkE44IX7tACC1IAxS2KCG1JFK7QAgZR4G5d51\n7JOwIXUQBgBSknUY5N4m2r49fpABgEQYRKsjldoBQMo8DFI5CRtSB20iACnJOgxS2buu0yaKXTsA\nSC0IgxT2rpkmApA7wqCm5eXiw+23biUMAOQr6zBIYSKnvPp4aqr6x17SJgKQiqzDIIVzBvPzxVHB\n1FTYNBGjpQBSkH0YxG611AmD2LUDQCnrMFhYkLZtk1ZXi69YNZRtIq4zAJCrrMOge688Vrsl9Mgg\nlWskAEBqURjE2qjSJgLQBlmHQdmimZyMd2QQWgNtIgApyToMcj4ySGEsFgBKhEGkGmgTAUhJ1mGw\nsBA/DEJroE0EICVZh8H8fNhYZwo1ME0EICXZh0HsI4O6VyCX9zYCgJiyDoPuFk3MaaKqNaysFF/T\n09LERLwL5gCglHUYlC2aycn4baIqNZQBYhZ3LBYAStmHQY5tovI1UtzaAaCUdRjkOk1UHk1IhAGA\nNGQbBqur0uJi0XePfWRQdZqoDBCJMACQhmzDoLwNhFn8MKBNBCB3WYdB9wY1p2ki2kQAUtNIGJjZ\nbjN72My+b2bv6PP7V5nZUTP7eufrXXXfs3uDmts0UfeRQczaAaA0VXcBZjYh6QOSLpb0mKQHzOwu\nd3+456lfcfcr6r5fKZVWS0ibKJWjGgAoNXFksEvSAXc/6O5Lku6QdGWf51kD7/WMVE7CMk0EoA2a\nCIPTJB3q+vnRzmO9Xmlm+83ss2Z2Xt03TWWDGjJNlMpRDQCUareJhvQ/kk539/8zs8sl3SnppYOe\nvGfPnme+n52d1ezs7LOek8oGtYk2EWEAoIq5uTnNzc01uswmwuCwpNO7ft7ZeewZ7v5U1/efN7MP\nmtlJ7v5EvwV2h8EgqfTdmSYCMGq9O8l79+6tvcwm2kQPSDrbzM4ws2lJV0na1/0EM9vR9f0uSTYo\nCIaVykROWQfTRAByVvvIwN1XzOw6SfeoCJdb3P0hM7u2+LXfLOn1ZvYXkpYkHZP0x3XfN5W967KO\niQmmiQDkq5FzBu7+BUnn9Dz2ka7vb5J0UxPvVUrtnMHqKtNEAPLVmiuQcxstTaF2AChlGwap7F1z\nozoAbZB1GKSwQQ29UV0KQQYApWzDoHvvOuanhZV1VKmBaSIAqck2DFLYuw79TAXaRABSk3UYxN6g\nhn6mQm+QMVoKILZswyCFvevQGlIIMgDolm0YpNAmCq2BMACQmqzDIPYGNbSGFI5qAKBbtmGQwi0d\nQieaUjiqAYBu2YZBCh972V3DRGdNrq4O9zpGSwGkJOswiN1q6a6hSh0pHNUAQLdswyCFvnt3DVXq\noE0EIDXZhkEKG9TuGqrUkcJRDQB0yzoMYm9Qm2oTEQYAYss2DFLou/drEw1TRwpHNQDQLdswSGEi\np/fIYNg6UqgdALplHQax965Dzhm4S0tL3JsIQFqyDYMU+u4h00QLC9KWLcXN7YZ9DQBstmzDINcT\nyKEnnQFgM2UdBjm2iUKvTQCAzZRlGLivfZaAlNc0Uei1CQCwmbIMg6WlYiM6OVn8nNM0UegEEgBs\npizDIJW965A6OGcAIEVZhkEqfffQaaLeAGG0FEBsWYZBKnvXTBMBaItsw4A2EQA0J9swCLknUAp1\n9GsTEQYAYssyDHI+Z8CRAYAUZRkGve2ZFD72ctg6GC0FkKJswyCFveuQOpgmApCiLMOANhEANCvL\nMEhlg8poKYC2yDYMUpjICb1RXQq1A0C3LMMg9OMmU6iDIwMAKcoyDFKZyOFGdQDaItswSKHVQpsI\nQFtkGQYpTBP1fqbCsHWkcvU0AHTLMgxS6Lv3fqbCsHWkUDsA9Mo2DGK3WnprGLaOFGoHgF5ZhkEK\n00S9NQxbRwotLgDolWUYpDCR01vDsHWkUDsA9Mo2DLpbLROdv2J1NV4NEm0iAPnKMgwGtWhGuVEN\nrSGFFhcA9MoyDPq1aEYdBqE1ME0EIEXZhkFIiyaFGmgTAUhRlmEQOsmTQg1MEwFIUSNhYGa7zexh\nM/u+mb1jwHPeb2YHzGy/mZ1f5/1oEwFAs2qHgZlNSPqApMskvVzS1Wb2sp7nXC7pLHd/iaRrJX24\nznv2a9GMekQztAZGSwGkqIkjg12SDrj7QXdfknSHpCt7nnOlpNslyd3vl3Sime0IfcPcp4k4ZwAg\nNVMNLOM0SYe6fn5URUCs95zDnceODFrooUPS/v39f/fEE8NtiPfvL5ZT1QUXSKed9uzHH3xQ+uEP\ni+/vv3+4Gn71K+nLXy5ubCc9+4hicrK4PsJdMlt7/KtflX7xi+q1AxgPZ58tnXtuc8trIgwat2fP\nHn32s9LBg9JZZ83q+c+fPe73F10knXLK8a/ptyG+6irp1FOl7duHf+8f/1i69FLpve999u/e9rbi\nBPFJJxU/v/GNG9dw553SDTdI53fOklxzTfG8klkRCCsrxz/+6ldLl1yydkEdAJR+/vM57dgx98x2\npQlNhMFhSad3/byz81jvc160wXOesWfPHh08WGx83/rW4YroN8lz7Jj0sY9JZ5453DIk6UMfkr75\nzf6/O3ZMuukmaVfvcc8GNezeLX30o4PfswyRMgxWV4u7ot599/FHCwBQmO18Ffbu3Vt7iU3sdz4g\n6WwzO8PMpiVdJWlfz3P2SbpGkszsQklH3X1gi0jq35NfT7+98qrLkIrnLyyE1RRaQ+/ryvMKBAGA\nUal9ZODuK2Z2naR7VITLLe7+kJldW/zab3b3z5nZa83sB5KelvSWjZbbb3RzPf2mcqouQyqePz8f\nVlNoDb2vC6kbAOpo5JyBu39B0jk9j32k5+frqiyz6gax3175qMMgtIbe1xEGAEYt2dOTvSOYG+nd\noJYfSzk9Xe19Z2bWbxOtV9OgMNjo7+g911D1bweAupINg7pHBouLRRBUncZp+sgg5JwBRwYARq21\nYRC6QaVNBGAcJRsGIW2i7lbLMO2ZfmZm+ofB6ura0cawNQxbx6BpIgAYlWTDoO40UchYqTR4tHRx\nceNxz37TRMPUwTQRgNhaEwab3SYKafeEvo4wADBqSYdBnWmipttEIe2eKq9rosUFAKGSDYO6VyA3\n3SYKmQoKfV1o7QAQKtkwoE00XL0A0IQkw2Blpdg4btky/Gs2e5oopN1T5XVNtLgAIFSSYVC2Sarc\nqK2paaKpqeLq5SamgkJfR5sIwKglGQYhbZKmWi1m/c8b0CYC0GbJhkHVNkmTrZZ+raLNniaiTQQg\npiTDIKRN0uRETr8jg82eJuq9UR1HBgBGKckwiNkmkvpPFNEmAtBmyYZBSJuoqQu36rSJ+k0ThYQB\nbSIAo5RkGLSlTeS+8c3t+r2ONhGAUUsyDELaJE3e7C20TdRbw+Jica3ERp+pwI3qAMSWbBi0YZpo\n2I06bSIAsSUZBk20ieoeGTTRJhp2o840EYDYkgyDJqaJ6p4zCG0TrawU5wqq1MA0EYDYWhUGsaeJ\nzIpAWF1dew1tIgA5SDIMQj72MYU2UW8dVdpETBMBiCnJMGhimihGm6i3jmFrYJoIQGytCYMUpol6\n66BNBCAXSYYBbSKODACMVpJhkOs0UW8dVQKk9+Q3YQBglFoVBrGniXrroE0EIBdJhgFtIo4MAIxW\nkmEwztNE7mFhCAB1tCYM2jJNtLhY/LzRze0AoElJbnJSaBM1cQI5JEBoEQGIIckwSGGaqIlzBiHT\nREwSAYihlWHgXq9N1OSRwWa9BgCalGQYhLaJyr3r5eXipnFTU2HvH3O0lJPHAGJIMgzqHhnU3buO\nOVrKkQGAGFoTBiEjnYP0tomqtJ3qjpYSBgBiSDIM6k4T1b2Ct7dNtLRUbLAnJ6vXQZsIQA6SDIPU\n2kRVjjRC20RMEwGIqZVh0HSbqEo9oaOltIkAxJRkGNSdJmq6TVRleUwTAchRkmEwjm0ijgwAxJRk\nGITsHW/mNFGVDTTTRABylGQYTE9Xv1Fbk9NE09PFDeNWV6svj2kiADlKMgxCNoZNtlrMihoWF4uf\naRMBaLskwyBkY9j0nT+7W0WjmCZitBRATK0Kg6amiaTjJ4qYJgLQdoG3ciuY2XMl/aukMyT9RNIb\n3P3JPs/7iaQnJa1KWnL3XestN3abSDp+omjUbaKTTqpeLwDUUffI4J2SvuTu50i6V9L1A563KmnW\n3X97oyCQwjbkTU4TlTWEtImYJgKQo7phcKWk2zrf3ybpdQOeZ1Xeq+45g9htouXlaje3a7p2AKiq\nbhic7O5HJMndfyrp5AHPc0lfNLMHzOzPN1poG9pEy8vFeOwwn6nAx14CiG3DTZWZfVHSju6HVGzc\n39Xn6T5gMRe5++Nm9gIVofCQu9836D0fe2yP9uwpvp+dndXs7OxGZT5rg/qc52z4knXVnSaqciKY\naSIAVczNzWlubq7RZW4YBu5+6aDfmdkRM9vh7kfM7BRJPxuwjMc7//1fM/u0pF2SBobBeeethcGw\nJieLDWrZnnnBC6q9vlfdaaLQcVTaRAA20ruTvHfv3trLrNsm2ifpzZ3v3yTprt4nmNk2Mzuh8/12\nSa+R9J31FhqyMTQrAmF1NY020WZfmwAATaobBu+RdKmZfU/SxZLeLUlm9kIzu7vznB2S7jOzb0j6\nmqTPuPs96y00dGNYTuU0FQZ1pomq7OEzTQQgtlrXGbj7E5Iu6fP445L+sPP9jyWdX2W5oRvDkH79\nIHXaRPPzm39tAgA0KckrkEM3hiEtmkFoEwEYJ0mGQd0jg5htou4aNvNOpwDQpNaFwcpK/DZRWUOV\nAGnyvkoAUFWSYZBKm6jukQFtIgC5SDIMUmkT1T1nQJsIQC5aFQbliGbMNlF3DcP+HRMTxcVy5TUS\ntIkAjFqSYTBubaLu19EmAhBDkmEwbm2i8nVl+AxzczsAaFIrwyD2NFHIHv7UlPT007SIAMTRujCo\nepO49WoIbROF1FCGAS0iADEkGQapnDMYdZvoqacIAwBxJBkGdaaJFhaKPfMtW+rXUOdGdVXbRJOT\nhAGAeFoVBt19d7N6NdQ9ZxDaJuKcAYAYkgyDOm2ipvauR3mjuvJ1HBkAiCXJMKh7ZNBUGMzPFxv2\n1dXhxz3rnDPgBDKAWFoZBk20Wso2UTmmOmzbKeRGdeXraBMBiCXJMEipTRSyUadNBCA3SYZBnWmi\nJsNgfr76Rj3kYy/L1xEGAGJpVRhsRpsopPfPFcgAcpNkGNAmAoDRSjIMQm/U1uRETnlkcOxYeBgw\nTQQgF0mGQagmWy2Tk2t9/KobdaaJAOSmdWHQZKtl61bpySdpEwFoP8JgHVu3SkePjq5NRBgAiKVV\nH6MyOdlsq2VmpjgyqDoiurwsLS1VH0mlTQQgFo4M1kGbCMC4aF0YNDmRM+o2EdNEAGJpZRjEbBNN\nTUmLi9U/U4FpIgAxtS4MUmgTlXv4VT5TgTYRgJhaFwZS/DZRSA1N1w4AVbQqDCYni/822SY6erT6\nNFFIDU3XDgBVtCoMNuPIoGqbaGIirAaODADERBisIyQMzIo6CAMAOWllGMRsE5V1hLymfE8AGLVW\nhkGTRwZVLx4r6+DIAEBOCIN1lMshDAC0XavCYDOmiUKWNznJNBGAvLQqDDgyAIAwhME6CAMA46KV\nYRC7TcQ0EYDctDIMcj4ymJ6u9joAaAJhsI5Rh0HVm9sBQFNaGQa5toloEQGIpVVhUI5nxj4ymJwc\nzWsAoCmtCoOmjwxitIkAIIbWhcH09NqdQ+uqEwYhbSLCAEAstTabZvZ6M/uOma2Y2QXrPG+3mT1s\nZt83s3fUec/1NN13r3POYBQBAgBNqbsP/W1JfyTpy4OeYGYTkj4g6TJJL5d0tZm9rOb79tX03nW5\nrFGFQe9r5ubmqi2kpVgPa1gXa1gXzaoVBu7+PXc/IGm9gchdkg64+0F3X5J0h6Qr67zvIJsRBjMz\n1cc9CYNmsR7WsC7WsC6aNYpzBqdJOtT186OdxxoXcoO49czMhC0v9EZ1tIkAxDK10RPM7IuSdnQ/\nJMkl/YO7f2azCgsxMyNt29bc8rZtC1teSB1N1w4AVZi711+I2X9K+jt3/3qf310oaY+77+78/E5J\n7u7vGbCs+gUBwJhx91r3L9jwyKCCQYU8IOlsMztD0uOSrpJ09aCF1P2DAADV1R0tfZ2ZHZJ0oaS7\nzezzncdfaGZ3S5K7r0i6TtI9kr4r6Q53f6he2QCAJjXSJgIA5C2ZK5BHdWFaisxsp5nda2bfNbNv\nm9lfdx5/rpndY2bfM7P/MLMTY9c6KmY2YWZfN7N9nZ/Hcl2Y2Ylm9kkze6jz7+N3xnhd/E3nItdv\nmdk/m9n0uKwLM7vFzI6Y2be6Hhv4t5vZ9WZ2oPPv5jXDvEcSYTDKC9MStSzpb9395ZJeKekvO3//\nOyV9yd3PkXSvpOsj1jhqb5f0YNfP47ou3ifpc+5+rqRXSHpYY7guzOxUSX8l6QJ3/y0V5zuv1vis\ni1tVbB+79f3bzew8SW+QdK6kyyV90Gzjq6WSCAON8MK0FLn7T919f+f7pyQ9JGmninVwW+dpt0l6\nXZwKR8vMdkp6raR/6np47NaFmT1H0u+5+62S5O7L7v6kxnBddExK2m5mU5J+TdJhjcm6cPf7JP2y\n5+FBf/sVKs7NLrv7TyQdULGNXVcqYTCyC9NSZ2ZnSjpf0tck7XD3I1IRGJJOjlfZSL1X0t+ruJ6l\nNI7r4sWSfm5mt3ZaZjeb2TaN4bpw98ck/aOkR1SEwJPu/iWN4brocvKAv713e3pYQ2xPUwkDSDKz\nEyR9StLbO0cIvWf3W3+238z+QNKRzpHSeoe2rV8XKlohF0i6yd0vkPS0itbAOP67+A0Ve8JnSDpV\nxRHCn2gM18U6av3tqYTBYUmnd/28s/PY2Ogc+n5K0sfd/a7Ow0fMbEfn96dI+lms+kboIklXmNmP\nJP2LpN83s49L+ukYrotHJR1y9//u/PzvKsJhHP9dXCLpR+7+RGdc/dOSflfjuS5Kg/72w5Je1PW8\nobanqYTBMxemmdm0igvT9kWuadQ+JulBd39f12P7JL258/2bJN3V+6K2cfcb3P10d/9NFf8O7nX3\nP5X0GY3fujgi6ZCZvbTz0MUqrtUZu38XKtpDF5rZ1s7J0ItVDBiM07owHX+0POhv3yfpqs601Ysl\nnS3pvzZceCrXGZjZbhWTExOSbnH3d0cuaWTM7CJJX1FxS3DvfN2g4n/gv6lI+YOS3uDuR2PVOWpm\n9ioVtzm5wsxO0hiuCzN7hYoT6Vsk/UjSW1ScSB3HdXGjih2EJUnfkPRnkn5dY7AuzOwTkmYlPU/S\nEUk3SrpT0ifV5283s+slvVXFunq7u9+z4XukEgYAgHhSaRMBACIiDAAAhAEAgDAAAIgwAACIMAAA\niDAAAIgwAABI+n8d4TfIKDZBvgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "and_set = [((0,0),0), ((0,1),0), ((1,0),0), ((1,1),1)]\n", + "plot_xys(and_set)\n", + "\n", + "(errs,_) = perceptron(and_set,100)\n", + "plt.figure()\n", + "plt.plot(errs)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAD1ZJREFUeJzt3X+M3HWdx/HnC3sYJECC5JrYWu6OWohGqEbbJhBvBHMU\nkwvGfw644yI5kyZngeRysYgBNyAqf1yi0KjppdGYO4OJmNjzNGIMG4JHa01Y0LNlu+hhW0wN/iAI\n7aWS9/2xc+2wtp3Z3dnZ7qfPR7JhZ+az33nnk93nTr8zs6SqkCS16azFHkCStHCMvCQ1zMhLUsOM\nvCQ1zMhLUsOMvCQ1rG/kk2xPcijJ06dY80CSfUkmkqwd7oiSpLka5JH8l4BrT3ZjkuuAS6rqLcAm\n4ItDmk2SNE99I19VjwO/PcWS64GvdNfuAi5Isnw440mS5mMY5+RXAPt7Lh/sXidJWmQ+8SpJDVs2\nhGMcBN7cc3ll97o/ksQ/lCNJc1BVmcvXDRr5dD9OZAfwEeBrSTYAv6uqQyc90tiJrz536lx+8M8/\n4IorrhhwpKVtbGyMsbGxxR7jtOBeHOdeHHcm7cXExARX/suVvLL6lRMvGJv7sftGPslXgQ7wxiS/\nAD4BnA1UVW2rqm8neX+SKeBl4Ja5DLLi5RWsWbNmLl8qSUvapZdeyspXVjLJ5NCP3TfyVXXTAGs2\nz2uKI7Bh1QbOOeeceR1Gkpaic845h/VvXs/k/07C64d77NPiidflk8u5a/Ndiz3GSHU6ncUe4bTh\nXhznXhx3pu3F3ZvvZvkzw3/1+aJH/vyfn89t77mN1atXL/YoI3WmfQOfintxnHtx3Jm2F6tXr+bW\n99zKef9z3lCPu3iRPwLLn1rOlnds4c7b71y0MSTpdPHx2z/OHWvvYPnTy+HIcI6ZUf7v/5LUuX93\nLitfWcn6Veu56yN3nXGP4CWpn6mpKe7dei87f7GTg+ce5OV/e3nOL6EceeQnJiZYs2aNT7JKUh+H\nDx9mcnKStWvXLp3I+z8Ol6TZSTLnyC/6E6+SpIVj5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm\n5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWp\nYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYQNFPsnGJHuTTCbZ\ncoLbz0+yI8lEkh8n+dDQJ5UkzVqq6tQLkrOASeAa4HlgN3BDVe3tWfMx4Pyq+liSi4BngOVV9YcZ\nx6p+9ydJeq0kVFXm8rWDPJJfB+yrqueq6ijwEHD9jDUFnNf9/Dzg1zMDL0kavUEivwLY33P5QPe6\nXluBtyZ5HngKuH0440mS5mPZkI5zLfBkVV2d5BLge0kur6rfz1w4NjZ27PNOp0On0xnSCJLUhvHx\nccbHx4dyrEHOyW8AxqpqY/fyHUBV1f09a74FfLqqftC9/H1gS1X9aMaxPCcvSbO00OfkdwOrk1yc\n5GzgBmDHjDXPAe/rDrMcWAP8bC4DSZKGp+/pmqp6Nclm4BGmfylsr6o9STZN31zbgE8CX07ydPfL\nPlpVv1mwqSVJA+l7umaod+bpGkmatYU+XSNJWqKMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOM\nvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1\nzMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhL\nUsOMvCQ1zMhLUsMGinySjUn2JplMsuUkazpJnkzykySPDndMSdJcpKpOvSA5C5gErgGeB3YDN1TV\n3p41FwD/BfxVVR1MclFVvXCCY1W/+5MkvVYSqipz+dpBHsmvA/ZV1XNVdRR4CLh+xpqbgIer6iDA\niQIvSRq9QSK/Atjfc/lA97pea4ALkzyaZHeSm4c1oCRp7pYN8TjvBK4GzgWeSPJEVU0N6fiSpDkY\nJPIHgVU9l1d2r+t1AHihqo4AR5I8BlwB/FHkx8bGjn3e6XTodDqzm1iSGjc+Ps74+PhQjjXIE6+v\nA55h+onXXwI/BG6sqj09ay4DHgQ2Aq8HdgF/U1U/nXEsn3iVpFmazxOvfR/JV9WrSTYDjzB9Dn97\nVe1Jsmn65tpWVXuTfBd4GngV2DYz8JKk0ev7SH6od+YjeUmatYV+CaUkaYky8pLUMCMvSQ0z8pLU\nMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMv\nSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z\n8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUsIEin2Rjkr1JJpNsOcW6dyc5muSDwxtRkjRX\nfSOf5CxgK3At8DbgxiSXnWTdZ4DvDntISdLcDPJIfh2wr6qeq6qjwEPA9SdYdyvwdeBXQ5xPkjQP\ng0R+BbC/5/KB7nXHJHkT8IGq+gKQ4Y0nSZqPYT3x+lmg91y9oZek08CyAdYcBFb1XF7Zva7Xu4CH\nkgS4CLguydGq2jHzYGNjY8c+73Q6dDqdWY4sSW0bHx9nfHx8KMdKVZ16QfI64BngGuCXwA+BG6tq\nz0nWfwn4j6r6xgluq373J0l6rSRU1ZzOkPR9JF9VrybZDDzC9Omd7VW1J8mm6Ztr28wvmcsgkqTh\n6/tIfqh35iN5SZq1+TyS9x2vktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQw\nIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9J\nDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPy\nktQwIy9JDRso8kk2JtmbZDLJlhPcflOSp7ofjyd5+/BHlSTNVqrq1AuSs4BJ4BrgeWA3cENV7e1Z\nswHYU1UvJtkIjFXVhhMcq/rdnyTptZJQVZnL1w7ySH4dsK+qnquqo8BDwPW9C6pqZ1W92L24E1gx\nl2EkScM1SORXAPt7Lh/g1BH/MPCd+QwlSRqOZcM8WJL3ArcAV51szdjY2LHPO50OnU5nmCNI0pI3\nPj7O+Pj4UI41yDn5DUyfY9/YvXwHUFV1/4x1lwMPAxur6tmTHMtz8pI0Swt9Tn43sDrJxUnOBm4A\ndswYYBXTgb/5ZIGXJI1e39M1VfVqks3AI0z/UtheVXuSbJq+ubYBdwEXAp9PEuBoVa1byMElSf31\nPV0z1DvzdI0kzdpCn66RJC1RRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6S\nGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbk\nJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGjbyyE9MTHD48OFR360k\nLTmHDx9mYmJiXsdYNqRZBvbzK6/kGytXsmz9ev727ru5ZPXqUY8gSae1qakp7tl6D7v27+LAGw7M\n61ipqiGNNcCdJcfu7SXgX5cv54LbbuMf7rxzZDNI0unsvs/dx4OPPcihSw/B67tXjkFVZS7HG+h0\nTZKNSfYmmUyy5SRrHkiyL8lEkrX9jnke8E+HDvGnn/kM2z/1qVmOLUntue9z93H/xP0curwn8PPU\nN/JJzgK2AtcCbwNuTHLZjDXXAZdU1VuATcAXBx3gr196iRcfeIBnp6ZmNfhSNz4+vtgjnDbci+Pc\ni+POtL2Ympriwcce5KU/e2moxx3kkfw6YF9VPVdVR4GHgOtnrLke+ApAVe0CLkiyfNAhPnzoEP9+\n772DLm/CmfYNfCruxXHuxXFn2l7cs/We6VM0QzZI5FcA+3suH+hed6o1B0+w5qTOB47u3OmrbiSd\nkQ4fPsyu/buGdoqm12nzOvl3HDzI5OTkYo8hSSP3zDPPzPtVNCfT99U1STYAY1W1sXv5DqCq6v6e\nNV8EHq2qr3Uv7wX+sqoOzTjW6F7KI0kNmeurawZ5nfxuYHWSi4FfAjcAN85YswP4CPC17i+F380M\n/HyGlCTNTd/IV9WrSTYDjzB9emd7Ve1Jsmn65tpWVd9O8v4kU8DLwC0LO7YkaRAjfTOUJGm0FuSJ\n14V489RS1W8vktyU5Knux+NJ3r4Yc47CIN8X3XXvTnI0yQdHOd8oDfgz0knyZJKfJHl01DOOygA/\nI+cn2dFtxY+TfGgRxlxwSbYnOZTk6VOsmX03q2qoH0z/4pgCLgb+BJgALpux5jrgP7ufrwd2DnuO\n0+FjwL3YAFzQ/XzjmbwXPeu+D3wL+OBiz72I3xcXAP8NrOhevmix517EvfgY8On/3wfg18CyxZ59\nAfbiKmAt8PRJbp9TNxfikfyCv3lqCem7F1W1s6pe7F7cySzeX7DEDPJ9AXAr8HXgV6McbsQG2Yub\ngIer6iBAVb0w4hlHZZC9KKb/Egrd//66qv4wwhlHoqoeB357iiVz6uZCRH7B3zy1hAyyF70+DHxn\nQSdaPH33IsmbgA9U1ReAll+JNcj3xRrgwiSPJtmd5OaRTTdag+zFVuCtSZ4HngJuH9Fsp5s5dXPk\nf2pYJ5bkvUy/KumqxZ5lEX0W6D0n23Lo+1kGvBO4GjgXeCLJE1V1Zv2Rp2nXAk9W1dVJLgG+l+Ty\nqvr9Yg+2FCxE5A8Cq3our+xeN3PNm/usacEge0GSy4FtwMaqOtU/15ayQfbiXcBDScL0udfrkhyt\nqh0jmnFUBtmLA8ALVXUEOJLkMeAKps9ft2SQvbgF+DRAVT2b5OfAZcCPRjLh6WNO3VyI0zXH3jyV\n5Gym3zw184d0B/D3cOwdtSd881QD+u5FklXAw8DNVfXsIsw4Kn33oqr+ovvx50yfl//HBgMPg/2M\nfBO4KsnrkryB6Sfa9ox4zlEYZC+eA94H0D0HvQb42UinHJ1w8n/BzqmbQ38kX7556phB9gK4C7gQ\n+Hz3EezRqlq3eFMvjAH34jVfMvIhR2TAn5G9Sb4LPA28Cmyrqp8u4tgLYsDvi08CX+55aeFHq+o3\nizTygknyVaADvDHJL4BPAGczz276ZihJathp81coJUnDZ+QlqWFGXpIaZuQlqWFGXpIaZuQlqWFG\nXpIaZuQlqWH/B+0+jLk322bvAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\nKBNCAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "or_set = [((0,0),0), ((0,1),1), ((1,0),1), ((1,1),1)]\n", + "plot_xys(or_set)\n", + "\n", + "(errs,_) = perceptron(or_set,100)\n", + "plt.figure()\n", + "plt.plot(errs)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADzZJREFUeJzt3H+I3Hedx/Hnq+YqbWkLvWLAxPTumkuLYq2iScDCja1c\n0wOJeH9cW61YlAtoVLg/TK20XVqr5p9D26JeJCiCEsEKl/MUK9Kl9GxihGyrZ9JNaolJKpH6oxd7\nKcTwvj92Lp2uSWZ2d3Y2+8nzAUP3O/PZ77z5svvMt9+Z2VQVkqQ2nbfQA0iS5o+Rl6SGGXlJapiR\nl6SGGXlJapiRl6SG9Y18kq1JjiR56gxrHkiyL8lEkmuHO6IkabYGOZP/KnDj6R5MchNwZVX9LbAB\n+PKQZpMkzVHfyFfV48Dvz7BkPfD17tqdwKVJlg5nPEnSXAzjmvwy4GDP9uHufZKkBeYLr5LUsCVD\n2Mdh4HU928u79/2ZJP6hHEmaharKbL5v0DP5dG+nsh14P0CStcAfqurIafc0durbRe+7iImJCarq\nnLjdc889Cz7D2XLzWHgszvVjsXv3br5z4YUUnPI2F4O8hfKbwI+BVUl+leT2JBuS/DNAVX0PeDbJ\nfuDfgA/PZpBlLy5j1apVs/lWSVrUrrrqKnYvXz4v++57uaaqbh1gzcY5TfESrF2xlgsuuGBOu5Gk\nxeiCCy5gyZo1HJ2c5OIh7/useOF16eRS7tp410KPMVKdTmehRzhreCxe5rF42bl2LN579918Zenw\n332eqtG9FpqkGHvlfZc8ewmb3ryJOz9+58jmkKSz0db77+c1mzfzrqNHX3F/mP8XXofvJVj65FID\nL0ldH/zUp/jNHXfwr0uX8j9D2ufIz+Qvet9FLP/f5axZsYa7PnIXK1euHNnzS9Ji8Mz+/Xzjvvs4\nvmMHbz58mH988cVZn8mPPPITExOsWrXKF1klqY9jx44xOTnJtddeu3giP8rnk6QWJFmE1+QlSfPO\nyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtS\nw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8\nJDXMyEtSw4y8JDXMyEtSwwaKfJJ1SfYmmUyy6RSPX5Jke5KJJD9L8oGhTypJmrFU1ZkXJOcBk8AN\nwHPALuDmqtrbs+aTwCVV9ckklwNPA0ur6k/T9lX9nk+S9EpJqKrM5nsHOZNfDeyrqgNVdRzYBqyf\ntqaAi7tfXwz8dnrgJUmjN0jklwEHe7YPde/r9RDw+iTPAU8CHx/OeJKkuVgypP3cCOyuquuTXAn8\nMMk1VfXH6QvHxsZOft3pdOh0OkMaQZLaMD4+zvj4+FD2Ncg1+bXAWFWt627fAVRVbe5Z813gs1X1\nX93tHwGbquqn0/blNXlJmqH5via/C1iZ5Iok5wM3A9unrTkAvLM7zFJgFfDL2QwkSRqevpdrqupE\nko3AI0z9o7C1qvYk2TD1cG0BPg18LclT3W/7RFX9bt6mliQNpO/lmqE+mZdrJGnG5vtyjSRpkTLy\nktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQw\nIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9J\nDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDRso8knWJdmbZDLJptOs6STZneTn\nSR4d7piSpNlIVZ15QXIeMAncADwH7AJurqq9PWsuBX4M/H1VHU5yeVU9f4p9Vb/nkyS9UhKqKrP5\n3kHO5FcD+6rqQFUdB7YB66etuRV4uKoOA5wq8JKk0Rsk8suAgz3bh7r39VoFXJbk0SS7ktw2rAEl\nSbO3ZIj7eQtwPXAR8ESSJ6pq/5D2L0mahUEifxhY0bO9vHtfr0PA81X1EvBSkseANwF/FvmxsbGT\nX3c6HTqdzswmlqTGjY+PMz4+PpR9DfLC66uAp5l64fXXwE+AW6pqT8+aq4EHgXXAq4GdwD9V1S+m\n7csXXiVphubywmvfM/mqOpFkI/AIU9fwt1bVniQbph6uLVW1N8kPgKeAE8CW6YGXJI1e3zP5oT6Z\nZ/KSNGPz/RZKSdIiZeQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIa\nZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQl\nqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWED\nRT7JuiR7k0wm2XSGdW9LcjzJe4Y3oiRptvpGPsl5wEPAjcAbgFuSXH2adZ8DfjDsISVJszPImfxq\nYF9VHaiq48A2YP0p1n0U+DbwmyHOJ0mag0Eivww42LN9qHvfSUleC7y7qr4EZHjjSZLmYlgvvH4e\n6L1Wb+gl6SywZIA1h4EVPdvLu/f1eiuwLUmAy4Gbkhyvqu3TdzY2Nnby606nQ6fTmeHIktS28fFx\nxsfHh7KvVNWZFySvAp4GbgB+DfwEuKWq9pxm/VeB/6iq75ziser3fJKkV0pCVc3qCknfM/mqOpFk\nI/AIU5d3tlbVniQbph6uLdO/ZTaDSJKGr++Z/FCfzDN5SZqxuZzJ+4lXSWqYkZekhhl5SWqYkZek\nhhl5SWqYkZekhhl5SWqYkZekhhl5SWqYkZekhhl5SWqYkZekhhl5SWqYkZekhhl5SWqYkZekhhl5\nSWqYkZekhhl5SWqYkZekhhl5SWqYkZekhhl5SWqYkZekhhl5SWqYkZekhhl5SWqYkZekhhl5SWqY\nkZekhhl5SWqYkZekhhl5SWqYkZekhhl5SWqYkZekhg0U+STrkuxNMplk0ykevzXJk93b40neOPxR\nJUkzlao684LkPGASuAF4DtgF3FxVe3vWrAX2VNULSdYBY1W19hT7qn7PJ0l6pSRUVWbzvYOcya8G\n9lXVgao6DmwD1vcuqKodVfVCd3MHsGw2w0iShmuQyC8DDvZsH+LMEf8Q8P25DCVJGo4lw9xZkncA\ntwPXnW7N2NjYya87nQ6dTmeYI0jSojc+Ps74+PhQ9jXINfm1TF1jX9fdvgOoqto8bd01wMPAuqp6\n5jT78pq8JM3QfF+T3wWsTHJFkvOBm4Ht0wZYwVTgbztd4CVJo9f3ck1VnUiyEXiEqX8UtlbVniQb\nph6uLcBdwGXAF5MEOF5Vq+dzcElSf30v1wz1ybxcI0kzNt+XayRJi5SRl6SGGXlJapiRl6SGGXlJ\napiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiR\nl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SG\nGXlJapiRl6SGjTzyExMTHDt2bNRPK0mLzrFjx5iYmJjTPpYMaZaBPfv2t/Od5ctZsmYN7737bq5c\nuXLUI0jSWW3//v3c+9C97Dy4k0MXHprTvlJVQxprgCdLTj7bUeArS5dy6cc+xgfvvHNkM0jS2ez+\nL9zPg489yJGrjsCru3eOQVVlNvsb6HJNknVJ9iaZTLLpNGseSLIvyUSSa/vt82LgX44c4TWf+xxb\nP/OZGY4tSe25/wv3s3liM0eu6Qn8HPWNfJLzgIeAG4E3ALckuXrampuAK6vqb4ENwJcHHeBdR4/y\nwgMP8Mz+/TMafLEbHx9f6BHOGh6Ll3ksXnauHYv9+/fz4GMPcvSvjg51v4Ocya8G9lXVgao6DmwD\n1k9bsx74OkBV7QQuTbJ00CE+dOQI37jvvkGXN+Fc+wE+E4/FyzwWLzvXjsW9D907dYlmyAaJ/DLg\nYM/2oe59Z1pz+BRrTusS4PiOHb7rRtI56dixY+w8uHNol2h6nTXvk3/z4cNMTk4u9BiSNHJPP/30\nnN9Fczp9312TZC0wVlXrutt3AFVVm3vWfBl4tKq+1d3eC/xdVR2Ztq/RvZVHkhoy23fXDPI++V3A\nyiRXAL8GbgZumbZmO/AR4FvdfxT+MD3wcxlSkjQ7fSNfVSeSbAQeYeryztaq2pNkw9TDtaWqvpfk\nH5LsB14Ebp/fsSVJgxjph6EkSaM1Ly+8zseHpxarfsciya1JnuzeHk/yxoWYcxQG+bnorntbkuNJ\n3jPK+UZpwN+RTpLdSX6e5NFRzzgqA/yOXJJke7cVP0vygQUYc94l2ZrkSJKnzrBm5t2sqqHemPqH\nYz9wBfAXwARw9bQ1NwH/2f16DbBj2HOcDbcBj8Va4NLu1+vO5WPRs+5HwHeB9yz03Av4c3Ep8N/A\nsu725Qs99wIei08Cn/3/4wD8Fliy0LPPw7G4DrgWeOo0j8+qm/NxJj/vH55aRPoei6raUVUvdDd3\nMIPPFywyg/xcAHwU+Dbwm1EON2KDHItbgYer6jBAVT0/4hlHZZBjUUz9JRS6//1tVf1phDOORFU9\nDvz+DEtm1c35iPy8f3hqERnkWPT6EPD9eZ1o4fQ9FkleC7y7qr4EtPxOrEF+LlYBlyV5NMmuJLeN\nbLrRGuRYPAS8PslzwJPAx0c029lmVt0c+Z8a1qkleQdT70q6bqFnWUCfB3qvybYc+n6WAG8Brgcu\nAp5I8kRVnVt/5GnKjcDuqro+yZXAD5NcU1V/XOjBFoP5iPxhYEXP9vLufdPXvK7PmhYMcixIcg2w\nBVhXVWf637XFbJBj8VZgW5Iwde31piTHq2r7iGYclUGOxSHg+ap6CXgpyWPAm5i6ft2SQY7F7cBn\nAarqmSTPAlcDPx3JhGePWXVzPi7XnPzwVJLzmfrw1PRf0u3A++HkJ2pP+eGpBvQ9FklWAA8Dt1XV\nMwsw46j0PRZV9Tfd218zdV3+ww0GHgb7Hfl34Lokr0pyIVMvtO0Z8ZyjMMixOAC8E6B7DXoV8MuR\nTjk64fT/Bzurbg79TL788NRJgxwL4C7gMuCL3TPY41W1euGmnh8DHotXfMvIhxyRAX9H9ib5AfAU\ncALYUlW/WMCx58WAPxefBr7W89bCT1TV7xZo5HmT5JtAB/jLJL8C7gHOZ47d9MNQktSws+avUEqS\nhs/IS1LDjLwkNczIS1LDjLwkNczIS1LDjLwkNczIS1LD/g9SqDiemnPSywAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "xor_set = [((0,0),0), ((0,1),1), ((1,0),1), ((1,1),0)]\n", + "plot_xys(xor_set)\n", + "\n", + "(errs,_) = perceptron(xor_set,100)\n", + "plt.figure()\n", + "plt.plot(errs)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Validation error: -0.03\n" + ] + }, + { + "data": { + "image/png": "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\nAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "noise_chance = 0.0\n", + "N = 100\n", + "xys = [(uniform(0,10),uniform(0,10)) for _r in range(0,N)]\n", + "secret_f = lambda x: x*2 - 1\n", + "dataset = [(xy,(1 if (secret_f(xy[0]) <= xy[1] or uniform(0,1)= 0 else 0\n", + " error = actual - predicted\n", + " val_net_error += error\n", + " \n", + "val_error = val_net_error/len(validation)\n", + "print(\"Validation error:\",val_error)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [] + }, + { + "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, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [Root]", + "language": "python", + "name": "Python [Root]" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From c1de12f0ea8b2a716e4dbb2ce0e90ab0d23ef50c Mon Sep 17 00:00:00 2001 From: joeyzh4 Date: Mon, 25 Jul 2016 14:21:38 -0700 Subject: [PATCH 11/11] Project Proposal --- projects/4-project-ideas/untitled.txt | 1 + projects/AutoEncoder.ipynb | 158 ++++++++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 projects/4-project-ideas/untitled.txt create mode 100644 projects/AutoEncoder.ipynb diff --git a/projects/4-project-ideas/untitled.txt b/projects/4-project-ideas/untitled.txt new file mode 100644 index 0000000..bd94849 --- /dev/null +++ b/projects/4-project-ideas/untitled.txt @@ -0,0 +1 @@ +Connect 4 game using Alpha Beta Pruning (Minimax) algorithm as the ai. Implementation of the game in Java using JFrame. \ No newline at end of file diff --git a/projects/AutoEncoder.ipynb b/projects/AutoEncoder.ipynb new file mode 100644 index 0000000..540b033 --- /dev/null +++ b/projects/AutoEncoder.ipynb @@ -0,0 +1,158 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "\n", + "from sklearn.base import BaseEstimator\n", + "import numpy\n", + "\n", + "import theano\n", + "import theano.tensor as T\n", + "from theano.tensor.shared_randomstreams import RandomStreams\n", + "\n", + "\n", + "class DenoisingAutoencoder(BaseEstimator):\n", + " def __init__(self, n_hidden, learning_rate = 0.1, training_epochs = 20, corruption_level = 0.3, batch_size = 20, verbose=False):\n", + " self.n_visible = None\n", + " self.n_hidden = n_hidden\n", + " self.learning_rate = learning_rate\n", + " self.corruption_level = corruption_level\n", + " self.training_epochs = training_epochs\n", + " self.batch_size = batch_size\n", + " self.verbose = verbose\n", + "\n", + " self.da = None\n", + " self.x = T.matrix('x')\n", + "\n", + " def load_data(self,X):\n", + " try:\n", + " matrix = X.as_matrix()\n", + " except AttributeError:\n", + " matrix = X\n", + " shared_x = theano.shared(numpy.asarray(matrix, dtype=theano.config.floatX), borrow=True)\n", + " return shared_x\n", + " \n", + " def fit(self,X):\n", + " self.n_visible = X.shape[1]\n", + "\n", + " train_set_x = self.load_data(X)\n", + "\n", + " # compute number of minibatches for training, validation and testing\n", + " n_train_batches = train_set_x.get_value(borrow=True).shape[0] / self.batch_size\n", + "\n", + " # allocate symbolic variables for the data\n", + " index = T.lscalar() # index to a [mini]batch\n", + "\n", + " rng = numpy.random.RandomState(123)\n", + " theano_rng = RandomStreams(rng.randint(2 ** 30))\n", + "\n", + " self.da = dA(\n", + " numpy_rng=rng,\n", + " theano_rng=theano_rng,\n", + " input=self.x,\n", + " n_visible=self.n_visible,\n", + " n_hidden=self.n_hidden\n", + " )\n", + "\n", + " cost, updates = self.da.get_cost_updates(\n", + " corruption_level=self.corruption_level,\n", + " learning_rate=self.learning_rate\n", + " )\n", + "\n", + " train_da = theano.function(\n", + " [index],\n", + " cost,\n", + " updates=updates,\n", + " givens={\n", + " self.x: train_set_x[index * self.batch_size: (index + 1) * self.batch_size]\n", + " }\n", + " )\n", + "\n", + " # training...\n", + " for epoch in xrange(self.training_epochs):\n", + " c = []\n", + " for batch_index in xrange(n_train_batches):\n", + " c.append(train_da(batch_index))\n", + "\n", + " if self.verbose:\n", + " print ('Training epoch %d, cost ' % epoch, numpy.mean(c))\n", + "\n", + "\n", + " def transform(self,X):\n", + " z = self.da.get_prediction()\n", + " predict_da = theano.function([self.x],z)\n", + " return predict_da(X)\n", + "\n", + " def transform_latent_representation(self,X):\n", + " h = self.da.get_latent_representation()\n", + " predict_da = theano.function([self.x],h)\n", + " return predict_da(X)\n", + "\n" + ] + }, + { + "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, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [Root]", + "language": "python", + "name": "Python [Root]" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}