From bfa57f01893b88090d2ea0f89515e4753a7e8597 Mon Sep 17 00:00:00 2001 From: Kenny Ng Date: Thu, 14 Jul 2016 13:03:35 -0700 Subject: [PATCH 1/4] Added answer for DFA extenstion for legal email addresses. --- projects/2-state-machines/answers.py | 41 ++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/projects/2-state-machines/answers.py b/projects/2-state-machines/answers.py index ec5080b..afe2712 100644 --- a/projects/2-state-machines/answers.py +++ b/projects/2-state-machines/answers.py @@ -61,6 +61,47 @@ def test2(): assert not check(test2(), "x@") assert not check(test2(), "x@x..x") + +# Extension to Assignment 1-2 (full legal e-mail addresses) +def test2_extension(): + #(x+(\.x+)*)@x+\.x+(\.x+)*) + return StateMachine([("s1", "x", "s2"), ("s1", ".", "s9"), ("s1", "@", "s9"), + ("s2", "x", "s2"), ("s2", ".", "s3"), ("s2", "@", "s4"), + ("s3", "x", "s2"), ("s3", ".", "s9"), ("s3", "@", "s9"), + ("s4", "x", "s5"), ("s4", ".", "s9"), ("s4", "@", "s9"), + ("s5", "x", "s5"), ("s5", ".", "s6"), ("s5", "@", "s9"), + ("s6", "x", "s7"), ("s6", ".", "s9"), ("s6", "@", "s9"), + ("s7", "x", "s7"), ("s7", ".", "s8"), ("s7", "@", "s9"), + ("s8", "x", "s7"), ("s8", ".", "s9"), ("s8", "@", "s9"), + ("s9", "x", "s9"), ("s9", ".", "s9"), ("s9", "@", "s9")], + "s1", + ["s7"] + ) + + assert check(test2_extension(), "x@x.x") + assert check(test2_extension(), "x@x.x.x") + assert check(test2_extension(), "x@xx.x") + assert check(test2_extension(), "xx@xx.xx.xx") + assert check(test2_extension(), "x.x@x.x") + assert check(test2_extension(), "x.x@x.x.x") + assert check(test2_extension(), "x.x@xx.xx.xx") + assert check(test2_extension(), "x.x.x@x.x") + assert check(test2_extension(), "x.x.x@x.x.x") + assert check(test2_extension(), "x.x.x@xx.xx.xx") + assert check(test2_extension(), "xx.xx.xx@x.x") + assert check(test2_extension(), "xx.xx.xx@x.x.x") + assert check(test2_extension(), "xx.xx.xx@xx.xx.xx") + assert not check(test2_extension(), "@x.x") + assert not check(test2_extension(), "x@.x") + assert not check(test2_extension(), "x@x.") + assert not check(test2_extension(), "x@x") + assert not check(test2_extension(), "x.x") + assert not check(test2_extension(), "x@") + assert not check(test2_extension(), "x@x..x") + assert not check(test2_extension(), ".x@x.x") + assert not check(test2_extension(), "x.@x.x") + + # Assignment 2: def sample2(sm, length, sofar): # Each path of length 0 is either accepting or non-accepting; From 3821a68e58e84b34deda04d5eb5a6eb2d8a16305 Mon Sep 17 00:00:00 2001 From: Joseph Osborn Date: Thu, 14 Jul 2016 21:20:48 -0700 Subject: [PATCH 2/4] Day 4 notes and assignments. Added hashable stuff for Maze. --- index.html | 1 + instruction-notes.html | 94 ++++++++++++++++++++++++++--- projects/3-mazes/Maze Solvers.ipynb | 21 +++---- projects/4-evaluations/eval.md | 41 +++++++++++++ projects/4-probabilistic/.keep | 0 projects/4-project-ideas/.keep | 0 web-src/bibliography.bib | 12 +++- web-src/schedule.md | 62 +++++++++++++++++-- web-src/syllabus.md | 1 + 9 files changed, 207 insertions(+), 25 deletions(-) create mode 100644 projects/4-evaluations/eval.md create mode 100644 projects/4-probabilistic/.keep create mode 100644 projects/4-project-ideas/.keep diff --git a/index.html b/index.html index 710854f..c2fd172 100644 --- a/index.html +++ b/index.html @@ -99,6 +99,7 @@

