diff --git a/ipynb/Maze.ipynb b/ipynb/Maze.ipynb index 5f832ce..535c59c 100644 --- a/ipynb/Maze.ipynb +++ b/ipynb/Maze.ipynb @@ -4,21 +4,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "
Peter Norvig
13 March 2018
\n", + "
Peter Norvig
March 2018
\n", "\n", "# Maze Generation\n", "\n", - "Let's make some mazes! I'm thinking of mazes like this one, which is a rectangular grid of squares, with walls on some of the sides of squares, and openings on other sides:\n", + "Let's make some mazes! I'm thinking of mazes like this one, which is a rectangular grid of squares, with walls on some of the sides of squares, and openings on other sides. The goal is to get from the red arrow to the green arrow.\n", "\n", "![Wikipedia](https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Maze_simple.svg/475px-Maze_simple.svg.png)\n", "\n", - "The main constraint is that there should be a path from entrance to exit, and it should be ***fun*** to solve the maze with pencil, paper, and brain power—not too easy, but also not impossible. \n", + "The two main constraints are that there should be a path from entrance to exit, and it should be ***fun*** to solve the maze with pencil, paper, and brain power—not too easy, but also not impossible. \n", "\n", "As I think about how to model a maze on the computer, it seems like a **graph** is the right model: the nodes of\n", "the graph are the squares of the grid, and the edges of the graph are the openings between adjacent squares. So what properties of a graph make a good maze?\n", "- There must be a path from entrance to exit.\n", - "- There must not be too such many paths; maybe it is best if there is only one. \n", - "- Probably the graph should be *singly connected*—there shouldn't be islands of squares that are unreachable from the start. And maybe we want exactly one path between any two squares.\n", + "- There must not be too many such paths; maybe it is best if there is only one. \n", + "- Probably the graph should be *singly connected*—there shouldn't be islands of squares that are unreachable from the start. In fact, maybe we want exactly one path between any two squares.\n", "- The path should have many twists; it would be too easy if it was mostly straight.\n", "\n", "I know that a **tree** has all these properties except the last one. So my goal has become: *Superimpose a tree over the grid, covering every square, and make sure the paths are twisty.* Here's how I'll do it:\n", @@ -51,7 +51,7 @@ " o o--o--o--o--o--o--o--o--o--o\n", " | A b c| | | | | | | |\n", " o o--o o--o--o--o--o--o--o--o\n", - " | B| e d| | N| | | | | |\n", + " | B| e| d| | N| | | | | |\n", " o o--o--o--o o--o--o--o--o--o\n", " | C D| | | M| | | | | |\n", " o--o o--o--o o--o--o--o--o--o\n", @@ -63,21 +63,25 @@ "Continue like this until every square in the grid has been added to the tree. \n", "\n", "\n", - "## Implementing Random Trees\n", + "# Implementing Random Trees\n", "\n", "I'll make the following implementation choices:\n", "\n", "- A tree will be represented as a list of edges.\n", - "- An `Edge` is a tuple of two nodes. I'll keep them sorted so that `Edge(A, B)` is the same as `Edge(B, A)`.\n", + "- An `Edge` is a tuple of two nodes. Edges are bidirectional, so to avoid confusion we will always us the tuple that is in sorted order: always `(1, 2)`, never `(2, 1)`. The constructor `edge` enforces that.\n", "- A node in a tree can be anything: a number, a letter, a square, ...\n", - "- The algorithm for `random_tree(nodes, neighbors, pop)` is as follows:\n", - " * We will keep track of three collections:\n", + "- The algorithm for `random_tree(nodes, neighbors, pop)` works as follows:\n", + " * The arguments are:\n", + " - `nodes`: a collection of nodes.\n", + " - `neighbors`: a function such that `neighbors(node)` returns a set of nodes.\n", + " - `pop`: a function such that `pop(frontier)` removes and returns an element from `frontier`.\n", + " * The function keeps track of three collections:\n", " - `tree`: a list of edges that constitutes the tree.\n", " - `nodes`: the set of nodes that have not yet been added to the tree, but will be.\n", " - `frontier`: a queue of nodes in the tree that are eligible to have an edge added.\n", " * On each iteration:\n", " - Use `pop` to pick a `node` from the frontier, and find the neighbors that are not already in the tree.\n", - " - If there are any neighbors, randomly pick one (`nbr`), add `Edge(node, nbr)` to `tree`, remove the\n", + " - If there are any neighbors, randomly pick one (`nbr`), add `edge(node, nbr)` to `tree`, remove the\n", " neighbor from `nodes`, and keep both the node and the neighbor on the frontier. If there are no neighbors,\n", " drop the node from the frontier.\n", " * When no `nodes` remain, return `tree`." @@ -86,19 +90,21 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import random\n", "from collections import deque, namedtuple\n", "\n", - "def Edge(node1, node2): return tuple(sorted([node1, node2]))\n", + "Edge = tuple\n", + "Tree = list\n", "\n", - "def random_tree(nodes: set, neighbors: callable, pop: callable) -> [Edge]:\n", - " \"Repeat: pop a node and add Edge(node, nbr) until all nodes have been added to tree.\"\n", - " tree = []\n", + "def edge(A, B) -> Edge: return Edge(sorted([A, B]))\n", + "\n", + "def random_tree(nodes, neighbors, pop=deque.pop) -> [Edge]:\n", + " \"\"\"Repeat: pop a node and add edge(node, nbr) until all nodes have been added to tree.\"\"\"\n", + " tree = Tree()\n", + " nodes = set(nodes)\n", " root = nodes.pop()\n", " frontier = deque([root])\n", " while nodes:\n", @@ -106,7 +112,7 @@ " nbrs = neighbors(node) & nodes\n", " if nbrs:\n", " nbr = random.choice(list(nbrs))\n", - " tree.append(Edge(node, nbr))\n", + " tree.append(edge(node, nbr))\n", " nodes.remove(nbr)\n", " frontier.extend([node, nbr])\n", " return tree" @@ -116,7 +122,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Implementing Random Mazes\n", + "# Implementing Random Mazes\n", "\n", "Now let's use `random_tree` to implement `random_maze`. Some more choices:\n", "\n", @@ -128,24 +134,24 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "Maze = namedtuple('Maze', 'width, height, edges')\n", "\n", - "def neighbors4(square):\n", - " \"The 4 neighbors of an (x, y) square.\"\n", + "Square = tuple\n", + "\n", + "def neighbors4(square) -> {Square}:\n", + " \"\"\"The 4 neighbors of an (x, y) square.\"\"\"\n", " (x, y) = square\n", " return {(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)}\n", "\n", - "def squares(width, height): \n", - " \"All squares in a grid of these dimensions.\"\n", + "def squares(width, height) -> {Square}: \n", + " \"\"\"All squares in a grid of these dimensions.\"\"\"\n", " return {(x, y) for x in range(width) for y in range(height)}\n", "\n", - "def random_maze(width, height, pop=deque.pop):\n", - " \"Use random_tree to generate a random maze.\"\n", + "def random_maze(width, height, pop=deque.pop) -> Maze:\n", + " \"\"\"Generate a random maze, using rrandom_tree.\"\"\"\n", " nodes = squares(width, height)\n", " tree = random_tree(nodes, neighbors4, pop)\n", " return Maze(width, height, tree)" @@ -154,14 +160,12 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Maze(width=10, height=5, edges=[((6, 3), (7, 3)), ((6, 3), (6, 4)), ((6, 4), (7, 4)), ((7, 4), (8, 4)), ((8, 3), (8, 4)), ((8, 2), (8, 3)), ((7, 2), (8, 2)), ((7, 1), (7, 2)), ((7, 0), (7, 1)), ((7, 0), (8, 0)), ((8, 0), (8, 1)), ((8, 1), (9, 1)), ((9, 0), (9, 1)), ((9, 1), (9, 2)), ((9, 2), (9, 3)), ((9, 3), (9, 4)), ((6, 0), (7, 0)), ((5, 0), (6, 0)), ((5, 0), (5, 1)), ((5, 1), (6, 1)), ((6, 1), (6, 2)), ((5, 2), (6, 2)), ((4, 2), (5, 2)), ((3, 2), (4, 2)), ((3, 2), (3, 3)), ((2, 3), (3, 3)), ((2, 2), (2, 3)), ((2, 1), (2, 2)), ((2, 0), (2, 1)), ((1, 0), (2, 0)), ((0, 0), (1, 0)), ((0, 0), (0, 1)), ((0, 1), (1, 1)), ((1, 1), (1, 2)), ((0, 2), (1, 2)), ((0, 2), (0, 3)), ((0, 3), (1, 3)), ((1, 3), (1, 4)), ((0, 4), (1, 4)), ((1, 4), (2, 4)), ((2, 4), (3, 4)), ((3, 4), (4, 4)), ((4, 3), (4, 4)), ((4, 3), (5, 3)), ((5, 3), (5, 4)), ((2, 0), (3, 0)), ((3, 0), (4, 0)), ((4, 0), (4, 1)), ((3, 1), (4, 1))])" + "Maze(width=10, height=5, edges=[((6, 3), (7, 3)), ((6, 3), (6, 4)), ((5, 4), (6, 4)), ((4, 4), (5, 4)), ((4, 3), (4, 4)), ((3, 3), (4, 3)), ((2, 3), (3, 3)), ((1, 3), (2, 3)), ((0, 3), (1, 3)), ((0, 2), (0, 3)), ((0, 1), (0, 2)), ((0, 0), (0, 1)), ((0, 0), (1, 0)), ((1, 0), (1, 1)), ((1, 1), (2, 1)), ((2, 1), (3, 1)), ((3, 1), (3, 2)), ((2, 2), (3, 2)), ((1, 2), (2, 2)), ((3, 2), (4, 2)), ((4, 2), (5, 2)), ((5, 2), (5, 3)), ((5, 2), (6, 2)), ((6, 2), (7, 2)), ((7, 1), (7, 2)), ((6, 1), (7, 1)), ((5, 1), (6, 1)), ((4, 1), (5, 1)), ((4, 0), (4, 1)), ((4, 0), (5, 0)), ((5, 0), (6, 0)), ((6, 0), (7, 0)), ((7, 0), (8, 0)), ((8, 0), (9, 0)), ((9, 0), (9, 1)), ((9, 1), (9, 2)), ((9, 2), (9, 3)), ((9, 3), (9, 4)), ((8, 4), (9, 4)), ((8, 3), (8, 4)), ((8, 2), (8, 3)), ((8, 1), (8, 2)), ((7, 4), (8, 4)), ((3, 0), (4, 0)), ((2, 0), (3, 0)), ((0, 3), (0, 4)), ((0, 4), (1, 4)), ((1, 4), (2, 4)), ((2, 4), (3, 4))])" ] }, "execution_count": 3, @@ -179,44 +183,44 @@ "source": [ "That's not very pretty to look at. I'm going to need a way to visualize a maze.\n", "\n", - "# Printing a maze" + "# Printing a maze\n", + "\n", + "Here's a function to print a maze:" ] }, { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "o o--o--o--o--o--o--o--o--o--o\n", - "| | | |\n", - "o--o--o--o o--o o o o--o o\n", - "| | | | |\n", - "o o o--o--o o--o--o--o--o o\n", - "| | | | | | |\n", - "o o--o o o--o o o--o o--o\n", - "| | | | | | |\n", - "o o o--o--o--o--o o o--o o\n", - "| | |\n", + "| | | |\n", + "o--o--o--o o o--o o o--o o\n", + "| | | | | | |\n", + "o o o o--o--o o o--o o o\n", + "| | | | | |\n", + "o o--o o o--o--o--o--o--o o\n", + "| | | | | | |\n", + "o o o--o--o--o o o o o o\n", + "| | | | |\n", "o--o--o--o--o--o--o--o--o--o o\n" ] } ], "source": [ - "def print_maze(maze, dot='o', lin='--', bar='|', sp=' '):\n", - " \"Print maze in ASCII.\"\n", - " exit = Edge((maze.width-1, maze.height-1), (maze.width-1, maze.height))\n", + "def print_maze(maze, dot='o', bar='|', sp1=' ', sp2=' ', lin='--'):\n", + " \"\"\"Print maze in ASCII.\"\"\"\n", + " exit = edge((maze.width-1, maze.height-1), (maze.width-1, maze.height))\n", " edges = set(maze.edges) | {exit}\n", - " print(dot + sp + lin.join(dot * maze.width)) # Top line, including entrance\n", - " def vert_wall(x, y): return (' ' if Edge((x, y), (x+1, y)) in edges else bar)\n", - " def horz_wall(x, y): return (sp if Edge((x, y), (x, y+1)) in edges else lin)\n", + " print(dot + sp2 + lin.join(dot * maze.width)) # Top line, including entrance\n", + " def vert_wall(x, y): return (sp1 if edge((x, y), (x+1, y)) in edges else bar)\n", + " def horz_wall(x, y): return (sp2 if edge((x, y), (x, y+1)) in edges else lin)\n", " for y in range(maze.height):\n", - " print(bar + cat(sp + vert_wall(x, y) for x in range(maze.width)))\n", + " print(bar + cat(sp2 + vert_wall(x, y) for x in range(maze.width)))\n", " print(dot + cat(horz_wall(x, y) + dot for x in range(maze.width)))\n", " \n", "cat = ''.join\n", @@ -238,30 +242,28 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", - "def plot_maze(maze):\n", - " \"Plot a maze by drawing lines between adjacent squares, except for pairs in maze.edges\"\n", - " plt.figure(figsize=(8, 4))\n", + "def plot_maze(maze, figsize=None):\n", + " \"\"\"Plot a maze by drawing lines between adjacent squares, except for pairs in maze.edges\"\"\"\n", + " w, h = maze.width, maze.height\n", + " plt.figure(figsize=figsize or (w/5, h/5))\n", " plt.axis('off')\n", " plt.gca().invert_yaxis()\n", - " w, h = maze.width, maze.height\n", - " exits = {Edge((0, 0), (0, -1)), Edge((w-1, h-1), (w-1, h))}\n", + " exits = {edge((0, 0), (0, -1)), edge((w-1, h-1), (w-1, h))}\n", " edges = set(maze.edges) | exits\n", " for sq in squares(w, h):\n", " for nbr in neighbors4(sq):\n", - " if Edge(sq, nbr) not in edges:\n", + " if edge(sq, nbr) not in edges:\n", " plot_wall(sq, nbr)\n", " plt.show()\n", "\n", "def plot_wall(s1, s2):\n", - " \"Plot a thick black line between squares s1 and s2.\"\n", + " \"\"\"Plot a thick black line between squares s1 and s2.\"\"\"\n", " (x1, y1), (x2, y2) = s1, s2\n", " if x1 == x2: # horizontal wall\n", " y = max(y1, y2)\n", @@ -269,7 +271,7 @@ " else: # vertical wall\n", " x = max(x1, x2)\n", " X, Y = [x, x], [y1, y1+1]\n", - " plt.plot(X, Y, 'k-', linewidth=4.0)" + " plt.plot(X, Y, 'k-', linewidth=3.0)" ] }, { @@ -282,18 +284,18 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAd0AAAD8CAYAAAAyun5JAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAABNxJREFUeJzt2sFuIjEUAMF4xf//svcaJSsIAdr2UnXj9uSZUct6jDnn\nBwDwen9WDwAA70J0ASAiugAQEV0AiIguAEREFwAiogsAEdEFgIjoAkBEdAEgIroAEBFdAIiILgBE\nRBcAIqILABHRBYCI6AJA5LJ6gGvGGPPz7znnWDXLv3ydD4Cz1F1x0wWAiOgCQER0ASCy9U53d7vt\nmHlfu///AXax+r84broAEBFdAIiILgBERBcAIqILABHRBYCI6AJARHQBICK6ABARXQCIiC4AREQX\nACKiCwAR0QWAiOgCQER0ASAiugAQEV0AiIguAEREFwAiogsAEdEFgIjoAkBEdAEgIroAEBFdAIiI\nLgBERBcAIqILABHRBYCI6AJARHQBICK6ABARXQCIiC4ARC6rBzjZGGOunuFec86xeoavTjvHHc9w\nd6c9Y57Dt/Kdmy4AREQXACKiCwARO90n2nF/ccIubcdz++yEMzzN7s+c3/Gt3OamCwAR0QWAiOgC\nQER0ASAiugAQEV0AiIguAEREFwAiogsAEdEFgIjoAkBEdAEgIroAEBFdAIiILgBERBcAIqILABHR\nBYCI6AJARHQBICK6ABARXQCIiC4AREQXACKiCwAR0QWAiOgCQER0ASAiugAQEV0AiIguAEREFwAi\nogsAEdEFgMhl9QC0xhhz9Qy3zDnH6hl4Le/h75xwblznpgsAEdEFgIjoAkDETvfN7Lin4v14D5/D\nOZ7HTRcAIqILABHRBYCI6AJARHQBICK6ABARXQCIiC4AREQXACKiCwAR0QWAiOgCQER0ASAiugAQ\nEV0AiIguAEREFwAiogsAEdEFgIjoAkBEdAEgIroAEBFdAIiILgBERBcAIqILABHRBYCI6AJARHQB\nICK6ABARXQCIiC4AREQXACKiCwAR0QWAyGX1ADDGmKtnuMdp8/IznuvjnOFtbroAEBFdAIiILgBE\n7HQfMOccq2f4HzjHx9mlPZ/38nE7nuHqb8VNFwAiogsAEdEFgIjoAkBEdAEgIroAEBFdAIiILgBE\nRBcAIqILABHRBYCI6AJARHQBICK6ABARXQCIiC4AREQXACKiCwAR0QWAiOgCQER0ASAiugAQEV0A\niIguAEREFwAiogsAEdEFgIjoAkBEdAEgIroAEBFdAIiILgBERBcAIqILAJHL6gHuMcaYq2e4Zs45\nVs9wy+5neIITnjOP863wCm66ABARXQCIiC4ARI7a6dql3c+ZPe6E3d7uz3n3+T4+zpiR87npAkBE\ndAEgIroAEBFdAIiILgBERBcAIqILABHRBYCI6AJARHQBICK6ABARXQCIiC4AREQXACKiCwAR0QWA\niOgCQER0ASAiugAQEV0AiIguAEREFwAiogsAEdEFgIjoAkBEdAEgIroAEBFdAIiILgBERBcAIqIL\nABHRBYCI6AJARHQBICK6ABC5rB7gHmOMuXoG8B7Cz8w5x+oZduOmCwAR0QWAiOgCQGTMaT0FAAU3\nXQCIiC4AREQXACKiCwAR0QWAiOgCQER0ASAiugAQEV0AiIguAEREFwAiogsAEdEFgIjoAkBEdAEg\nIroAEBFdAIiILgBERBcAIqILABHRBYCI6AJARHQBICK6ABARXQCIiC4AREQXACKiCwAR0QWAiOgC\nQER0ASDyFyUScgM3r2rXAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASUAAACWCAYAAACYTp4YAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAACwklEQVR4nO3dUUrDUBBA0Ubc/5bjn/hhKZH05U48ZwG1bfAyI8hs+74/ACo+rn4DAD+JEpAiSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQMrnmS+2bdv3P9Lt+76d+dq//Qyg5Yzfe5MSkCJKQMqp69sK71oLr7B63b3Td/cuvq/jzv6TikkJSBElIEWUgBRRAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIEWUgBRRAlJECUgRJSBFlIAUUQJSRAlIGXfN5IpjlK5avLb6uUx/Ji7ZPGdSAlJECUgZt76tGkNXrCOTRuojVqwj3JdJCUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIEWUgBRRAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUsYdDrjilpUjAkw36eiCSQlIESUgZdz6tsqKdWrSSP3KXdbPu3yOx2PunzdMSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKSIEpAiSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQMroayarroG4bPLa6vc//fta4YrDrWcwKQEpogSkjF7f3jmSrlgPJo3UR9z1c53J+vmcSQlIESUgRZSAFFECUkQJSBElIEWUgBRRAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIEWUgBRRAlJECUgZfc1kFZcnGu76HO76uf7KpASkiBKQMm59W3Xo0EHFYxzv5CwmJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIEWUgBRRAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIOVt10wc2Pu/PPueSZdgTEpAiigBKdu+m7SBDpMSkCJKQIooASmiBKSIEpAiSkCKKAEpogSkiBKQIkpAyhdya3k/PuCAlAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "
" ] }, - "metadata": {}, + "metadata": { + "needs_background": "light" + }, "output_type": "display_data" }, { @@ -301,22 +303,23 @@ "output_type": "stream", "text": [ "o o--o--o--o--o--o--o--o--o--o\n", + "| | | | |\n", + "o o--o o o o--o o o o o\n", + "| | | | | | | | |\n", + "o o o--o o o o o o o--o\n", + "| | | | | | |\n", + "o o--o o--o o--o--o--o o o\n", + "| | | | | | |\n", + "o o o--o--o--o o--o--o--o o\n", "| | |\n", - "o o--o o--o o o--o--o--o o\n", - "| | | | | | | |\n", - "o o o--o o o o--o o--o o\n", - "| | | | | | | |\n", - "o o o o--o--o o o--o o--o\n", - "| | | | | | |\n", - "o--o o--o--o o o o--o--o o\n", - "| | |\n", "o--o--o--o--o--o--o--o--o--o o\n" ] } ], "source": [ "M = random_maze(10, 5)\n", - "plot_maze(M) \n", + "\n", + "plot_maze(M, (5, 2.5)) \n", "print_maze(M)" ] }, @@ -328,105 +331,113 @@ "\n", "Now I want to compare how the maze varies based on theree different choices for the `pop` parameter. \n", "\n", - "(1) The default is `deque.pop`\n", - "which means that the tree is created **depth-first**; we always select the `node` at the end of the `frontier`, so the tree follows a single branch along a randomly-twisted path until the path doubles back on itself and there are no more neighbors; at that point we select the most recent square for which there are neighbors:" + "# `deque.pop`\n", + "\n", + "The default pop method means that the tree is created **depth-first**; we always select the `node` at the end of the `frontier`, so the tree follows a single branch along a randomly-twisted path until the path doubles back on itself and there are no more neighbors; at that point we select the most recent square for which there are neighbors. The maze with `deque.pop` looks pretty good. Reminds me of those [cyber brain](https://www.vectorstock.com/royalty-free-vector/cyber-brain-vector-3071965) images:" ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, + "execution_count": 13, + "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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Jhzvde8EnRi3YypdUte0st/qmpq4s2PyVxM6l3fpar3azvuq+m1OmPS9uary96fD/f/GKWmGTzjZAAAAIgQbAABAhGADAACIEGwAAAARgg0AACBCsAEAAEQcXfp2Zzm5J+XZ0mVwfzPeJB3vq0u5vlNK7U3ort5V+tu08nq759e94/cEyfWY8LvXdW/flfidqvobrMqd+5hU7ngFJxsAAECEYAMAAIg4Oo2q4/FTlzl17U78xClHsO88vceqbs87VR5dV70ribG6d4Dvmp76r7E7visJyTVcbfcz6f69SafyVL0DO8et/N5M4mQDAACIEGwAAAARgg0AACBCsAEAAEQINgAAgIijq1G9k2zm1L2y0SoTGmIlq8N0b3y2arzf/pudKtdm9fUSa929YdiEBmndq99VNme7anpzyeT7PKHJ8ArJ8U7Zr3fG7s7JBgAAECHYAAAAIj42japDE51Tjsder/2pBR3WbsUcHM/+XnrfTG+MOOkbtvOduqMqLeOqdApMxwZyE5pBTvq9352CWvWcr6oa987YkzjZAAAAIgQbAABAhGADAACIEGwAAAARgg0AACBCsAEAAEQcXfq2e8fOO9ecbEI309W6zL/LPH6r676p6iSc/t50/CZO28vT5vtU8vve/Xp3rrlqvApP3+XK57Jy3HfurE3355zkZAMAAIgQbAAAABHHpVF170p553qf0nE0db3KsU+6lyqVHVyvmrDWp+ztT1zrSlX7ZsJv82onvVMnPZfVTrqXu5xsAAAAEYINAAAgQrABAABECDYAAIAIwQYAABAh2AAAACL+999/MxoafnLnRQAAPsu7crlPO7tXcLIBAABECDYAAICIMWlUAADALE42AACACMEGAAAQIdgAAAAiBBsAAECEYAMAAIgQbAAAABGCDQAAIEKwAQAARAg2AACACMEGAAAQIdgAAAAiBBsAAECEYAMAAIgQbAAAABGCDQAAIEKwAQAARAg2AACACMEGAAAQIdgAAAAiBBsAAECEYAMAAIgQbAAAABGCDQAAIEKwAQAARAg2AACACMEGAAAQIdgAAAAiBBsAAECEYAMAAIgQbAAAABGCDQAAIEKwAQAARAg2AACACMEGAAAQIdgAAAAiBBsAAECEYAMAAIgQbAAAABGCDQAAIOL/AYpJkjtUWZP7AAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "
" ] }, - "metadata": {}, + "metadata": { + "needs_background": "light" + }, "output_type": "display_data" } ], "source": [ - "plot_maze(random_maze(40, 20, deque.pop))" + "plot_maze(random_maze(70, 70, deque.pop))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The maze with `deque.pop` looks pretty good. Reminds me of those [cyber brain](https://www.vectorstock.com/royalty-free-vector/cyber-brain-vector-3071965) images.\n", + "# `deque.popleft`\n", "\n", - "(2) An alternative is `queue.popleft`, which creates the maze roughly **breadth-first**—we start at some root square , add an edge to it, and from then on we always select first a parent edge before we select a child edge. The net result is a design that appears to radiate out in concentric layers from the root (which is chosen by `random_tree` and is not necessarily the top-left square; below it looks like the root is in the upper-left quadrant). " + "This creates the maze roughly **breadth-first**—we start at some root square , add an edge to it, and from then on we always select first a parent edge before we select a child edge. The net result is a design that appears to radiate out in concentric layers from the root (which is chosen by `random_tree` and is not necessarily the top-left square; below it looks like the root is in the lower-right quadrant). The `deque.popleft` maze is interesting as a design, but to me it doesn't work well as a maze. It is too easy to say: follow the path from the start to the center point, then consider the path from the end to the center point, and see how they match up." ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, + "execution_count": 14, + "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "
" ] }, - "metadata": {}, + "metadata": { + "needs_background": "light" + }, "output_type": "display_data" } ], "source": [ - "plot_maze(random_maze(40, 20, deque.popleft))" + "plot_maze(random_maze(70, 70, deque.popleft))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The `deque.popleft` maze is interesting as a design, but to me it doesn't work well as a maze.\n", + "# `poprandom`\n", "\n", - "(3) We can select a cell at random by shuffling the frontier before popping an element off of it:" + "We can select a cell at random by shuffling the frontier before popping an element off of it.\n", + "This is an interesting compromise: it has some structure, but still works nicely as a maze, in my opinion." ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\nxnjoO1WPSQgAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": 16, + "metadata": {}, + "outputs": [], "source": [ "def poprandom(seq):\n", - " \"Shuffle a mutable sequence (deque or list) and then pop an element.\"\n", - " random.shuffle(seq)\n", - " return seq.pop()\n", - "\n", - "plot_maze(random_maze(40, 20, poprandom))" + " \"\"\"Select and return a random element; remove it from the sequence.\"\"\"\n", + " element = random.choice(seq)\n", + " seq.remove(element)\n", + " return element" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_maze(random_maze(70, 70, poprandom))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "This is an interesting compromise: it has some structure, but still works nicely as a maze, in my opinion.\n", - "\n", "What other variations can you come up with to generate interesting mazes?" ] } @@ -447,7 +458,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.7.7" } }, "nbformat": 4,