Project ideas

  • Survey or deep-dive papers from recent AAAI/IJCAI/NIPS/etc conferences or arxiv publications in machine learning/AI/etc
  • Deep analysis/historical study/etc of some AI system(s) or survey of techniques
  • +
  • Use a probabilistic programming language to encode one or more interesting models
  • diff --git a/instruction-notes.html b/instruction-notes.html index f25f306..995e5ba 100644 --- a/instruction-notes.html +++ b/instruction-notes.html @@ -184,6 +184,19 @@

    Joseph C. Osborn

    +
  • What worked: +
      +
    • Graph search, A* material, MCTS explanation, small-group activity
    • +
  • +
  • What didn’t work: +
      +
    • RL material wasn’t prepared thoroughly enough
    • +
    • Maze should have been an immutable value object!
    • +
  • +
  • What to change: +
      +
    • Needed more active learning opportunities, more specific RL material, too many different topics in one day (nobody had time to do enough reading).
    • +
  • Assignment
    Individual or pair (long) assignment. (1) should be done by tomorrow, (2) and (3) by Monday. @@ -198,24 +211,88 @@

    Joseph C. Osborn

    (TAs could help with writing the code or understanding the algorithms. Eager students could implement multiple algorithms, select one on the fly, generate mazes, visualize the path-finding algorithms.)
  • -
  • Day 4: Intelligent agents (also, intro to probability) +
  • Day 4: Intro to probability and probabilistic programming
    • Note: also need to do intermediate evaluations at the end of the day
    • -
    • Topic 1: Basic probability/Bayes rule
    • -
    • Topic 2: Agent architectures
    • -
    • Topic 3: Let’s talk about projects
    • +
    • Topic 0: Feedback/notes on yesterday’s assignment +
        +
      • Ask the TAs for code to let you put Maze objects into sets or use them as keys in dicts. I meant to include that from the start. This lets you avoid tricks like turning the Maze into a string for this purpose.
      • +
      • NOTE: If you put a Maze into a set or use it as a dict key, don’t modify it at all afterwards (e.g. via move_player, toggle, or setting its variables)! Only clone it and change the clones—otherwise the set/dict will break in super confusing ways.
      • +
      +
        +
      1. Should use m.move_player() and m.toggle() to modify game state and not e.g. check if m.grid[y][x] == "#"
      2. +
      3. Since this is destructive, they should copy the maze using m.clone() before making a move
      4. +
      5. They can’t (easily) use a distance grid because switching switches changes which doors are open and closed, so player position doesn’t suffice to represent world state, so:
      6. +
      7. They need to track whether a maze has been seen before. One way is to use a set to track seen mazes.
      8. +
      9. They need to track the cost and predecessor state along with Maze states. Some ways of doing that include: +
          +
        • Add cost and predecessor properties to maze objects.
        • +
        • Include cost and predecessor with the maze in the frontier in a tuple. Of course, using priority queues the tuple’s first element should be g(n) + h(n) where g(n) is the real cost to reach node n and h(n) is the heuristic value (e.g. Manhattan distance from goal) at n.
        • +
        • Keep a costs dict and a predecessors dict or a best_paths dict keyed by Maze objects.
        • +
      10. +
    • +
    • Topic 1: Basic probability/Bayes rule +
        +
      • what probability of an event means
      • +
      • P(X) – cases where X happens / all possible cases
      • +
      • P(X, Y) – cases where both X and Y happen / all possible cases
      • +
      • If X,Y independent, then P(X,Y) = P(X) P(Y)
      • +
      • P(X | Y) = P(X,Y) / P(Y) – or equivalently, P(X,Y) = P(X|Y) P(Y)
      • +
      • Chaining: P(G,S,R)=P(G | S,R) P(S | R) P(R)
      • +
      • I like the wikipedia page on conditional probability too
      • +
      • Bayesian statistics +
          +
        • Prior (background belief) and posterior (after considering prior) probability
        • +
        • Not, “What is the chance of X happening”, but “Given my background knowledge/superstition/experience, what is the chance of X happening?”
        • +
        • Example priors: Uniform/flat prior; or: +
            +
          • “An example is a prior distribution for the temperature at noon tomorrow. A reasonable approach is to make the prior a normal distribution with expected value equal to today’s noontime temperature, with variance equal to the day-to-day variance of atmospheric temperature, or a distribution of the temperature for that day of the year.”
          • +
        • +
        • Priors are really important but we don’t have time to get too deeply into them
        • +
      • +
      • Bayes nets
      • +
      • Given P(X | Y), P(X), and P(Y), we can find P(Y | X) with Bayes rule
      • +
      • P(X)=“Chance of rain”, P(Y)=“chance of clouds”: “Chance of rain when it’s cloudy = chance of clouds * chance of clouds given rain / chance of rain”
      • +
      • Random variables and expected value +
          +
        • P(X=x)
        • +
        • “probability-weighted average of all possible values”
        • +
      • +
      • Distributions (normal, poisson, negative binomial), mean/variance, and PDFs
      • +
    • +
    • Exercise: Make a bayes net for some situation. It’s okay to use e.g. “low/medium/high” for the probabilities in the tables.
    • +
    • Topic 2: Probabilistic programming +
        +
      • Programming with distribution variables
      • +
      • “probabilistic programming languages extend a well-specified deterministic programming language with primitive constructs for random choice” (Goodman and Stuhlmüller 2014)
      • +
      • “If we view the semantics of the underlying deterministic language as a map from programs to executions of the program, the semantics of a PPL built on it will be a map from programs to distributions over executions. When the program halts with probability one, this induces a proper distribution over return values.” (Goodman and Stuhlmüller 2014)
      • +
      • WebPPL examples
      • +
    • +
    • Topic 3: Let’s talk about projects +
        +
      • Project format
      • +
      • Project suggestions
      • +
    • Assignment 1
      Individual (small) assignment.
      -Give me a list of three or more project ideas you might be interested in doing, either from the suggestions or your own idea. If you have a partner or partners in mind, let me know as well.
    • +Give me a list of three or more project ideas you might be interested in doing, either from the suggestions or your own idea. If you have a partner or partners in mind, let me know as well. Submit them (as Markdown .md files) in the folder projects/4-project-ideas.
    • Assignment 2
      -
      Individual or pair (medium-length) assignment +
      Individual (small) assignment.
      -Write some knowledge-based agents for the maze assignments. Maybe an adversary and a player character? Make the MCTS/RL compete against the adversary? Make adversaries for each other’s things?
    • +Fill out the preliminary evaluation form and send it to a TA. They’ll anonymize them and send them on to me so I can adjust the course based on your feedback. You can find the form in the projects/4-evaluations folder. +
    • Assignment 3: MCTS and Reinforcement Learning agents for maze solving.
    • +
    • +
      Assignment 4 (Optional)
      +
      Individual or pair (small) assignment. +
      +
      +

      Make a probabilistic program expressing your Bayesian model from earlier today. Try to give it a prior based on your intuition, or by loading up a dataset. Either PyMC3 or WebPPL is fine.

      +Submit it as an .ipynb or a .wppl file in projects/4-probabilistic.
  • Day 5: Machine learning as function approximation
      @@ -338,6 +415,9 @@

      References

      Compton, Kate, Joseph C Osborn, and Michael Mateas. 2013. “Generative Methods.” In The Fourth Procedural Content Generation in Games Workshop, PCG. Vol. 1.

      +
      +

      Goodman, Noah D, and Andreas Stuhlmüller. 2014. “The Design and Implementation of Probabilistic Programming Languages.” http://dippl.org.

      +

      Sutton, Richard S, and Andrew G Barto. 1998. Reinforcement Learning: An Introduction. Vol. 1. 1. MIT press Cambridge.

      diff --git a/projects/3-mazes/Maze Solvers.ipynb b/projects/3-mazes/Maze Solvers.ipynb index 6d8ca2d..1c86f0d 100644 --- a/projects/3-mazes/Maze Solvers.ipynb +++ b/projects/3-mazes/Maze Solvers.ipynb @@ -37,27 +37,20 @@ }, { "cell_type": "code", - "execution_count": 233, + "execution_count": 257, "metadata": { "collapsed": false }, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(1, 0), (0, -1), (0, 1), 'switch']\n" - ] - }, { "data": { - "image/png": "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\nQGJXBTWJFV4AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "{<__main__.Maze at 0x107e60be0>, <__main__.Maze at 0x107e60a58>}" ] }, + "execution_count": 257, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -184,6 +177,12 @@ " edgecolor=Maze.Colors[\"@\"] if self.player_alive else \"white\")\n", " )\n", " plt.show(fig1)\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", + " def __neq__(self,other):\n", + " return not self == other\n", + " def __hash__(self):\n", + " return hash(str(self.grid)) + hash(self.player_pos) + hash(self.player_alive)\n", "\n", "sample=Maze([\n", " \"##X#\",\n", diff --git a/projects/4-evaluations/eval.md b/projects/4-evaluations/eval.md new file mode 100644 index 0000000..bb1cb85 --- /dev/null +++ b/projects/4-evaluations/eval.md @@ -0,0 +1,41 @@ +# Preliminary Evaluation + +Hello, and thanks for your interest in the class! I've been really impressed with everyone's level of engagement and pace with the material, and I wanted to get a sense of how everyone is feeling about the course at the end of the first week. Here are a few short questions. Please fill the multiple-choice questions out by replacing the placeholder `(_)` with your choice (among A, B, etc), and put your answers to the free-form questions on the subsequent line. When you're done, email this to a TA and they'll compile them together, anonymize them, and send them to me. + +The amount of reading is (_) + +A. not enough +B. about right +C. too much + +I’d prefer the lectures to (_) + +A. go slower +B. remain the same +C. go faster + +The assignments so far (_) + +A. are too short—we need more to do. +B. are just right. +C. are too long/difficult—we need more time/help to complete them. + +I’d find it useful to have (_) + +A. more discussion in general +B. the same amount of discussion +C. less discussion in general + +I’d find it useful if we discussed specific readings for (_) + +A. more time +B. about the same amount of time +C. less time + +Are there any topics you would like to see covered in the course that are not already on the syllabus? + +(_) + +Are there any topics that we’ve covered in class that you would have liked to have spent more time on? + +(_) diff --git a/projects/4-probabilistic/.keep b/projects/4-probabilistic/.keep new file mode 100644 index 0000000..e69de29 diff --git a/projects/4-project-ideas/.keep b/projects/4-project-ideas/.keep new file mode 100644 index 0000000..e69de29 diff --git a/web-src/bibliography.bib b/web-src/bibliography.bib index 32273f6..5ffc7d8 100644 --- a/web-src/bibliography.bib +++ b/web-src/bibliography.bib @@ -2,10 +2,10 @@ %% http://bibdesk.sourceforge.net/ -%% Created for Joseph C. Osborn at 2016-07-05 17:10:16 -0700 +%% Created for Joseph C. Osborn at 2016-07-05 17:10:16 -0700 -%% Saved with string encoding Unicode (UTF-8) +%% Saved with string encoding Unicode (UTF-8) @@ -36,3 +36,11 @@ @book{McCorduck:2004:MTP:983115 Publisher = {AK Peters Ltd}, Title = {Machines Who Think: A Personal Inquiry into the History and Prospects of Artificial Intelligence}, Year = {2004}} + + @misc{dippl, + title = {{The Design and Implementation of Probabilistic Programming Languages}}, + author = {Goodman, Noah D and Stuhlm\"{u}ller, Andreas}, + year = {2014}, + howpublished = {\url{http://dippl.org}}, + note = {Accessed: 2016-7-14} + } diff --git a/web-src/schedule.md b/web-src/schedule.md index 6feab6c..2be6eb5 100644 --- a/web-src/schedule.md +++ b/web-src/schedule.md @@ -119,6 +119,13 @@ This document is intended for use by the instructor and TAs, since we don't want * Backpropagation: max, decay, ... * Topic 3: Reinforcement learning: the problem, the basic idea, how it differs from MCTS (MCTS is a special case) * "MCTS estimates temporary state values in order to decide the next move, whereas TDL learns the long-term value of each state that then guides future behaviour"---mcts guesses more + * What worked: + * Graph search, A* material, MCTS explanation, small-group activity + * What didn't work: + * RL material wasn't prepared thoroughly enough + * Maze should have been an immutable value object! + * What to change: + * Needed more active learning opportunities, more specific RL material, too many different topics in one day (nobody had time to do enough reading). * Assignment ~ Individual or pair (long) assignment. (1) should be done by tomorrow, (2) and (3) by Monday. (1) Write a Python program to solve switch and door puzzles with one of the heuristic search algorithms @@ -130,19 +137,64 @@ This document is intended for use by the instructor and TAs, since we don't want (3) Do (2) but with reinforcement learning. Compare state-value vs action-value learning vs MCTS in terms of iterations required to reach a certain score, etc. *(TAs could help with writing the code or understanding the algorithms. Eager students could implement multiple algorithms, select one on the fly, generate mazes, visualize the path-finding algorithms.)* -* Day 4: Intelligent agents (also, intro to probability) +* Day 4: Intro to probability and probabilistic programming * __Note: also need to do intermediate evaluations at the end of the day__ + * Topic 0: Feedback/notes on yesterday's assignment + * Ask the TAs for code to let you put Maze objects into sets or use them as keys in dicts. I meant to include that from the start. This lets you avoid tricks like turning the Maze into a string for this purpose. + * NOTE: If you put a Maze into a set or use it as a dict key, don't modify it at all afterwards (e.g. via `move_player`, `toggle`, or setting its variables)! Only clone it and change the clones---otherwise the set/dict will break in super confusing ways. + 1. Should use `m.move_player()` and `m.toggle()` to modify game state and not e.g. check if `m.grid[y][x] == "#"` + 2. Since this is destructive, they should copy the maze using `m.clone()` before making a move + 3. They can’t (easily) use a distance grid because switching switches changes which doors are open and closed, so player position doesn't suffice to represent world state, so: + 4. They need to track whether a maze has been seen before. One way is to use a set to track seen mazes. + 5. They need to track the cost and predecessor state along with Maze states. Some ways of doing that include: + * Add `cost` and `predecessor` properties to maze objects. + * Include `cost` and `predecessor` with the maze in the frontier in a tuple. Of course, using priority queues the tuple's first element should be `g(n) + h(n)` where `g(n)` is the real cost to reach node `n` and `h(n)` is the heuristic value (e.g. Manhattan distance from goal) at `n`. + * Keep a `costs` dict and a `predecessors` dict or a `best_paths` dict keyed by Maze objects. * Topic 1: Basic probability/Bayes rule - * Topic 2: Agent architectures + * what probability of an event means + * P(X) -- cases where X happens / all possible cases + * P(X, Y) -- cases where both X and Y happen / all possible cases + * If X,Y independent, then P(X,Y) = P(X) P(Y) + * P(X | Y) = P(X,Y) / P(Y) -- or equivalently, P(X,Y) = P(X|Y) P(Y) + * Chaining: P(G,S,R)=P(G | S,R) P(S | R) P(R) + * I like the [wikipedia page](https://en.wikipedia.org/wiki/Conditional_probability) on conditional probability too + * Bayesian statistics + * Prior (background belief) and posterior (after considering prior) probability + * Not, "What is the chance of X happening", but "Given my background knowledge/superstition/experience, what is the chance of X happening?" + * Example priors: Uniform/flat prior; or: + * "An example is a prior distribution for the temperature at noon tomorrow. A reasonable approach is to make the prior a normal distribution with expected value equal to today's noontime temperature, with variance equal to the day-to-day variance of atmospheric temperature, or a distribution of the temperature for that day of the year." + * Priors are really important but we don't have time to get too deeply into them + * Bayes nets + * Given P(X | Y), P(X), and P(Y), we can find P(Y | X) with Bayes rule + * P(X)="Chance of rain", P(Y)="chance of clouds": "Chance of rain when it's cloudy = chance of clouds * chance of clouds given rain / chance of rain" + * Random variables and expected value + * P(X=x) + * "probability-weighted average of all possible values" + * Distributions (normal, poisson, negative binomial), mean/variance, and PDFs + * Exercise: Make a bayes net for some situation. It's okay to use e.g. "low/medium/high" for the probabilities in the tables. + * Topic 2: Probabilistic programming + * Programming with distribution variables + * "probabilistic programming languages extend a well-specified deterministic programming language with primitive constructs for random choice" [@dippl] + * "If we view the semantics of the underlying deterministic language as a map from programs to executions of the program, the semantics of a PPL built on it will be a map from programs to distributions over executions. When the program halts with probability one, this induces a proper distribution over return values." [@dippl] + * WebPPL examples * Topic 3: Let's talk about projects + * Project format + * Project suggestions * Assignment 1 ~ Individual (small) assignment. - Give me a list of three or more project ideas you might be interested in doing, either from the suggestions or your own idea. If you have a partner or partners in mind, let me know as well. + Give me a list of three or more project ideas you might be interested in doing, either from the suggestions or your own idea. If you have a partner or partners in mind, let me know as well. Submit them (as Markdown `.md` files) in the folder `projects/4-project-ideas`. * Assignment 2 - ~ Individual or pair (medium-length) assignment + ~ Individual (small) assignment. + + Fill out the preliminary evaluation form and send it to a TA. They'll anonymize them and send them on to me so I can adjust the course based on your feedback. You can find the form in the `projects/4-evaluations` folder. + * Assignment 3: MCTS and Reinforcement Learning agents for maze solving. + * Assignment 4 (Optional) + ~ Individual or pair (small) assignment. + + Make a probabilistic program expressing your Bayesian model from earlier today. Try to give it a prior based on your intuition, or by loading up a dataset. Either PyMC3 or WebPPL is fine. - Write some knowledge-based agents for the maze assignments. Maybe an adversary and a player character? Make the MCTS/RL compete against the adversary? Make adversaries for each other's things? + Submit it as an `.ipynb` or a `.wppl` file in `projects/4-probabilistic`. * Day 5: Machine learning as function approximation * Topic 1: Error minimization and regression/gradient descent * Overfitting, linearity, curse of dimensionality ... diff --git a/web-src/syllabus.md b/web-src/syllabus.md index bb4c2d3..0592d4e 100644 --- a/web-src/syllabus.md +++ b/web-src/syllabus.md @@ -88,6 +88,7 @@ Each topic stands as a milestone in a particular tradition, and most remain acti * Or for playing Heads Up? * Survey or deep-dive papers from recent AAAI/IJCAI/NIPS/etc conferences or arxiv publications in machine learning/AI/etc * Deep analysis/historical study/etc of some AI system(s) or survey of techniques + * Use a probabilistic programming language to encode one or more interesting models * ... #References From 188ad3da612a5ddcf0a02dc7c4451a43d169e2ac Mon Sep 17 00:00:00 2001 From: Joseph Osborn Date: Fri, 15 Jul 2016 11:41:20 -0700 Subject: [PATCH 3/4] Updates for first weekend assignments and day 4 lecture. --- index.html | 7 ++++++- instruction-notes.html | 16 +++++++++++++++- projects/3-mazes/Maze Solvers.ipynb | 2 +- projects/4-probabilistic/README.md | 22 ++++++++++++++++++++++ projects/4-project-ideas/README.md | 1 + web-src/schedule.md | 10 +++++++++- web-src/syllabus.md | 3 +++ 7 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 projects/4-probabilistic/README.md create mode 100644 projects/4-project-ideas/README.md diff --git a/index.html b/index.html index c2fd172..77e8430 100644 --- a/index.html +++ b/index.html @@ -82,6 +82,7 @@

      Project ideas

      • Video game character AI/social simulation
      • Automated “Heads Up” player
      • +
      • Realtime game AI
      • Guess game from level, generate level given game
      • GVGAI competition bot (or Arcade Learning Environment)
      • Learn game rules (GDL/VGDL) from forward model
      • @@ -99,7 +100,11 @@

        Project ideas

    • Survey or deep-dive papers from recent AAAI/IJCAI/NIPS/etc conferences or arxiv publications in machine learning/AI/etc
    • Deep analysis/historical study/etc of some AI system(s) or survey of techniques
    • -
    • Use a probabilistic programming language to encode one or more interesting models
    • +
    • Use a probabilistic programming language to encode one or more interesting models +
        +
      • E.g. http://webppl.org (book at http://dippl.org), or PyMC3 for Python
      • +
    • +
    • Program synthesis — given a specification or a set of examples or a partially implemented program, come up with a function implementing it
  • diff --git a/instruction-notes.html b/instruction-notes.html index 995e5ba..4107ff3 100644 --- a/instruction-notes.html +++ b/instruction-notes.html @@ -237,7 +237,7 @@

    Joseph C. Osborn

  • P(X) – cases where X happens / all possible cases
  • P(X, Y) – cases where both X and Y happen / all possible cases
  • If X,Y independent, then P(X,Y) = P(X) P(Y)
  • -
  • P(X | Y) = P(X,Y) / P(Y) – or equivalently, P(X,Y) = P(X|Y) P(Y)
  • +
  • P(X | Y) = P(Y|X) P(X) / P(Y) – or equivalently, P(Y,X) = P(X|Y) P(Y) / P(X)
  • Chaining: P(G,S,R)=P(G | S,R) P(S | R) P(R)
  • I like the wikipedia page on conditional probability too
  • Bayesian statistics @@ -253,6 +253,7 @@

    Joseph C. Osborn

  • Bayes nets
  • Given P(X | Y), P(X), and P(Y), we can find P(Y | X) with Bayes rule
  • P(X)=“Chance of rain”, P(Y)=“chance of clouds”: “Chance of rain when it’s cloudy = chance of clouds * chance of clouds given rain / chance of rain”
  • +
  • Bayes nets
  • Random variables and expected value
    • P(X=x)
    • @@ -273,6 +274,19 @@

      Joseph C. Osborn

    • Project format
    • Project suggestions
  • +
  • What went well: +
      +
    • Basic probability, Bayes nets and exercise, connection to ML, WebPPL
    • +
  • +
  • What went poorly: +
      +
    • Bayes rule. Typo in my notes, stumbled, ended up with a result I couldn’t interpret well.
    • +
  • +
  • What to do next time: +
      +
    • Should have practiced the Bayes Rule part of the lecture specifically!
    • +
    • Should have had more examples of belief nets in the bag.
    • +
  • Assignment 1
    Individual (small) assignment. diff --git a/projects/3-mazes/Maze Solvers.ipynb b/projects/3-mazes/Maze Solvers.ipynb index 1c86f0d..b0025f9 100644 --- a/projects/3-mazes/Maze Solvers.ipynb +++ b/projects/3-mazes/Maze Solvers.ipynb @@ -185,7 +185,7 @@ " return hash(str(self.grid)) + hash(self.player_pos) + hash(self.player_alive)\n", "\n", "sample=Maze([\n", - " \"##X#\",\n", + " \"##x#\",\n", " \"#.A#\",\n", " \"#0?#\",\n", " \"a@##\"\n", diff --git a/projects/4-probabilistic/README.md b/projects/4-probabilistic/README.md new file mode 100644 index 0000000..96c1f76 --- /dev/null +++ b/projects/4-probabilistic/README.md @@ -0,0 +1,22 @@ +Individual or pair (small) assignment. + +Make a probabilistic program expressing your Bayesian model from earlier today. Try to give it a prior based on your intuition, or by analyzing a dataset. Either PyMC3 or WebPPL is fine. + +Submit it as an `.ipynb` or a `.wppl` file in `projects/4-probabilistic`. + +Wet grass example: + +```javascript +var wet = function() { + var clouds = flip(0.2); //equivalent to "sample(Bernoulli({p:0.5}))": returns 0 or 1 + var rain = clouds ? flip(0.9) : flip(0.01); + var sprinkler = clouds ? 0 : flip(0.5); + var wet = (rain || sprinkler) ? 1 : 0; + ///*chance of sprinkler and rain together */ return (rain && sprinkler) ? 1 : 0 + ///*chance of sprinkler given observed not cloudy*/ condition(clouds == 0); return sprinkler ? 1 : 0; + ///*chance of rain and not cloudy*/ return (rain && !clouds) ? 1 : 0; + /* chance of wet grass */ return wet; +}; + +viz.auto(Infer({method: 'enumerate'}, wet)) +``` diff --git a/projects/4-project-ideas/README.md b/projects/4-project-ideas/README.md new file mode 100644 index 0000000..b31b0f9 --- /dev/null +++ b/projects/4-project-ideas/README.md @@ -0,0 +1 @@ +Give a list of three or more project ideas you might be interested in doing, either from the suggestions or your own idea. If you have a partner or partners in mind, let me know as well. Submit them (as Markdown `.md` files) in this folder. diff --git a/web-src/schedule.md b/web-src/schedule.md index 2be6eb5..4b58ef3 100644 --- a/web-src/schedule.md +++ b/web-src/schedule.md @@ -155,7 +155,7 @@ This document is intended for use by the instructor and TAs, since we don't want * P(X) -- cases where X happens / all possible cases * P(X, Y) -- cases where both X and Y happen / all possible cases * If X,Y independent, then P(X,Y) = P(X) P(Y) - * P(X | Y) = P(X,Y) / P(Y) -- or equivalently, P(X,Y) = P(X|Y) P(Y) + * P(X | Y) = P(Y|X) P(X) / P(Y) -- or equivalently, P(Y,X) = P(X|Y) P(Y) / P(X) * Chaining: P(G,S,R)=P(G | S,R) P(S | R) P(R) * I like the [wikipedia page](https://en.wikipedia.org/wiki/Conditional_probability) on conditional probability too * Bayesian statistics @@ -167,6 +167,7 @@ This document is intended for use by the instructor and TAs, since we don't want * Bayes nets * Given P(X | Y), P(X), and P(Y), we can find P(Y | X) with Bayes rule * P(X)="Chance of rain", P(Y)="chance of clouds": "Chance of rain when it's cloudy = chance of clouds * chance of clouds given rain / chance of rain" + * Bayes nets * Random variables and expected value * P(X=x) * "probability-weighted average of all possible values" @@ -180,6 +181,13 @@ This document is intended for use by the instructor and TAs, since we don't want * Topic 3: Let's talk about projects * Project format * Project suggestions + * What went well: + * Basic probability, Bayes nets and exercise, connection to ML, WebPPL + * What went poorly: + * Bayes rule. Typo in my notes, stumbled, ended up with a result I couldn't interpret well. + * What to do next time: + * Should have practiced the Bayes Rule part of the lecture specifically! + * Should have had more examples of belief nets in the bag. * Assignment 1 ~ Individual (small) assignment. diff --git a/web-src/syllabus.md b/web-src/syllabus.md index 0592d4e..5347a27 100644 --- a/web-src/syllabus.md +++ b/web-src/syllabus.md @@ -75,6 +75,7 @@ Each topic stands as a milestone in a particular tradition, and most remain acti * Game-related AI * Video game character AI/social simulation * Automated "Heads Up" player + * Realtime game AI * Guess game from level, generate level given game * GVGAI competition bot (or Arcade Learning Environment) * Learn game rules (GDL/VGDL) from forward model @@ -89,6 +90,8 @@ Each topic stands as a milestone in a particular tradition, and most remain acti * Survey or deep-dive papers from recent AAAI/IJCAI/NIPS/etc conferences or arxiv publications in machine learning/AI/etc * Deep analysis/historical study/etc of some AI system(s) or survey of techniques * Use a probabilistic programming language to encode one or more interesting models + * E.g. http://webppl.org (book at http://dippl.org), or PyMC3 for Python + * Program synthesis --- given a specification or a set of examples or a partially implemented program, come up with a function implementing it * ... #References From 350f2d52f71c3d8154b3cd8383207a4c74a8d5f1 Mon Sep 17 00:00:00 2001 From: Kenny Ng Date: Fri, 15 Jul 2016 13:09:25 -0700 Subject: [PATCH 4/4] Changes and function definitions to Maze class. --- projects/3-mazes/Maze Solvers.ipynb | 158 +++++----------------------- 1 file changed, 27 insertions(+), 131 deletions(-) diff --git a/projects/3-mazes/Maze Solvers.ipynb b/projects/3-mazes/Maze Solvers.ipynb index b0025f9..14f9d60 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": null, "metadata": { "collapsed": false }, @@ -37,22 +37,11 @@ }, { "cell_type": "code", - "execution_count": 257, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "{<__main__.Maze at 0x107e60be0>, <__main__.Maze at 0x107e60a58>}" - ] - }, - "execution_count": 257, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "class Maze:\n", " SwitchMap = {\"0\":\"a\", \"1\":\"b\", \"2\":\"c\", \"3\":\"d\", \"4\":\"e\", \"5\":\"f\", \"6\":\"g\", \"7\":\"h\", \"8\":\"i\", \"9\":\"j\"}\n", @@ -177,13 +166,22 @@ " edgecolor=Maze.Colors[\"@\"] if self.player_alive else \"white\")\n", " )\n", " plt.show(fig1)\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)) + hash(self.player_pos) + hash(self.player_alive)\n", - "\n", + " return hash(str(self.grid)) % 1000007 + hash(self.player_pos) % 1000007 + hash(self.player_alive) % 1000007\n", + " \n", + " def __cmp__(self,other):\n", + " if self == other:\n", + " return 0\n", + " return __cmp__(id(self), id(other))\n", + " \n", + " \n", "sample=Maze([\n", " \"##x#\",\n", " \"#.A#\",\n", @@ -213,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 234, + "execution_count": null, "metadata": { "collapsed": true }, @@ -227,42 +225,11 @@ }, { "cell_type": "code", - "execution_count": 235, + "execution_count": null, "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU8AAAD7CAYAAADq4RYlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADwJJREFUeJzt3X9s3Hd9x/HXqwRk114jkJxUIyJN2UqcCtZWbHRUaBpZ\n1QykliJNKmUCdxJ/TEypAAFt9wf9C5VQxLqfUkUp7dQOiSxRqomuWYiERBFsbUmaxXZWjYqmZbWN\nKIlsktHQ9/7wObMd203f38/X97n6+ZAi3V3On3vdne913+/d+d6OCAEAXpsLuh0AAHoR5QkACZQn\nACRQngCQQHkCQALlCQAJ69q+ANt8FgpAz4oIL3V66+UpSd/48DtX42LS9o5O6MZtG7sdY1m155Pq\nz1h7Pqn+jLXnk8pnHNlzZNn/Y7cdABIoTwBIoDwlbR0a6HaEFdWeT6o/Y+35pPoz1p5PWt2Mbvtv\n221H7a95AsBSRvYcWfYNI7Y8ASCB8gSABMoTABIoTwBIoDwBIIHyBIAEyhMAEihPAEigPAEg4VXL\n0/Z9tidsPz3vtDfb3m/7mO3HbK9vNyYA1OV8tjzvl3TdotNuk3QgIt4h6aCk20sHA4CavWp5RsT3\nJL206OQbJD3QOfyApA8VzgUAVcu+5rkhIiYkKSJelLShXCQAqF+pN4wYtQFgTcmO4ZiwvTEiJmxf\nLGlypTPvHZ04e3jr0ICGhwaTFyvtfGxMJ2fOpH9+KRcNrNNfXzdcbL3Rt+/QhQPlvldwenpad999\nd7H1Nqwf1K7tW4qtJ0mf+86zmjwxXWy90hlL55Ok/v4+nTp1utr11uJt2PQ6j01Na3xq5rzOe77l\n6c6/OY9IGpH0JUkfl7RvpR8uOVPk5MwZ6c5iy82ueWfZMi5ZnJI0ODiokt+7ai/59YSNTJ6Yrjpj\n6XzSbMbS15nbsPl6TQwPDS7YuNs3vvx24fl8VOlhSd+XdJnt52zfIukuSdfaPiZpe+c4AKwZr7rl\nGRE3L/Nff1Q4CwD0DP7CCAASKE8ASKA8ASCB8gSABMoTABIoTwBIoDwBIIHyBIAEyhMAEihPAEig\nPAEggfIEgATKEwASKE8ASKA8ASCB8gSAhOwMo67xG6W4s/yaJf1yZqb4DKOSIxX6+vo0sudIsfXm\n1qw5Y+l8bazJbdhcf39fsbVeTc+VZ7ysVuaolLTtv/+16Hoje45UPSunjTVrX29uzW98+J3F1qv9\nfu6V35vVwm47ACRQngCQQHkCQALlCQAJlCcAJFCeAJBAeQJAAuUJAAmUJwAkUJ4AkEB5AkAC5QkA\nCZQnACRQngCQ0Kg8bd9u+6jtp20/ZPtNpYIBQM3S5Wl7s6RPSLoyIt6l2e8GvalUMACoWZMvQz4p\n6VeSBmy/IulCST8tkgoAKpfe8oyIlyR9RdJzkl6Q9IuIOFAqGADULL3laftSSZ+StFnSCUm7bd8c\nEQ8vPu/e0Ymzh7cODWh4aDB7servLz9HpfTck89951lNnpgutl7p69wLs2hqX08q/3tT+/3cC783\nTe+TsalpjU/NnNd5m+y2v1vS4xHxc0myvUfSeyWdU543btvY4GIWOnXqdPUzjCZPTBefy1LzrByp\n/oxtzd8pqfTvdhvzgUrex1I793MTw0ODCzbu9o1PLnveJu+2H5N0te0+zybeLmmswXoA0DOavOZ5\nWNKDkp6UdFiSJd1bKBcAVK3R6OGI+LKkLxfKAgA9g78wAoAEyhMAEihPAEigPAEggfIEgATKEwAS\nKE8ASKA8ASCB8gSABMoTABIoTwBIoDwBIIHyBIAEyhMAEihPAEigPAEgodGXIXdDGwPg+vr6NLLn\nSNH1ahpqtdR6DEMrs2bNvzdt/B6WvL5S/Y+VlfRcebY1AK72wVsl9cIQvdqHobWxZu0D29oaHFjz\nY2Ul7LYDQALlCQAJlCcAJFCeAJBAeQJAAuUJAAmUJwAkUJ4AkEB5AkAC5QkACZQnACRQngCQQHkC\nQALlCQAJjcrT9nrb37I9Zvuo7feUCgYANWv6fZ73SPp2RPyJ7XWSLiyQCQCqly5P2xdJel9EjEhS\nRJyRdLJQLgCoWpPd9i2Sfmb7fttP2b7Xdn+pYABQsya77eskXSXpkxHxhO2/knSbpC8sPuPe0Ymz\nh7cODWh4aDB9oW3NMKp9dkxJa3EOVFszjGrOWPt90saaTR8rY1PTGp+aOa/zNinP5yUdj4gnOsd3\nS/r8Ume8cdvGBhezUFvzd2qe9VL7fCCpN+b5cJ3rWq+NNZs+VoaHBhds3O0bn1z2vOnd9oiYkHTc\n9mWdk7ZLGs2uBwC9pOm77TslPWT7jZJ+LOmW5pEAoH6NyjMiDkv63UJZAKBn8BdGAJBAeQJAAuUJ\nAAmUJwAkUJ4AkEB5AkAC5QkACZQnACRQngCQQHkCQALlCQAJlCcAJFCeAJBAeQJAAuUJAAlNvwx5\n1bUxf6f2GUGl821YP1j9LJra12tjzbW2Xhtrln6srKTnyrOt+Tsllc5YOt+u7VuKrie1M7ep5rlS\nUjvzd2q+zmthhtFrwW47ACRQngCQQHkCQALlCQAJlCcAJFCeAJBAeQJAAuUJAAmUJwAkUJ4AkEB5\nAkAC5QkACZQnACRQngCQ0Lg8bV9g+ynbj5QIBAC9oMSW562SRgusAwA9o1F52t4k6QOSvlYmDgD0\nhqZbnl+V9FlJZb9eGgAqly5P2x+UNBERhyS58w8A1gRn54fY/qKkP5V0RlK/pN+QtCciPrbofHHD\n1g1nj28dGtDw0GA68J8/+oxOnTqd/vml9PX16fTpcmvWvl5/f1/x27D0mqXXK30btrFm7de5V27D\nf/jj307//NjUtManZs4e3zc+qYhYcsMwPQAuIu6QdIck2f4DSZ9ZXJxzbty2MXsx52hrAFzNg7Jq\nX29uzbU4vGwtXefS11dq5zo3MTw0uGDjbt/45LLn5XOeAJBQZPRwRHxX0ndLrAUAvYAtTwBIoDwB\nIIHyBIAEyhMAEihPAEigPAEggfIEgATKEwASKE8ASKA8ASCB8gSABMoTABIoTwBIoDwBIIHyBIAE\nyhMAEop8GfJq2rB+sPFX7S/W399XdM3a1+vrK7ve3Joje44UXa/269zfv7auc+n7eG7N0o+V1dJz\n5blr+5ZuR+h5pefGSPXPWeqV+Ttrab021iz9BLkSdtsBIIHyBIAEyhMAEihPAEigPAEggfIEgATK\nEwASKE8ASKA8ASCB8gSABMoTABIoTwBIoDwBIIHyBICEdHna3mT7oO2jto/Y3lkyGADUrMn3eZ6R\n9OmIOGR7UNKTtvdHxHihbABQrfSWZ0S8GBGHOoenJY1JemupYABQsyKvedq+RNIVkn5YYj0AqF3j\nMRydXfbdkm7tbIGeY+/oxNnDW4cGNDw02PRi0cBanQNV+/yd2tcrfZ+0seaG9c26ZWxqWuNTM+d1\nXjeZH2J7naR/kfRoRNyzzHmi9OwY4LVibhMyOr83S7Z70932r0saXa44AeD1qslHla6R9FFJ77f9\nI9tP2d5RLhoA1Cv9mmdEPC7pDQWzAEDP4C+MACCB8gSABMoTABIoTwBIoDwBIIHyBIAEyhMAEihP\nAEigPAEggfIEgATKEwASKE8ASKA8ASCB8gSABMoTABIoTwBIaDwADugFa3HoXdNhaFgZ5Yk1Ydf2\nLd2OgNcZdtsBIIHyBIAEyhMAEihPAEigPAEggfIEgATKEwASKE8ASKA8ASCB8gSABMoTABIoTwBI\noDwBIKFRedreYXvc9n/Z/nypUABQu3R52r5A0t9Kuk7S5ZI+YntrqWCraWxqutsRVlR7Pqn+jLXn\nk+rPWHs+aXUzNtny/D1Jz0TETyLiZUnflHRDmVira3xqptsRVlR7Pqn+jLXnk+rPWHs+aXUzNinP\nt0o6Pu/4853TAOB1jzeMACDBEZH7QftqSXdGxI7O8dskRUR8adH5chcAABWIiCUHSzUpzzdIOiZp\nu6T/kfTvkj4SEWPZkADQK9ID4CLi17b/QtJ+ze7+30dxAlgr0lueALCWtfaGUe0foLe9yfZB20dt\nH7G9s9uZlmL7AttP2X6k21mWYnu97W/ZHuvclu/pdqbFbN/eyfa07Ydsv6mCTPfZnrD99LzT3mx7\nv+1jth+zvb6yfLs69/Mh2/9s+6Ju5Vsu47z/+4ztV2y/pa3Lb6U8e+QD9GckfToiLpf0+5I+WWFG\nSbpV0mi3Q6zgHknfjohhSb8jqaqXbmxvlvQJSVdGxLs0+1LVTd1NJUm6X7OPj/luk3QgIt4h6aCk\n21c91f9bKt9+SZdHxBWSnlF380lLZ5TtTZKulfSTNi+8rS3P6j9AHxEvRsShzuFpzT7oq/qcaueX\n4AOSvtbtLEvpbHm8LyLul6SIOBMRJ7sca7GTkn4lacD2OkkXSvppdyNJEfE9SS8tOvkGSQ90Dj8g\n6UOrGmqepfJFxIGIeKVz9AeSNq16sIV5lroNJemrkj7b9uW3VZ499QF625dIukLSD7ub5BxzvwS1\nvjC9RdLPbN/feWnhXtv93Q41X0S8JOkrkp6T9IKkX0TEge6mWtaGiJiQZp/cJW3ocp6V/JmkR7sd\nYjHb10s6HhFH2r6sNf8heduDknZLurWzBVoF2x+UNNHZOnbnX23WSbpK0t9FxFWSfqnZXc9q2L5U\n0qckbZb0m5IGbd/c3VTnrconTdt/KenliHi421nm6zxx3yHpC/NPbuvy2irPFyS9bd7xTZ3TqtLZ\njdst6R8jYl+38yxyjaTrbf9Y0j9J+kPbD3Y502LPa/ZZ/onO8d2aLdOavFvS4xHx84j4taQ9kt7b\n5UzLmbC9UZJsXyxpsst5zmF7RLMvJdX4BPR2SZdIOmz7Wc32zpO2W9mCb6s8/0PSb9ne3Hln8yZJ\nNb5b/HVJoxFxT7eDLBYRd0TE2yLiUs3efgcj4mPdzjVfZxfzuO3LOidtV31vbh2TdLXtPtvWbMZa\n3tRavEfxiKSRzuGPS+r2E/qCfLZ3aPZlpOsj4n+7lmqhsxkj4j8j4uKIuDQitmj2yf3KiGjlSaiV\n8uw8w899gP6opG/W9gF629dI+qik99v+Uec1ux3dztWDdkp6yPYhzb7b/sUu51kgIg5LelDSk5IO\na/aBdm9XQ0my/bCk70u6zPZztm+RdJeka23P/eXeXZXl+xtJg5L+rfN4+ftu5Vsh43yhFnfb+ZA8\nACSs+TeMACCD8gSABMoTABIoTwBIoDwBIIHyBIAEyhMAEihPAEj4P6kmn+nlBYp5AAAAAElFTkSu\nQmCC\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 maze1():\n", " return Maze([\n", @@ -316,21 +283,11 @@ }, { "cell_type": "code", - "execution_count": 242, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n", - "[]\n", - "[]\n" - ] - } - ], + "outputs": [], "source": [ "print(heuristic(maze1()))\n", "print(heuristic(maze2()))\n", @@ -346,32 +303,11 @@ }, { "cell_type": "code", - "execution_count": 237, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\n/D+POh+f+M9ZsgAAAABJRU5ErkJggg==\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 maze3():\n", " return Maze([\n", @@ -408,20 +344,11 @@ }, { "cell_type": "code", - "execution_count": 238, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n", - "[]\n" - ] - } - ], + "outputs": [], "source": [ "print(heuristic(maze3()))\n", "print(heuristic(maze4()))" @@ -440,7 +367,7 @@ }, { "cell_type": "code", - "execution_count": 239, + "execution_count": null, "metadata": { "collapsed": true }, @@ -462,42 +389,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", @@ -549,7 +445,7 @@ }, { "cell_type": "code", - "execution_count": 241, + "execution_count": null, "metadata": { "collapsed": true },