diff --git a/projects/3-mazes/Deitelzweig.ipynb b/projects/3-mazes/Deitelzweig.ipynb new file mode 100644 index 0000000..1e19f19 --- /dev/null +++ b/projects/3-mazes/Deitelzweig.ipynb @@ -0,0 +1,805 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we load up some useful libraries for visualization and data structures." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "import matplotlib\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as patches\n", + "import matplotlib.axes as axes\n", + "import copy\n", + "import random" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we need a Maze class for pathfinding. It will help to have read the RedBlobGames [A\\* tutorial](http://www.redblobgames.com/pathfinding/a-star/introduction.html) before continuing.\n", + "\n", + "These Mazes are defined in ASCII diagrams and can have walls (\"#\"), empty spaces (\".\"), switches (numbers), and doors (letters; closed are uppercase). The \"0\" switch toggles the open status of all the \"a\" doors, \"1\" goes to the \"b\" doors, etc. Mazes can also contain pits: \"?\" pits have a 30% chance of killing the player and \"!\" pits have a 60% chance. Every maze has one player start location \"@\" and one goal square \"X\". Walls and closed doors block movement." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "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": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "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", + " Colors = {\"a\":\"coral\",\"b\":\"tan\",\"c\":\"palegreen\",\"d\":\"blue\",\"e\":\"cyan\",\"f\":\"magenta\",\"g\":\"yellow\",\"h\":\"olive\",\"i\":\"purple\",\"j\":\"darkgreen\",\n", + " \"0\":\"coral\",\"1\":\"tan\",\"2\":\"palegreen\",\"3\":\"blue\",\"4\":\"cyan\",\"5\":\"magenta\",\"6\":\"yellow\",\"7\":\"olive\",\"8\":\"purple\",\"9\":\"darkgreen\",\n", + " \"?\":\"orange\",\n", + " \"!\":\"red\",\n", + " \"x\":\"green\",\"@\":\"gray\",\n", + " \"#\":\"sienna\",\".\":\"white\"}\n", + " \n", + " def __init__(self,rows):\n", + " self.grid = [list(r) for r in rows]\n", + " self.grid.reverse()\n", + " height = len(self.grid)\n", + " width = len(self.grid[0])\n", + " self.exit_pos = None\n", + " self.player_pos = None\n", + " self.player_alive = 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", + " c = self.grid[y][x]\n", + " assert c == \"#\" or c == \".\" or c == \"!\" or c == \"?\" or c == \"@\" or c.isalnum()\n", + " if c.lower() == \"x\":\n", + " assert self.exit_pos == None\n", + " self.exit_pos = (x,y)\n", + " if c == \"@\":\n", + " assert self.player_pos == None\n", + " self.player_pos = (x,y)\n", + " self.grid[y][x] = \".\"\n", + " \n", + " def clone(self):\n", + " return copy.deepcopy(self)\n", + " \n", + " def toggle_cell(self,switchnum,c):\n", + " if c.isalpha() and Maze.SwitchMap[switchnum] == c.lower():\n", + " if c.islower():\n", + " return c.upper()\n", + " else:\n", + " return c.lower()\n", + " return c\n", + " \n", + " def toggle(self):\n", + " assert self.player_alive\n", + " height = len(self.grid)\n", + " width = len(self.grid[0])\n", + " (px,py) = self.player_pos\n", + " switchnum = self.grid[py][px]\n", + " assert switchnum.isnumeric()\n", + " for y in range(0,height):\n", + " for x in range(0,width):\n", + " self.grid[y][x] = self.toggle_cell(switchnum,self.grid[y][x])\n", + " \n", + " def is_free(self,x,y):\n", + " if y < 0 or y >= len(self.grid):\n", + " return False\n", + " if x < 0 or x >= len(self.grid[0]):\n", + " return False\n", + " cell = self.grid[y][x]\n", + " return (\n", + " cell == \".\" or\n", + " cell == \"?\" or cell == \"!\" or cell == \"X\" or\n", + " (cell.isalpha() and cell.islower()) or cell.isnumeric()\n", + " )\n", + " \n", + " def move_player(self,dx,dy):\n", + " assert self.player_alive\n", + " assert abs(dx)+abs(dy) == 1\n", + " (x,y) = self.player_pos\n", + " (newx,newy) = (x+dx,y+dy)\n", + " assert self.is_free(newx,newy)\n", + " self.player_pos = (x+dx,y+dy)\n", + " cell = self.grid[y+dy][x+dx]\n", + " if cell == \"?\" and random.random() < 0.3:\n", + " self.player_alive = False\n", + " if cell == \"!\" and random.random() < 0.6:\n", + " self.player_alive = False\n", + " \n", + " def available_moves(self):\n", + " if not self.player_alive:\n", + " return []\n", + " (x,y) = self.player_pos\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", + " def is_at_exit(self):\n", + " return self.player_alive and self.player_pos == self.exit_pos\n", + " \n", + " def __hash__(self):\n", + " return hash(str(self.grid)) % 1000007 + hash(self.player_pos) % 1000007 + hash(self.player_alive) % 1000007\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 __lt__(self,other):\n", + " if self == other: return False\n", + " return id(self) < id(other)\n", + " def __gt(self, other):\n", + " if self == other: return False\n", + " return id(self) > id(other)\n", + " \n", + " def draw(self):\n", + " fig1 = plt.figure()\n", + " ax1 = fig1.add_subplot(1,1,1, aspect='equal')\n", + " ax1.set_axis_bgcolor('sienna')\n", + " height = len(self.grid)\n", + " width = len(self.grid[0])\n", + " ax1.set_xlim([0,width])\n", + " ax1.set_ylim([0,height])\n", + " for y in range(0,height):\n", + " for x in range(0,width):\n", + " cell = self.grid[y][x]\n", + " if cell == \"#\": continue\n", + " is_door = cell.isalpha() and cell.lower() != \"x\"\n", + " is_pit = cell == \"?\" or cell == \"!\"\n", + " is_open = is_door and cell.islower()\n", + " is_switch = cell.isnumeric()\n", + " ax1.add_patch(\n", + " patches.Rectangle((x, y),\n", + " 1,1,\n", + " fill=True,\n", + " facecolor=Maze.Colors[cell.lower()],\n", + " edgecolor=\"black\",\n", + " hatch=\"/\" if is_switch else (\"-\" if (is_door and not is_open) else None),\n", + " label=cell)\n", + " )\n", + " ax1.add_patch(\n", + " patches.Rectangle(self.player_pos,\n", + " 1,1,\n", + " fill=True,\n", + " hatch=\"x\" if not self.player_alive else None,\n", + " facecolor=Maze.Colors[\"@\"] if self.player_alive else \"black\",\n", + " edgecolor=Maze.Colors[\"@\"] if self.player_alive else \"white\")\n", + " )\n", + " plt.show(fig1)\n", + " \n", + " def paint(self, path):\n", + " for i in path:\n", + " if i != \"switch\":\n", + " (x,y) = i\n", + " if (x, y) != self.exit_pos:\n", + " self.grid[y][x] = \"e\"\n", + "\n", + "sample=Maze([\n", + " \"##X#\",\n", + " \"#.A#\",\n", + " \"#0?#\",\n", + " \"a@##\"\n", + " ])\n", + "sample.move_player(0,1)\n", + "print(sample.available_moves())\n", + "sample.move_player(1,0)\n", + "sample.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 1\n", + "\n", + "Write a function to solve pathfinding and switch-and-door puzzles with one of the heuristic search algorithms described during the lecture. Try it on the provided sample puzzles; if a puzzle gives your algorithm trouble, try to explain why that happens. Make sure the path you're getting is the actual shortest path!\n", + "\n", + "Try to get this assignment done by Friday; the other two may take a little longer but the sooner you attempt them the earlier you can get feedback!\n", + "\n", + "You may also try visualizing paths through the maze, implementing several different heuristic searches, comparing against aheuristic search, etc.\n", + "\n", + "Generating mazes automatically would also be a great exercise!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from queue import PriorityQueue\n", + "\n", + "def dist(p1, p2):\n", + " (x1, y1) = p1\n", + " (x2, y2) = p2\n", + " return abs(x1 - x2) + abs(y1 - y2)\n", + "\n", + "def heuristic(maze):\n", + " start = maze\n", + " goal = maze.exit_pos\n", + " \n", + " frontier = PriorityQueue()\n", + " frontier.put((0, start))\n", + " came_from = {}\n", + " cost_so_far = {}\n", + " came_from[start] = (None,None)\n", + " cost_so_far[start] = 0\n", + " \n", + " while not frontier.empty():\n", + " (key, current) = frontier.get()\n", + " \n", + " if current.is_at_exit():\n", + " path = []\n", + " while current:\n", + " (current,move) = came_from[current]\n", + " path.append(move)\n", + " path.reverse()\n", + " path.pop(0)\n", + " return path\n", + " \n", + " for next in current.available_moves():\n", + " succ = current.clone()\n", + " if next == \"switch\":\n", + " succ.toggle()\n", + " else:\n", + " succ.move_player(next[0],next[1])\n", + " #update came_from and cost_so_far based on taking the move from current to succ via \"next\"\n", + " new_cost = cost_so_far[current] + 1\n", + " if succ not in cost_so_far or new_cost < cost_so_far[succ]:\n", + " cost_so_far[succ] = new_cost\n", + " priority = new_cost + dist(goal, succ.player_pos)\n", + " frontier.put((priority, succ))\n", + " if next != \"switch\":\n", + " (dx, dy) = next\n", + " (x, y) = current.player_pos\n", + " neighbor = (x+dx,y+dy)\n", + " came_from[succ] = (current,neighbor)\n", + " else:\n", + " came_from[succ] = (current,next)\n", + "\n", + " return \"Unsolvable\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOIAAAEACAYAAACu66rqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADghJREFUeJzt3X+MHHd5x/H35+LEd+drTrTYKcXEJKqsBBTkRG6IMCFQ\nAw2hSoWlCgJS5KhK/yiVI1oDIf+Q/NFKgBCN1EpVBMQkNbSKe1ZSgcAhESBcNST+lSM+hzY/Gick\nthHG1tkOxPbTP3ZcmfOdd+48382zN5+XdLrd0+z3+8yuP57Zmd1nFBGY2etr4PUuwMwcRLMUHESz\nBBxEswQcRLMEHESzBGoFUdJtksarn3WlizJrm65BlPR24C+AlcAK4E8lXVq6MLM2qbNFvBx4LCJ+\nHREngB8Ba8qWZdYudYL4U+BaSW+QNAzcALylbFlm7bKg2wIRsUfSF4CHgUlgB3CidGFmbaLZftZU\n0t8BeyPin6f83R9aNZtGRKjbMl23iACSFkfEAUkXAx8BrpluuQ1rrphdhbOwefc+PvK2i4qN7zly\nzTEf1gFg7dh4reVqBRH4d0m/C7wG/FVEHJ5rYWZ2plpBjIj3lC7ErM365pM1ly1e5DlaNMd8WIfZ\nmPXBmhkHkqLke0SzfrR2bLzWwZq+2SKazWcOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZ\nAg6iWQIOolkCDqJZAg6iWQIOolkCdRsMf07SU5KelLRR0gWlCzNrkzoNhpcBtwJXRsQ76Hyr/2Ol\nCzNrkzqtMg4DvwEWSToJDAM/L1qVWct03SJGxEHgy8ALwEvAryLi+6ULM2uTrlvE6joXnwKWAYeA\nTZI+HhHfnLrs5t37/v/2ZYsXcfnikcYKXfe9CQ4fOd7YeNMZGhzk2KuvFp1jyegIX1x9SdE5PvPI\nc+w/NFl0jqGhQY4dK/dclR4fyrwWEwcm2XPgyKwfV2fXdCWwNSJ+CSBpDHgXcEYQS/aIPHzkONxZ\nbHgAjt35Kk318JmJ1LV9yTnbf2iyJ+tRco7S45+ao2mXLx75rQ3Qg3v213pcnaOmTwPXSBpUp/LV\nwMRcijSz6dV5j7gLuA/YBuwCBNxTuC6zVqnbYPhLwJcK12LWWv5kjVkCDqJZAg6iWQIOolkCDqJZ\nAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCdfqaLpe0Q9L26vch\nSet6UZxZW3T9hn5E/Ay4EkDSAPAisLlwXWatMttd0/cDz0TE3hLFmLXVbIP4UeBbJQoxa7NazaMA\nJJ0P3AjcPtMyJRsM63yIOxsbbloLBxcW7zu6ZLS552QmQ0ODxddjcLDsHKXHh87z1LSSDYZP+RCw\nLSIOzLRAyQbD8Ro9aTi7Yc0VRefohWPHetMoueRztXZs3A2GZ3AT3i01K6Lu9RGH6RyoGStbjlk7\n1W0wfBRYXLgWs9byJ2vMEnAQzRJwEM0ScBDNEnAQzRJwEM0ScBDNEnAQzRJwEM0ScBDNEnAQzRJw\nEM0ScBDNEnAQzRJwEM0ScBDNEqj7Df1RSQ9ImpD0lKR3li7MrE3qNo+6G/hORPy5pAXAcMGazFqn\naxAlXQhcGxFrASLiOHC4cF1mrVJn1/QS4BeS7q2uf3GPpKHShZm1SZ1d0wXAVcAnI+IJSf9Ap8nw\n56cuWLLBcC+a5pZoODvVZx55jv2HJovO0a/NeaeO34/rULLB8IvA3oh4orq/CfjsdAuWbDDcq6a5\npe0/NNmT9ej356pfX+9iDYYjYh+wV9Ly6k+rgd1zqNHMZlD3qOk6YGN1/YtngVvKlWTWPnUbDO8C\n/qhwLWat5U/WmCXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAg\nmiXgIJol4CCaJVDr+4iSngcOASeB1yLi6pJFmbVN3W/onwTeGxEHSxZj1lZ1d001i2XNbJbqhiuA\nhyU9LunWkgWZtVHdXdNVEfGypMV0AjkRET8uWZhZm9RtHvVy9fuApM3A1cAZQez3BsODg4OsHRsv\nPkcv1qMfm/NOHb8f16FYg2FJw8BARExKWgR8ELhrumXnQ4Nhz1F/jpLa1mC4zhbxImCzpKiW3xgR\nW+ZSpJlNr2sQI+I5YEUPajFrLZ+SMEvAQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEvAQTRLwEE0S8BB\nNEvAQTRLwEE0S8BBNEvAQTRLwEE0S8BBNEugdhAlDUjaLumhkgWZtdFstoi3AbtLFWLWZrWCKGkp\ncAPw1bLlmLVT3S3iV4BP02k0bGYN6xpESR8G9kXETjqt98v20TNroTrtFFcBN0q6ARgCfkfSfRFx\n89QF50OD4V40tZ0P61G6GXO/Nkku1mA4Iu4A7gCQdB3wt9OFEOZHg+ENa64oOkcvrB0b7/smxv3a\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": "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\nQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def maze1():\n", + " return Maze([\n", + " \"########\",\n", + " \"#X.#...#\",\n", + " \"#.##.#.#\",\n", + " \"#.#..#.#\",\n", + " \"#....#.#\",\n", + " \"#.##...#\",\n", + " \"#..#..##\",\n", + " \"##.#..@#\",\n", + " \"########\"\n", + " ])\n", + "\n", + "maze1().draw()\n", + "\n", + "def maze2():\n", + " return Maze([\n", + " \"###############\",\n", + " \"#X#@.#.#...#..#\",\n", + " \"#.##.....#....#\",\n", + " \"#.#.#.#..#..#.#\",\n", + " \"#...#.#....#..#\",\n", + " \"#.#.#.........#\",\n", + " \"#.#.##.#..#...#\",\n", + " \"#.....#..#..#.#\",\n", + " \"#####...#.....#\",\n", + " \"########...####\",\n", + " \"###############\"\n", + " ])\n", + "\n", + "maze2().draw()\n", + "\n", + "def mazeUnsolvable1():\n", + " return Maze([\n", + " \"###############\",\n", + " \"#X#@.#.#...#..#\",\n", + " \"#.##.....#....#\",\n", + " \"#.#.#.#..#..#.#\",\n", + " \"#.#.#.#....#..#\",\n", + " \"#..##...#.....#\",\n", + " \"#.#.##....#...#\",\n", + " \"#.#...#..#..#.#\",\n", + " \"#####...#.....#\",\n", + " \"########...####\",\n", + " \"###############\"\n", + " ])\n", + "\n", + "mazeUnsolvable1().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Maze 1:\n", + "[(5, 1), (5, 2), (5, 3), (4, 3), (4, 4), (3, 4), (2, 4), (1, 4), (1, 5), (1, 6), (1, 7)]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOIAAAEACAYAAACu66rqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADkRJREFUeJzt3X+MHHd5x/H35+LEd+erTxTslGJiEiErAQU5kRsiTAjU\nQEOogrBUQUCKHKH0j1I5ojUQ8g/JH60ECNFIrVRFQExSQ6u4tpKKijokAoSrhsS/csTn0OZH44TE\nNsLYOvtsYvvpHzuuzPnOO3ee7+a5m89LOt3uafb7fWbXH8/szO4zigjM7PXV93oXYGYOolkKDqJZ\nAg6iWQIOolkCDqJZArWCKOl2SSPVz9rSRZm1TdcgSnon8BlgBbAc+FNJl5UuzKxN6mwRrwAej4jj\nEXES+AmwumxZZu1SJ4g/B66T9AZJg8CNwFvLlmXWLvO6LRAReyR9BXgEGAN2ACdLF2bWJpruZ00l\n/Q2wNyL+ccLf/aFVs0lEhLot03WLCCBpUUQckHQJ8HHg2smWW7/6yulVOA2bd+/j4++4uNj4niPX\nHHNhHQDWbBqptVytIAL/Kun3gdeAv4iIwzMtzMzOViuIEfG+0oWYtdms+WTN5YsWeI4WzTEX1mE6\npn2wZsqBpCj5HtFsNlqzaaTWwZpZs0U0m8scRLMEHESzBBxEswQcRLMEHESzBBxEswQcRLMEHESz\nBBxEswQcRLMEHESzBBxEswQcRLME6jYY/pKkpyU9JWmDpItKF2bWJnUaDC8FbgOuioh30flW/ydL\nF2bWJnVaZRwGfgsskHQKGAR+WbQqs5bpukWMiIPA14EXgZeB30TED0sXZtYmXbeI1XUuPgcsBQ4B\nGyV9KiK+O3HZzbv3/f/tyxct4IpFQ40VuvY/Rjl85ERj401moL+f8WPHis6xeHiIr666tOgcX3j0\nefYfGis6x8BAP+Pj5Z6r0uNDmddi9MAYew4cmfbj6uyargC2RsSvASRtAt4DnBXEkj0iDx85AXcV\nGx6A8buO0VQPn6lIXduXnLf9h8Z6sh4l5yg9/uk5mnbFoqHf2QA9tGd/rcfVOWr6DHCtpH51Kl8F\njM6kSDObXJ33iLuA+4FtwC5AwL2F6zJrlboNhr8GfK1wLWat5U/WmCXgIJol4CCaJeAgmiXgIJol\n4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiVQp6/pMkk7JG2vfh+S\ntLYXxZm1Rddv6EfEL4CrACT1AS8BmwvXZdYq0901/SDwbETsLVGMWVtNN4ifAL5XohCzNqvVPApA\n0oXATcAdUy1TssGwLoS4q7HhJjW/f37xvqOLh5t7TqYyMNBffD36+8vOUXp86DxPTSvZYPi0jwDb\nIuLAVAuUbDAcrwGFG84el1i/+sqic/TC+HhvGiWXfK7WbBpxg+Ep3Ix3S82KqHt9xEE6B2o2lS3H\nrJ3qNhg+CiwqXItZa/mTNWYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhm\nCTiIZgk4iGYJOIhmCTiIZgk4iGYJ1P2G/rCkByWNSnpa0rtLF2bWJnWbR90D/HtE/JmkecBgwZrM\nWqdrECUtBK6LiDUAEXECOFy4LrNWqbNreinwK0n3Vde/uFfSQOnCzNqkzq7pPOBq4LMR8aSkv6PT\nZPjLExcs2mB4oJ8o3HBWBRrOTvSFR59n/6GxonPM1ua8E8efjetQssHwS8DeiHiyur8R+OJkCxZt\nMDx+rHiD4dJBB9h/aKwnjXNnY3PeM/WqSXLTijUYjoh9wF5Jy6o/rQJ2z6BGM5tC3aOma4EN1fUv\nngNuLVeSWfvUbTC8C/ijwrWYtZY/WWOWgINoloCDaJaAg2iWgINoloCDaJaAg2iWgINoloCDaJaA\ng2iWgINoloCDaJaAg2iWgINoloCDaJZAre8jSnoBOAScAl6LiGtKFmXWNnW/oX8KeH9EHCxZjFlb\n1d011TSWNbNpqhuuAB6R9ISk20oWZNZGdXdNV0bEK5IW0QnkaET8tGRhZm1St3nUK9XvA5I2A9cA\nZwVxtjcYpr+fNZtGik4xvwfNf91guP4cTSvWYFjSINAXEWOSFgAfBu6ebNnZ3mAYqfgcx3swx7Ee\nzDHuBsOTmmmD4TpbxIuBzZKiWn5DRGyZSZFmNrmuQYyI54HlPajFrLV8SsIsAQfRLAEH0SwBB9Es\nAQfRLAEH0SwBB9EsAQfRLAEH0SwBB9EsAQfRLAEH0SwBB9EsAQfRLAEH0SwBB9EsgdpBlNQnabuk\nh0sWZNZG09ki3g7sLlWIWZvVCqKkJcCNwDfLlmPWTnW3iN8APk+n0bCZNaxrECV9FNgXETvptN4v\n3FzUrH3qtFNcCdwk6UZgAPg9SfdHxC0TF5wLDYYpPMdcWY/SzZhna5PkYg2GI+JO4E4ASdcDfz1Z\nCKF8g+FeNJxdv/rKonP0wppNIz1pxlzy9VDh8U/P0bSZNhj2eUSzBOpehAaAiPgx8ONCtZi1lreI\nZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhm\nCTiIZgl0/WKwpPnAT4CLqp+HqvYZZtaQOj1rjkv6QEQclXQBsFXSyojY2oP6zFqh1q5pRBytbs6v\nHnOwWEVmLVS303efpB3Aq8CPIsKt980aVKt5VEScAq6StBDYIun6qpHU7yjZ13RgoHyfy/7CvToB\nFg8P8dVVlxadoxe9U+cX7jvai76mi4eb+/d5WrG+pmeKiMOSvg+sYJJubiX7mo73qK/pbOylOVGM\nHyve1/R4D/qazsYes8X6mkp6k6Th6vYA8CFg58zKNLPJ1Nkivhn4jjr/lfcBD0TEo2XLMmuXOqcv\nRoCre1CLWWv5kzVmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJOIhmCTiIZgk4iGYJ\nOIhmCTiIZgk4iGYJOIhmCdRplbFE0mOSnpY0ImltLwoza5M6rTJOAH8VETslDQHbJG2JiD2FazNr\nja5bxIh4NSJ2VrfHgFHgLaULM2uTab1HlPQ2YDnweIlizNqqdl/Tard0I3B7tWU8S8kGw4uHh3rS\nYLj0HAMD/UXHh7nRYHjdunW8MNR8A+AzHT1yhHc8+4NGxyzaYFjSPDohfCAiHppquZINhkt3xwZY\ns2nEDYZrOi4VnWPo7ruLjX3a4IIFjY9ZrMFw5dvA7oi4Z/qlmVk3dU5frAQ+DfyxpB2Stku6oXxp\nZu1Rp8HwVuCCHtRi1lr+ZI1ZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6iWQIOolkCDqJZAg6i\nWQIOolkCDqJZAg6iWQIOolkCDqJZAnW+of8tSfskPdWLgszaqM4W8T7gT0oXYtZmdRoM/xQ42INa\nzFrL7xHNEqjdYLiOkg2Ge6EXTYwXD5d/ThYOD3G48HqUbmI8tm4dQz1oMNy0mTYYVp2GupKWAv8W\nEe86xzKxfvWV0y7AbC6rmlZ3/R+r7q6pqh8zK6DO6YvvAv8JLJP0oqRby5dl1i51Ggx/qheFmLWZ\nj5qaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXgIJol4CCaJeAgmiXg\nIJolUCuIkm6QtEfSLyR9sXRRZm1T5xv6fcDf0+lt+k7gZkmXly5sotEDY56jRXPMhXWYjjpbxGuA\n/46I/42I14B/Bj5WtqyzzaQzlueYvXPMhXWYjjpBfAuw94z7L1V/M7OG+GCNWQJd+5pKuha4KyJu\nqO7fAUREfGXCct0bpJq1UJ2+pnWCeAHwDLAKeAX4GXBzRIw2UaSZ1WuneFLSXwJb6OzKfsshNGtW\nrZb7ZlbWeR+sKX2yvxcXSpW0RNJjkp6WNCJpbYE55kt6XNKOap6/bXqOap4+SdslPVxo/Bck7arW\n42eF5hiW9KCk0eq5enfD4y+r6t9e/T7U9Gsu6UtV7U9J2iDponM+ICJm/EMnyP8DLAUuBHYCl5/P\nmJPM8V5gOfBUk+NOmOMPgOXV7SE674kbXY9q7MHq9wXAfwErC8zxOeCfgIcLPVfPAW8o9VpUc6wH\nbq1uzwMWFpyrD/gl8NYGx1xaPU8XVff/BbjlXI853y1i8ZP90YMLpUbEqxGxs7o9BoxS4FxpRByt\nbs6n8w+g0fWStAS4Efhmk+NOnIaCp70kLQSui4j7ACLiREQcLjUf8EHg2YjY23XJ+g4DvwUWSJoH\nDNIJ+5TO9wmdcyf7Jb2Nzhb48QJj90naAbwK/Cgidjc8xTeAzwMl3/gH8IikJyTdVmD8S4FfSbqv\n2nW8V9JAgXlO+wTwvSYHjIiDwNeBF4GXgd9ExA/P9Rif0D+DpCFgI3B7tWVsVEScioirgCXA+yRd\n39TYkj4K7Ku27CUvo7cyIq6ms+X9rKT3Njz+POBq4B+qeY4CdzQ8BwCSLgRuAh5seNzL6LxFWAr8\nITAk6ZwXczrfIL4MXHLG/SXV32adahdiI/BARDxUcq5qV+v7wIoGh10J3CTpOTr/w39A0v0Njg9A\nRLxS/T4AbKbz9qRJLwF7I+LJ6v5GOsEs4SPAtmpdmrQC2BoRv46Ik8Am4D3nesD5BvEJ4O2SllZH\nhT4JlDha14sLpX4b2B0R95QYXNKbJA1XtweAD9E5uNWIiLgzIi6JiMvovA6PRcQtTY0PIGmw2mtA\n0gLgw8DPm5wjIvYBeyUtq/60Cmh6F/60m2l4t7TyDHCtpH51rgW/is5xhyl1PaF/LtGDk/3VhVLf\nD7xR0ovAl0+/kW9wjpXAp4GR6j1cAHdGxA8anObNwHeqF6aPzpb30QbH74WLgc3VxxnnARsiYkuB\nedYCG6pdx+eAxi+OK2mQzoGaP2967IjYVe2NbANOAjuAe89ZT3V41cxeRz5YY5aAg2iWgINoloCD\naJaAg2iWgINoloCDaJaAg2iWwP8BoEdmpOhzTLEAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Maze 2:\n", + "[(4, 9), (4, 8), (5, 8), (6, 8), (7, 8), (7, 7), (8, 7), (8, 6), (8, 5), (8, 4), (8, 3), (7, 3), (7, 2), (6, 2), (5, 2), (5, 3), (4, 3), (3, 3), (3, 4), (3, 5), (3, 6), (2, 6), (1, 6), (1, 7), (1, 8), (1, 9)]\n" + ] + }, + { + "data": { + "image/png": "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\nz6ODSY77RwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Unsolvable maze:\n", + "Unsolvable\n" + ] + } + ], + "source": [ + "print(\"Maze 1:\")\n", + "print(heuristic(maze1()))\n", + "m1 = maze1()\n", + "m1.paint(heuristic(m1))\n", + "m1.draw()\n", + "print(\"Maze 2:\")\n", + "print(heuristic(maze2()))\n", + "m2 = maze2()\n", + "m2.paint(heuristic(m2))\n", + "m2.draw()\n", + "print(\"Unsolvable maze:\")\n", + "print(heuristic(mazeUnsolvable1()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You also have to be able to handle switch and door puzzles:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "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" + } + ], + "source": [ + "def maze3():\n", + " return Maze([\n", + " \"###############\",\n", + " \"#X#@.#.#...#.1#\",\n", + " \"#.##.....#....#\",\n", + " \"#A#.#.#..#..#.#\",\n", + " \"#.a.#C#....#..#\",\n", + " \"#.#.#0C.......#\",\n", + " \"#.#.##.#..#...#\",\n", + " \"#.B...#.2#..#.#\",\n", + " \"#####...#.....#\",\n", + " \"########...####\",\n", + " \"###############\"\n", + " ])\n", + "\n", + "maze3().draw()\n", + "\n", + "def maze4():\n", + " return Maze([\n", + " \"########\",\n", + " \"#@0#.01#\",\n", + " \"#A1#C#a#\",\n", + " \"#0#..#.#\",\n", + " \"#aBc2#.#\",\n", + " \"#B##c..#\",\n", + " \"#..#bb##\",\n", + " \"##1#..X#\",\n", + " \"########\"\n", + " ])\n", + "\n", + "maze4().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Maze 3:\n", + "[(4, 9), (4, 8), (5, 8), (6, 8), (7, 8), (8, 8), (8, 9), (9, 9), (10, 9), (10, 8), (11, 8), (12, 8), (12, 9), (13, 9), 'switch', (12, 9), (12, 8), (11, 8), (10, 8), (10, 7), (10, 6), (9, 6), (8, 6), (8, 5), (8, 4), (8, 3), 'switch', (8, 4), (8, 5), (7, 5), (6, 5), (5, 5), 'switch', (6, 5), (7, 5), (8, 5), (8, 4), (8, 3), (7, 3), (7, 2), (6, 2), (5, 2), (5, 3), (4, 3), (3, 3), (2, 3), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9)]\n" + ] + }, + { + "data": { + "image/png": "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\n3Ltn4ujhjSOrNDoy3HSzaGC5zoGqff5O7fWGhsrWa6Pm2jXNsmVsclrjkwdO6LxuMj/E9gpJ/yLp\n/oi4dYHzROnZMcCvqvS8Ian+GUFuYW7TctO738yb7k13278sac9CwQkAr1VNPqp0oaT3S3qX7R/Y\nfsL25nKtAUC90q95RsSjkk4u2AsADAy+YQQACYQnACQQngCQQHgCQALhCQAJhCcAJBCeAJBAeAJA\nAuEJAAmEJwAkEJ4AkEB4AkAC4QkACYQnACQQngCQQHgCQELjAXDAIFi7Zrj64WW1DUPD4ghPLAs3\nb9rQ7xbwGsNuOwAkEJ4AkEB4AkAC4QkACYQnACQQngCQQHgCQALhCQAJhCcAJBCeAJBAeAJAAuEJ\nAAmEJwAkNApP25ttj9v+b9ufKtUUANQuHZ62T5L0d5IulnSOpPfZ3liqsaU0Njnd7xYWVXt/Uv09\n1t6fVH+PtfcnLW2PTVaevyvp6Yj4UUS8LOlrki4r09bSGp880O8WFlV7f1L9Pdben1R/j7X3Jy1t\nj03C8w2Snpt1/PneaQDwmscbRgCQ4IjI/aF9gaQbI2Jz7/i1kiIiPjvnfLkNAEAFImLewVJNwvNk\nSXslbZL0v5L+Q9L7ImIs2yQADIr0ALiI+KXtP5P0oLq7/18iOAEsF+mVJwAsZ629YVT7B+htr7f9\niO2nbO+2vbXfPc3H9km2n7B9X797mY/tNba/bnusd12+vd89zWX7ul5vT9q+2/brKujpS7YnbD85\n67TX237Q9l7bD9heU1l/N/du5522/9n26n71t1CPs/7v47Zfsf3rbW2/lfAckA/QH5b0sYg4R9Lv\nSfpIhT1K0jWS9vS7iUXcKunbETEq6bclVfXSje3TJX1I0nkR8VZ1X6q6sr9dSZLuUPfxMdu1kh6K\niDdLekTSdUve1f+br78HJZ0TEedKelr97U+av0fZXi/pIkk/anPjba08q/8AfUS8GBE7e4en1X3Q\nV/U51d6d4N2SvtjvXubTW3m8MyLukKSIOBwRU31ua64pSb+QtMr2CkmnSvpxf1uSIuK7kl6ac/Jl\nku7sHb5T0uVL2tQs8/UXEQ9FxCu9o/8uaf2SN3ZsP/Ndh5L0BUmfaHv7bYXnQH2A3vYZks6V9P3+\ndvIqR+4Etb4wvUHST2zf0Xtp4XbbQ/1uaraIeEnS5yU9K+kFST+LiIf629WC1kbEhNR9cpe0ts/9\nLOZPJd3f7ybmsn2ppOciYnfb21r2H5K3PSxpm6RreivQKti+RNJEb3Xs3r/arJB0vqS/j4jzJf1c\n3V3Patg+U9JHJZ0u6TckDdu+qr9dnbAqnzRt/7mklyPinn73Mlvvift6STfMPrmt7bUVni9IeuOs\n4+t7p1Wltxu3TdJXI2JHv/uZ40JJl9r+oaR/kvQHtu/qc09zPa/us/xjvePb1A3TmrxN0qMR8dOI\n+KWk7ZLe0eeeFjJhe50k2T5N0r4+9/Mqtreo+1JSjU9Ab5J0hqRdtp9RN3cet93KCr6t8PxPSb9p\n+/TeO5tXSqrx3eIvS9oTEbf2u5G5IuL6iHhjRJyp7vX3SER8oN99zdbbxXzO9lm9kzapvje39kq6\nwHbHttXtsZY3tebuUdwnaUvv8Acl9fsJ/Zj+bG9W92WkSyPiUN+6OtbRHiPivyLitIg4MyI2qPvk\nfl5EtPIk1Ep49p7hj3yA/ilJX6vtA/S2L5T0fknvsv2D3mt2m/vd1wDaKulu2zvVfbf9M33u5xgR\nsUvSXZIel7RL3Qfa7X1tSpLteyR9T9JZtp+1fbWkmyRdZPvIN/duqqy/v5U0LOnfeo+Xf+hXf4v0\nOFuoxd12PiQPAAnL/g0jAMggPAEggfAEgATCEwASCE8ASCA8ASCB8ASABMITABL+D5gio8107fZS\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Maze 4:\n", + "[(2, 7), 'switch', (2, 6), 'switch', (1, 6), (1, 5), 'switch', (1, 4), (2, 4), (3, 4), (4, 4), 'switch', (4, 5), (4, 6), (4, 7), (5, 7), (6, 7), 'switch', (6, 6), (6, 5), (6, 4), (6, 3), (5, 3), (5, 2), (5, 1), (6, 1)]\n" + ] + }, + { + "data": { + "image/png": "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\nS/Q+GxnJYQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(\"Maze 3:\")\n", + "print(heuristic(maze3()))\n", + "m3 = maze3()\n", + "m3.paint(heuristic(m3))\n", + "m3.draw()\n", + "print(\"Maze 4:\")\n", + "print(heuristic(maze4()))\n", + "m4 = maze4()\n", + "m4.paint(heuristic(m4))\n", + "m4.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 2\n", + "\n", + "Once you have this working, write an agent which finds a policy for a \"blind\" puzzle using MCTS. \"Blind\" puzzles are just like the puzzles above, only (a) you don't get to see the whole puzzle or know the goal states in advance, and (b) some nodes are trap doors with a chance of dropping the player into a bottomless pit! Try different policies for deciding between exploit/explore and for doing rollouts and compare them. Plot graphs on how learning improves with more rollouts.\n", + "\n", + "Of course, it should also be able to solve the earlier maze puzzles!" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class TreeNode:\n", + " def __init__(self, maze):\n", + " self.maze = maze\n", + " self.reward = None\n", + " self.moves = 0\n", + " self.action = (None,None)\n", + " self.children = []\n", + " self.parent = None\n", + " self.untried_actions = self.maze.available_moves()\n", + " \n", + " def add_child(self, tn):\n", + " self.children.append(tn)\n", + " tn.parent = self\n", + " \n", + "def expand(tn):\n", + " action = random.choice(tn.untried_actions)\n", + " tn.untried_actions.remove(action)\n", + " m = tn.maze.clone()\n", + " if action == \"switch\":\n", + " m.toggle()\n", + " else:\n", + " m.move_player(action[0],action[1])\n", + " return m\n", + " \n", + "def tree_policy(tn):\n", + " if tn.untried_actions:\n", + " child = TreeNode(expand(tn))\n", + " tn.add_child(child)\n", + " return child\n", + " else:\n", + " #implement best_child here and fix the code below to work with it\n", + " child.maze = expand(tn)\n", + " for c in tn.children:\n", + " if c.maze == m:\n", + " return tree_policy(c)\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", + " # Should also return the best found path (the one most likely to lead to success).\n", + " # 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", + " # 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", + "\n", + " \n", + " \n", + " #return ([], 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false, + "scrolled": 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" + } + ], + "source": [ + "def maze5():\n", + " return Maze([\n", + " \"#######\",\n", + " \"#@???X#\",\n", + " \"#.....#\",\n", + " \"#######\"\n", + " ])\n", + "\n", + "maze5().draw()\n", + "\n", + "def maze6():\n", + " return Maze([\n", + " \"#######\",\n", + " \"#@?!?X#\",\n", + " \"#.???.#\",\n", + " \"#.....#\",\n", + " \"#######\"\n", + " ])\n", + "\n", + "maze6().draw()\n", + "\n", + "def maze7():\n", + " return Maze([\n", + " \"########\",\n", + " \"#@0#?01#\",\n", + " \"#A1#C#a#\",\n", + " \"#0#.?#!#\",\n", + " \"#aBc2#.#\",\n", + " \"#B##c.?#\",\n", + " \"#.!#bb##\",\n", + " \"##1#.?X#\",\n", + " \"########\"\n", + " ])\n", + "\n", + "maze7().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Maze 5:\n" + ] + } + ], + "source": [ + "print(\"Maze 5:\")\n", + "print(mcts(maze5(),500))\n", + "#print(\"Maze 6:\")\n", + "#print(mcts(maze6(),500))\n", + "#print(\"Maze 7:\")\n", + "#print(mcts(maze7(),1000000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Assignment 3\n", + "\n", + "Do assignment 2 again, but with reinforcement learning! Compare various approaches and parameters (e.g.\\ different discounting rates, Sarsa vs Q-learning, etc) against your MCTS agents in terms of iterations required to reach certain levels of performance. Plot graphs showing how learning improves with more iterations. Print or draw out (at least some of) the state-value or action-value matrix.\n", + "\n", + "Read as much as you care to of Sutton & Barto---[section 2](https://webdocs.cs.ualberta.ca/~sutton/book/ebook/node39.html) is especially useful.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def rl(maze,iterations):\n", + " # Return the best path (most likely to lead to success) along with its expected value and a validated value\n", + " # for a budget of `iterations` experiments.\n", + " # As above, 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", + " # After training for `iterations` experiments, 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", + "\n", + " return ([],0,0)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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 +} diff --git a/projects/3-mazes/Maze Solvers.ipynb b/projects/3-mazes/Maze Solvers.ipynb index 96f4aee..bab35bc 100644 --- a/projects/3-mazes/Maze Solvers.ipynb +++ b/projects/3-mazes/Maze Solvers.ipynb @@ -9,7 +9,11 @@ }, { "cell_type": "code", +<<<<<<< HEAD + "execution_count": 3, +======= "execution_count": null, +>>>>>>> cdd4ae825a1a875051c03b2e0291b67e78280b4d "metadata": { "collapsed": false }, @@ -39,11 +43,37 @@ }, { "cell_type": "code", +<<<<<<< HEAD + "execution_count": 4, + "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": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], +======= "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], +>>>>>>> cdd4ae825a1a875051c03b2e0291b67e78280b4d "source": [ "@functools.total_ordering\n", "class Maze:\n", @@ -229,16 +259,56 @@ "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", + " \n", " return []" ] }, { "cell_type": "code", +<<<<<<< HEAD + "execution_count": 5, + "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": "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\nQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], +======= "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], +>>>>>>> cdd4ae825a1a875051c03b2e0291b67e78280b4d "source": [ "def maze1():\n", " return Maze([\n", @@ -292,11 +362,31 @@ }, { "cell_type": "code", +<<<<<<< HEAD + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'heuristic' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\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;31mNameError\u001b[0m: name 'heuristic' is not defined" + ] + } + ], +======= "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], +>>>>>>> cdd4ae825a1a875051c03b2e0291b67e78280b4d "source": [ "print(heuristic(maze1()))\n", "print(heuristic(maze2()))\n", @@ -312,11 +402,40 @@ }, { "cell_type": "code", +<<<<<<< HEAD + "execution_count": 7, + "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" + } + ], +======= "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], +>>>>>>> cdd4ae825a1a875051c03b2e0291b67e78280b4d "source": [ "def maze3():\n", " return Maze([\n", @@ -353,11 +472,31 @@ }, { "cell_type": "code", +<<<<<<< HEAD + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'heuristic' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\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;31mNameError\u001b[0m: name 'heuristic' is not defined" + ] + } + ], +======= "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], +>>>>>>> cdd4ae825a1a875051c03b2e0291b67e78280b4d "source": [ "print(heuristic(maze3()))\n", "print(heuristic(maze4()))" @@ -499,7 +638,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/projects/5-emojiworld/Deitelzweig.json b/projects/5-emojiworld/Deitelzweig.json new file mode 100644 index 0000000..e6e8eb1 --- /dev/null +++ b/projects/5-emojiworld/Deitelzweig.json @@ -0,0 +1 @@ + {"meta":{"description":"The hungry man wants some grapes. Click to place him and watch him eat.","draw":1,"fps":60,"play":true},"states":[{"actions":[{"actions":[{"actions":[{"stateID":"2","type":"go_to_state","actions":[]}],"num":1,"sign":">=","stateID":"2","type":"if_neighbor"}],"probability":0.0025,"type":"if_random"}],"description":"","icon":"","id":0,"name":"empty spot"},{"actions":[{"leaveStateID":"3","space":0,"spotStateID":0,"type":"move_to","actions":[]}],"description":"He eats","icon":"😀","id":1,"name":"Hungry Man"},{"actions":[{"actions":[{"stateID":0,"type":"go_to_state","actions":[]}],"num":1,"sign":">=","stateID":"1","type":"if_neighbor"}],"description":"Gets eaten","icon":"🍇","id":2,"name":"Food"},{"actions":[{"actions":[{"stateID":0,"type":"go_to_state","actions":[]}],"probability":0.2,"type":"if_random"}],"description":"Ew","icon":"💩","id":3,"name":"Poop"}],"world":{"neighborhood":"moore","proportions":[{"stateID":0,"parts":0},{"stateID":1,"parts":0},{"stateID":2,"parts":100},{"stateID":3,"parts":0}],"size":{"height":33,"width":40},"update":"simultaneous"}} \ No newline at end of file diff --git a/projects/6-perceptron/Deitelzweig.ipynb b/projects/6-perceptron/Deitelzweig.ipynb new file mode 100644 index 0000000..c43c568 --- /dev/null +++ b/projects/6-perceptron/Deitelzweig.ipynb @@ -0,0 +1,306 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "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": 2, + "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": 14, + "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", + " # update each weight according to the perceptron update rule\n", + " activation = np.dot(weights, example)\n", + " predicted = 1 if activation >= 0 else 0\n", + " error = actual - predicted\n", + " for i in range(0, len(weights)):\n", + " weights[i] += example[i] * error\n", + " errors.append(error)\n", + " return (errors,weights)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAD0BJREFUeJzt3H+I3Hedx/Hnq8Z6NVcLbTFgYnt3jbEg1iiaBCzc1Mq5\nFSTSf2zrVRSVwF1U8A9TK22Xlqj548BrRSVeKMgpEaxwuTuLFekivWtihG6qZ5JNqtQm1Xj1R429\n9EjD+/7YuXS7ZjOzu7Oz2U+eDxjY78xnv/Pmy+4z33xnZlNVSJLadMFiDyBJWjhGXpIaZuQlqWFG\nXpIaZuQlqWFGXpIa1jPySXYkOZbk8bOsuTfJoSTjSdYOdkRJ0lz1cyZ/P/CumR5McgNwVVW9DtgE\nfGVAs0mS5qln5KvqEeB3Z1myEfhad+0e4JIkKwYzniRpPgZxTX4l8NSU7aPd+yRJi8wXXiWpYcsG\nsI+jwGunbK/q3vcnkviHciRpDqoqc/m+fs/k072dyS7gAwBJNgC/r6pjM+2oZrg9sHw54+PjVNV5\ncbvrrrsWfYZz5eax8Fic78fiscce45V/+0oY5cy3eeh5Jp/kG0AHuCzJL4C7gAuBqqrtVfWdJO9O\nchh4DvjQXAZ5bOVKblizZi7fKklL2utf/3pW/c8qJpgY+L57Rr6qbuljzeb5DPEH4OUbNnDRRRfN\nZzeStCRddNFFrH/teib+dwJeMdh9nxMvvP7TihW8/447FnuMoep0Oos9wjnDY/Eij8WLzrdjcefm\nO1lxcPDvPk/V8F4LTfInz7brVa/iv7ds4cO33z60OSTpXLT1H7eybXwbx//i+EsfGF34F14H7g/A\nP6xYYeAlqeszn/gMt629jRWPr4DnB7PPoZ/JP7B8OeOrVvHy9eu55Y47uGr16qE9vyQtBYcPH+ae\nL97D7l/s5ujyozz3z8/N+Ux+6JEfHx9nzZo1vsgqST2cOHGCiYkJ1q5du3QiP8znk6QWJFl61+Ql\nSQvPyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXM\nyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtS\nw4y8JDXMyEtSw4y8JDXMyEtSw/qKfJKRJAeSTCTZcobHL0vyYJLxJD9O8sGBTypJmrVU1dkXJBcA\nE8D1wNPAXuCmqjowZc1dwJ9V1aeTXA4cBFZU1QvT9lW9nk+S9FJJqKrM5Xv7OZNfBxyqqier6iSw\nE9g4bc2vgIu7X18M/GZ64CVJw7esjzUrgaembB9hMvxTfRX4fpKngT8H3jeY8SRJ89FP5PvxaWBf\nVV2X5Crge0muqao/Tl84Ojp6+utOp0On0xnQCJLUhrGxMcbGxgayr36uyW8ARqtqpLt9G1BVtW3K\nmu8AW6vqP7rb3we2VNWPpu3La/KSNEsLfU1+L7A6yZVJLgRuAnZNW7MfeGd3mBXAGuBncxlIkjQ4\nPS/XVNWpJJuBh5j8R2FHVe1Psmny4doOfA64P8k+IMCnquq3Czm4JKm3npdrBvpkXq6RpFlb6Ms1\nkqQlyshLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1\nzMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhL\nUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1rK/IJxlJciDJRJItM6zp\nJHksyU+SPDzYMSVJc5GqOvuC5AJgArgeeBrYC9xUVQemrLkE+E/gb6rqaJLLq+qZM+yrej2fJOml\nklBVmcv39nMmvw44VFVPVtVJYCewcdqaW4AHquoowJkCL0kavn4ivxJ4asr2ke59U60BLk3ycJK9\nSW4d1ICSpLlbNsD9vAV4B7AceDTJo1V1eED7lyTNQT+RPwpcMWV7Vfe+qY4Az1TV88DzSX4AvAn4\nk8iPjo6e/rrT6dDpdGY3sSQ1bmxsjLGxsYHsq58XXl8GHGTyhddfAj8Ebq6q/VPWXA3cB4wArwD2\nAO+rqp9O25cvvErSLM3nhdeeZ/JVdSrJZuAhJq/h76iq/Uk2TT5c26vqQJLvAo8Dp4Dt0wMvSRq+\nnmfyA30yz+QladYW+i2UkqQlyshLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhL\nUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOM\nvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1\nzMhLUsP6inySkSQHkkwk2XKWdW9LcjLJjYMbUZI0Vz0jn+QC4IvAu4A3ADcnuXqGdZ8HvjvoISVJ\nc9PPmfw64FBVPVlVJ4GdwMYzrPsY8C3g1wOcT5I0D/1EfiXw1JTtI937TkvyGuC9VfVlIIMbT5I0\nH4N64fULwNRr9YZeks4By/pYcxS4Ysr2qu59U70V2JkkwOXADUlOVtWu6TsbHR09/XWn06HT6cxy\nZElq29jYGGNjYwPZV6rq7AuSlwEHgeuBXwI/BG6uqv0zrL8f+Neq+vYZHqtezydJeqkkVNWcrpD0\nPJOvqlNJNgMPMXl5Z0dV7U+yafLh2j79W+YyiCRp8HqeyQ/0yTyTl6RZm8+ZvJ94laSGGXlJapiR\nl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SG\nGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJ\napiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJalhfkU8ykuRAkokkW87w+C1J9nVv\njyR54+BHlSTNVqrq7AuSC4AJ4HrgaWAvcFNVHZiyZgOwv6qeTTICjFbVhjPsq3o9nyTppZJQVZnL\n9/ZzJr8OOFRVT1bVSWAnsHHqgqraXVXPdjd3AyvnMowkabD6ifxK4Kkp20c4e8Q/Ajw4n6EkSYOx\nbJA7S3Id8CHg2pnWjI6Onv660+nQ6XQGOYIkLXljY2OMjY0NZF/9XJPfwOQ19pHu9m1AVdW2aeuu\nAR4ARqrqiRn25TV5SZqlhb4mvxdYneTKJBcCNwG7pg1wBZOBv3WmwEuShq/n5ZqqOpVkM/AQk/8o\n7Kiq/Uk2TT5c24E7gEuBLyUJcLKq1i3k4JKk3nperhnok3m5RpJmbaEv10iSligjL0kNM/KS1DAj\nL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kN\nM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS1DAjL0kNM/KS\n1DAjL0kNM/KS1DAjL0kNG3rkx8fHOXHixLCfVpKWnBMnTjA+Pj6vfSwb0Cx9+/nb3863V61i2fr1\nvP/OO7lq9ephjyBJ57QnDh/m63ffzQt79vDmI0fmta9U1YDG6uPJktPPdhz46ooVXPLxj/Ph228f\n2gySdC7bsXUrz953Hx89doyLu/cFqKrMZX99Xa5JMpLkQJKJJFtmWHNvkkNJxpOs7bXPi4FPHjvG\nqz//eXZ89rOzHFuS2rNj61ZevW0bn5wS+PnqGfkkFwBfBN4FvAG4OcnV09bcAFxVVa8DNgFf6XeA\n9xw/zrP33ssThw/PavClbmxsbLFHOGd4LF7ksXjR+XYsnjh8mGfvu4/3HD8+0P32cya/DjhUVU9W\n1UlgJ7Bx2pqNwNcAqmoPcEmSFf0O8ZFjx/j6Pff0u7wJ59sP8Nl4LF7ksXjR+XYsvn733Xz02LGB\n77efyK8EnpqyfaR739nWHD3Dmhm9Cji5e7fvupF0Xjpx4gQv7NkzsEs0U50z75N/89GjTExMLPYY\nkjR0Bw8enPe7aGbS8901STYAo1U10t2+Daiq2jZlzVeAh6vqm93tA8BfV9Wxafsa3lt5JKkhc313\nTT/vk98LrE5yJfBL4Cbg5mlrdgF/D3yz+4/C76cHfj5DSpLmpmfkq+pUks3AQ0xe3tlRVfuTbJp8\nuLZX1XeSvDvJYeA54EMLO7YkqR9D/TCUJGm4FuSF14X48NRS1etYJLklyb7u7ZEkb1yMOYehn5+L\n7rq3JTmZ5MZhzjdMff6OdJI8luQnSR4e9ozD0sfvyGVJHuy24sdJPrgIYy64JDuSHEvy+FnWzL6b\nVTXQG5P/cBwGrgReDowDV09bcwPw792v1wO7Bz3HuXDr81hsAC7pfj1yPh+LKeu+D/wbcONiz72I\nPxeXAP8FrOxuX77Ycy/isbgL+Nz/HwfgN8CyxZ59AY7FtcBa4PEZHp9TNxfiTH7BPzy1hPQ8FlW1\nu6qe7W7uZhafL1hi+vm5APgY8C3g18Mcbsj6ORa3AA9U1VGAqnpmyDMOSz/H4ldw+i3kFwO/qaoX\nhjjjUFTVI8DvzrJkTt1ciMgv+IenlpB+jsVUHwEeXNCJFk/PY5HkNcB7q+rLTP5Nplb183OxBrg0\nycNJ9ia5dWjTDVc/x+KrwBuSPA3sAz4xpNnONXPq5tD/1LDOLMl1TL4r6drFnmURfQGYek225dD3\nsgx4C/AOYDnwaJJHq+r8+iNPkz4N7Kuq65JcBXwvyTVV9cfFHmwpWIjIHwWumLK9qnvf9DWv7bGm\nBf0cC5JcA2wHRqrqbP9dW8r6ORZvBXYmCZPXXm9IcrKqdg1pxmHp51gcAZ6pqueB55P8AHgTk9ev\nW9LPsXg7sBWgqp5I8nPgauBHQ5nw3DGnbi7E5ZrTH55KciGTH56a/ku6C/gAnP5E7Rk/PNWAnsci\nyRXAA8CtVfXEIsw4LD2PRVX9Vff2l0xel/+7BgMP/f2O/AtwbZKXJXklky+07R/ynMPQz7HYD7wT\noHsNeg3ws6FOOTxh5v/BzqmbAz+TLz88dVo/xwK4A7gU+FL3DPZkVa1bvKkXRp/H4iXfMvQhh6TP\n35EDSb4LPA6cArZX1U8XcewF0efPxeeA+5PsYzKAn6qq3y7e1AsjyTeADnBZkl8w+a6iC5lnN/0w\nlCQ17Jz5K5SSpMEz8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUsP8DN55AWRVBNi0AAAAA\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\nSUVORK5CYII=\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": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAD1xJREFUeJzt3X+I3Hedx/Hnq+bq1VwttOUCJqZ315gWxDaKJoEWb2rl\nTIUj4j+2veuhnBA40wrHYWqldWmp2j8OtC0qkVCQO4lghcvdtViRLqVeEyO4qZ5JNlu9mqQaqT9K\nbZMjhvf9sXPJdk0ys7uzs9lPng9YujPz2e+8+bD73Ml3ZrapKiRJbbpgoQeQJM0fIy9JDTPyktQw\nIy9JDTPyktQwIy9JDesZ+STbkhxJ8uxZ1jyY5ECSsSRrBjuiJGm2+nkk/wjwvjPdmOQm4Mqqeguw\nCfjygGaTJM1Rz8hX1dPAb86yZCPw1e7aXcAlSZYNZjxJ0lwM4pz8cuDglMuHu9dJkhaYT7xKUsOW\nDOAYh4E3T7m8onvdH0jiH8qRpFmoqszm6/qNfLofp7MD+Bjw9STrgd9W1ZEzHmnk9FcvnVjKd//p\nu1x77bV9jrS4jYyMMDIystBjnBPci1Pci1POp70YGxvjun++jldXvXr6BSOzP3bPyCf5GtABLkvy\nM+DTwIVAVdXWqnosyfuTTACvAB+ZzSDLX1nO6tWrZ/OlkrSoXXXVVax4dQXjjA/82D0jX1W39rFm\n85ymOAbrV67noosumtNhJGkxuuiii1j35nWM/+84vH6wxz4nnnhdNr6MuzffvdBjDFWn01noEc4Z\n7sUp7sUp59te3LP5HpbtH/yrzxc88m/86Ru54913sGrVqoUeZajOt2/gs3EvTnEvTjnf9mLVqlXc\n/u7bufh/Lh7ocRcu8sdg2Z5lbHn7Fu76+F0LNoYknSs+9fFPceeaO1n27DI4NphjZpj/+78ktfRv\nl7Li1RWsW7mOuz9293n3CF6SepmYmOC+h+9j5892cnjpYV75l1dm/RLKoUd+bGyM1atX+ySrJPVw\n9OhRxsfHWbNmzeKJvP/jcEmamSSzjvyCP/EqSZo/Rl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalh\nRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6S\nGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGmbkJalhRl6SGtZX5JNsSLIvyXiS\nLae5/bIkjycZS/LDJB8e+KSSpBlLVZ19QXIBMA7cCLwA7AZurqp9U9Z8GvjjqvpkksuB/cCyqvr9\ntGNVr/uTJL1WEqoqs/nafh7JrwUOVNXzVXUc2A5snLbmF8DF3c8vBn41PfCSpOFb0sea5cDBKZcP\nMRn+qb4CfCfJC8CfAB8azHiSpLnoJ/L9+CSwp6puSHIl8O0k11TV76YvHBkZOfl5p9Oh0+kMaARJ\nasPo6Cijo6MDOVY/5+TXAyNVtaF7+U6gquqBKWseA+6vqu92L38H2FJV3592LM/JS9IMzfc5+d3A\nqiRXJLkQuBnYMW3NXuC93WGWAauBn8xmIEnS4PQ8XVNVJ5JsBp5g8pfCtqram2TT5M21Ffgs8EiS\nPUCAT1TVr+dzcElSbz1P1wz0zjxdI0kzNt+nayRJi5SRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJ\napiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiR\nl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SGGXlJapiRl6SG\nGXlJapiRl6SGGXlJalhfkU+yIcm+JONJtpxhTSfJD5L8KMmTgx1TkjQbqaqzL0guAMaBG4EXgN3A\nzVW1b8qaS4D/Av6qqg4nubyqXjzNsarX/UmSXisJVZXZfG0/j+TXAgeq6vmqOg5sBzZOW3Mr8GhV\nHQY4XeAlScPXT+SXAwenXD7UvW6q1cClSZ5MsjvJbYMaUJI0e0sGeJx3AO8BlgLPJHmmqiYGdHxJ\n0iz0E/nDwMopl1d0r5vqEPBiVR0DjiV5CrgW+IPIj4yMnPy80+nQ6XRmNrEkNW50dJTR0dGBHKuf\nJ15fB+xn8onXnwPfA26pqr1T1lwNPARsAF4P7AI+VFU/nnYsn3iVpBmayxOvPR/JV9WJJJuBJ5g8\nh7+tqvYm2TR5c22tqn1JvgU8C5wAtk4PvCRp+Ho+kh/onflIXpJmbL5fQilJWqSMvCQ1zMhLUsOM\nvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1\nzMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhL\nUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1zMhLUsOMvCQ1rK/IJ9mQZF+S8SRbzrLuXUmOJ/ng4EaU\nJM1Wz8gnuQB4GHgf8FbgliRXn2Hd54BvDXpISdLs9PNIfi1woKqer6rjwHZg42nW3Q58A/jlAOeT\nJM1BP5FfDhyccvlQ97qTkrwJ+EBVfQnI4MaTJM3FoJ54/Tww9Vy9oZekc8CSPtYcBlZOubyie91U\n7wS2JwlwOXBTkuNVtWP6wUZGRk5+3ul06HQ6MxxZkto2OjrK6OjoQI6Vqjr7guR1wH7gRuDnwPeA\nW6pq7xnWPwL8e1V98zS3Va/7kyS9VhKqalZnSHo+kq+qE0k2A08weXpnW1XtTbJp8ubaOv1LZjOI\nJGnwej6SH+id+UhekmZsLo/kfcerJDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8\nJDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXM\nyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtS\nw4y8JDXMyEtSw/qKfJINSfYlGU+y5TS335pkT/fj6SRvG/yokqSZSlWdfUFyATAO3Ai8AOwGbq6q\nfVPWrAf2VtVLSTYAI1W1/jTHql73J0l6rSRUVWbztf08kl8LHKiq56vqOLAd2Dh1QVXtrKqXuhd3\nAstnM4wkabD6ifxy4OCUy4c4e8Q/Cjw+l6EkSYOxZJAHS3ID8BHg+jOtGRkZOfl5p9Oh0+kMcgRJ\nWvRGR0cZHR0dyLH6OSe/nslz7Bu6l+8EqqoemLbuGuBRYENVPXeGY3lOXpJmaL7Pye8GViW5IsmF\nwM3AjmkDrGQy8LedKfCSpOHrebqmqk4k2Qw8weQvhW1VtTfJpsmbaytwN3Ap8MUkAY5X1dr5HFyS\n1FvP0zUDvTNP10jSjM336RpJ0iJl5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm\n5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWp\nYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUOP/NjYGEePHh32\n3UrSonP06FHGxsbmdIwlA5qlbz+97jq+uWIFS9at42/uuYcrV60a9giSdE6bmJjg3ofvZdfBXRx6\nw6E5HStVNaCx+riz5OS9vQx8ZdkyLrnjDv7+rruGNoMkncvu/8L9PPTUQxy56gi8vnvlCFRVZnO8\nvk7XJNmQZF+S8SRbzrDmwSQHkowlWdPrmBcD/3jkCH/6uc+x7TOfmeHYktSe+79wPw+MPcCRa6YE\nfo56Rj7JBcDDwPuAtwK3JLl62pqbgCur6i3AJuDL/Q7w1y+/zEsPPshzExMzGnyxGx0dXegRzhnu\nxSnuxSnn215MTEzw0FMP8fKfvTzQ4/bzSH4tcKCqnq+q48B2YOO0NRuBrwJU1S7gkiTL+h3io0eO\n8K/33dfv8iacb9/AZ+NenOJenHK+7cW9D987eYpmwPqJ/HLg4JTLh7rXnW3N4dOsOaM3Asd37vRV\nN5LOS0ePHmXXwV0DO0Uz1TnzOvm3Hz7M+Pj4Qo8hSUO3f//+Ob+K5kx6vromyXpgpKo2dC/fCVRV\nPTBlzZeBJ6vq693L+4C/rKoj0441vJfySFJDZvvqmn5eJ78bWJXkCuDnwM3ALdPW7AA+Bny9+0vh\nt9MDP5chJUmz0zPyVXUiyWbgCSZP72yrqr1JNk3eXFur6rEk708yAbwCfGR+x5Yk9WOob4aSJA3X\nvDzxOh9vnlqseu1FkluT7Ol+PJ3kbQsx5zD0833RXfeuJMeTfHCY8w1Tnz8jnSQ/SPKjJE8Oe8Zh\n6eNn5LIkj3db8cMkH16AMeddkm1JjiR59ixrZt7NqhroB5O/OCaAK4A/AsaAq6etuQn4z+7n64Cd\ng57jXPjocy/WA5d0P99wPu/FlHXfAf4D+OBCz72A3xeXAP8NLO9evnyh517Avfg08Nn/3wfgV8CS\nhZ59HvbiemAN8OwZbp9VN+fjkfy8v3lqEem5F1W1s6pe6l7cyQzeX7DI9PN9AXA78A3gl8Mcbsj6\n2YtbgUer6jBAVb045BmHpZ+9+AWTfwmF7n9/VVW/H+KMQ1FVTwO/OcuSWXVzPiI/72+eWkT62Yup\nPgo8Pq8TLZyee5HkTcAHqupLQMuvxOrn+2I1cGmSJ5PsTnLb0KYbrn724ivAW5O8AOwBPj6k2c41\ns+rm0P/UsE4vyQ1Mvirp+oWeZQF9Hph6Trbl0PeyBHgH8B5gKfBMkmeq6vz6I0+TPgnsqaobklwJ\nfDvJNVX1u4UebDGYj8gfBlZOubyie930NW/usaYF/ewFSa4BtgIbqups/1xbzPrZi3cC25OEyXOv\nNyU5XlU7hjTjsPSzF4eAF6vqGHAsyVPAtUyev25JP3txHXA/QFU9l+SnwNXA94cy4bljVt2cj9M1\nJ988leRCJt88Nf2HdAfwd3DyHbWnffNUA3ruRZKVwKPAbVX13ALMOCw996Kq/qL78edMnpf/hwYD\nD/39jPwbcH2S1yV5A5NPtO0d8pzD0M9e7AXeC9A9B70a+MlQpxyecOZ/wc6qmwN/JF++eeqkfvYC\nuBu4FPhi9xHs8apau3BTz48+9+I1XzL0IYekz5+RfUm+BTwLnAC2VtWPF3DsedHn98VngUeS7GEy\ngJ+oql8v3NTzI8nXgA5wWZKfMfmqoguZYzd9M5QkNeyc+SuUkqTBM/KS1DAjL0kNM/KS1DAjL0kN\nM/KS1DAjL0kNM/KS1LD/A0QsjLVmYaJMAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\ng+rvjtqeegAAAABJRU5ErkJggg==\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": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADzxJREFUeJzt3H+I3Hedx/Hnq+bqtb1aaIsBE9O7a0wLxVpFk4CFm1o5\n0wOJeH/YViuKcgGNCveHqZW2S0vU/HNoW9RLCQVBiWCFy91ZrEiX0rOJEbqpnkk3W0tNUo3UH73Y\nSyGG9/2xc+lmTTKzu7Oz2U+eDxi635nPfufNl91nvv3OzKaqkCS16byFHkCSNH+MvCQ1zMhLUsOM\nvCQ1zMhLUsOMvCQ1rGfkk2xLcjjJ02dYc1+S/UnGklw32BElSbPVz5n8Q8B7TvdgkpuAK6vqTcAG\n4OsDmk2SNEc9I19VTwC/P8OS9cA3umt3AZckWTqY8SRJczGIa/LLgANTtg9175MkLTBfeJWkhi0Z\nwD4OAW+csr28e9+fSeIfypGkWaiqzOb7+j2TT/d2KjuADwMkWQv8oaoOn3ZPI6e+XfShixgbG6Oq\nzonb3XffveAznC03j4XH4lw/Fk899RTfvfBCCk55m4t+3kL5LeBHwKokv0zy0SQbkvwTQFV9D3gu\nyQTwr8AnZjPIspeXsWrVqtl8qyQtaldddRVPLV8+L/vuebmmqm7tY83GOU3xCqxdsZYLLrhgTruR\npMXoggsuYMmaNRwZH+fiAe/7rHjhden4Uu7ceOdCjzFUnU5noUc4a3gsXuWxeNW5diw+eNddPLh0\n8O8+T9XwXgtNUoycfN/rnnsdm966iTs+c8fQ5pCks9G2zZt5/ZYtvPfIkZPuD/P/wuvgvQJL9yw1\n8JLU9bHPf57f3H47/7J0Kf8zoH0O/Uz+og9dxPL/Xc6aFWu485N3snLlyqE9vyQtBs9OTPDNe+/l\n2M6dvPXQIf7x5ZdnfSY/9MiPjY2xatUqX2SVpB6OHj3K+Pg411133eKJ/DCfT5JakGQRXpOXJM07\nIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9J\nDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPy\nktQwIy9JDTPyktQwIy9JDesr8knWJdmXZDzJplM8flmSR5KMJflpko8MfFJJ0oylqs68IDkPGAdu\nBF4AdgM3V9W+KWvuBv6yqj6X5HLgGWBpVf1p2r6q1/NJkk6WhKrKbL63nzP51cD+qnq+qo4B24H1\n09b8Gri4+/XFwG+nB16SNHxL+lizDDgwZfsgk+Gf6kHgh0leAP4K+MBgxpMkzUU/ke/H54A9VXVD\nkiuBHyS5tqr+OH3hyMjIia87nQ6dTmdAI0hSG0ZHRxkdHR3Ivvq5Jr8WGKmqdd3t24Gqqi1T1nwP\n2FxV/9Xd/iGwqap+Mm1fXpOXpBma72vyu4GVSa5Icj5wM7Bj2pq9wLu7wywFVgG/mM1AkqTB6Xm5\npqqOJ9kIPMrkPwrbqmpvkg2TD9dW4IvAQ0n2AAE+W1W/m8/BJUm99bxcM9An83KNJM3YfF+ukSQt\nUkZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZe\nkhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm\n5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYUZekhpm5CWpYX1FPsm6JPuSjCfZdJo1nSRP\nJflZkscGO6YkaTZSVWdekJwHjAM3Ai8Au4Gbq2rflDWXAD8C/r6qDiW5vKpePMW+qtfzSZJOloSq\nymy+t58z+dXA/qp6vqqOAduB9dPW3Ao8XFWHAE4VeEnS8PUT+WXAgSnbB7v3TbUKuDTJY0l2J7lt\nUANKkmZvyQD38zbgXcBFwJNJnqyqiQHtX5I0C/1E/hCwYsr28u59Ux0EXqyqV4BXkjwOvAX4s8iP\njIyc+LrT6dDpdGY2sSQ1bnR0lNHR0YHsq58XXl8DPMPkC6+/An4M3FJVe6esuRq4H1gHvBbYBXyg\nqn4+bV++8CpJMzSXF157nslX1fEkG4FHmbyGv62q9ibZMPlwba2qfUm+DzwNHAe2Tg+8JGn4ep7J\nD/TJPJOXpBmb77dQSpIWKSMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z\n8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLU\nMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMvSQ0z8pLUMCMv\nSQ3rK/JJ1iXZl2Q8yaYzrHtHkmNJ3j+4ESVJs9Uz8knOAx4A3gNcA9yS5OrTrPsS8P1BDylJmp1+\nzuRXA/ur6vmqOgZsB9afYt2ngO8AvxngfJKkOegn8suAA1O2D3bvOyHJG4D3VdXXgAxuPEnSXAzq\nhdcvA1Ov1Rt6SToLLOljzSFgxZTt5d37pno7sD1JgMuBm5Icq6od03c2MjJy4utOp0On05nhyJLU\nttHRUUZHRweyr1TVmRckrwGeAW4EfgX8GLilqvaeZv1DwL9X1XdP8Vj1ej5J0smSUFWzukLS80y+\nqo4n2Qg8yuTlnW1VtTfJhsmHa+v0b5nNIJKkwet5Jj/QJ/NMXpJmbC5n8n7iVZIaZuQlqWFGXpIa\nZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQl\nqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFG\nXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWFGXpIaZuQlqWF9RT7JuiT7kown2XSKx29Nsqd7eyLJ\nmwc/qiRpplJVZ16QnAeMAzcCLwC7gZurat+UNWuBvVX1UpJ1wEhVrT3FvqrX80mSTpaEqspsvref\nM/nVwP6qer6qjgHbgfVTF1TVzqp6qbu5E1g2m2EkSYPVT+SXAQembB/kzBH/OPDIXIaSJA3GkkHu\nLMkNwEeB60+3ZmRk5MTXnU6HTqczyBEkadEbHR1ldHR0IPvq55r8Wiavsa/rbt8OVFVtmbbuWuBh\nYF1VPXuafXlNXpJmaL6vye8GVia5Isn5wM3AjmkDrGAy8LedLvCSpOHrebmmqo4n2Qg8yuQ/Ctuq\nam+SDZMP11bgTuBS4KtJAhyrqtXzObgkqbeel2sG+mRerpGkGZvvyzWSpEXKyEtSw4y8JDXMyEtS\nw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8\nJDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXMyEtSw4y8JDXM\nyEtSw4y8JDXMyEtSw4Ye+bGxMY4ePTrsp5WkRefo0aOMjY3NaR9LBjRL35575zv57vLlLFmzhg/e\ndRdXrlw57BEk6aw2MTHBPQ/cw64Duzh44cE57StVNaCx+niy5MSzHQEeXLqUSz79aT52xx1Dm0GS\nzmabv7KZ+x+/n8NXHYbXdu8cgarKbPbX1+WaJOuS7EsynmTTadbcl2R/krEk1/Xa58XAPx8+zOu/\n9CW2feELMxxbktqz+Sub2TK2hcPXTgn8HPWMfJLzgAeA9wDXALckuXrampuAK6vqTcAG4Ov9DvDe\nI0d46b77eHZiYkaDL3ajo6MLPcJZw2PxKo/Fq861YzExMcH9j9/Pkb8+MtD99nMmvxrYX1XPV9Ux\nYDuwftqa9cA3AKpqF3BJkqX9DvHxw4f55r339ru8CefaD/CZeCxe5bF41bl2LO554J7JSzQD1k/k\nlwEHpmwf7N53pjWHTrHmtF4HHNu503fdSDonHT16lF0Hdg3sEs1UZ8375N966BDj4+MLPYYkDd0z\nzzwz53fRnE7Pd9ckWQuMVNW67vbtQFXVlilrvg48VlXf7m7vA/6uqg5P29fw3sojSQ2Z7btr+nmf\n/G5gZZIrgF8BNwO3TFuzA/gk8O3uPwp/mB74uQwpSZqdnpGvquNJNgKPMnl5Z1tV7U2yYfLh2lpV\n30vyD0kmgJeBj87v2JKkfgz1w1CSpOGalxde5+PDU4tVr2OR5NYke7q3J5K8eSHmHIZ+fi66696R\n5FiS9w9zvmHq83ekk+SpJD9L8tiwZxyWPn5HLkvySLcVP03ykQUYc94l2ZbkcJKnz7Bm5t2sqoHe\nmPyHYwK4AvgLYAy4etqam4D/7H69Btg56DnOhlufx2ItcEn363Xn8rGYsu6HwH8A71/ouRfw5+IS\n4L+BZd3tyxd67gU8FncDX/z/4wD8Fliy0LPPw7G4HrgOePo0j8+qm/NxJj/vH55aRHoei6raWVUv\ndTd3MoPPFywy/fxcAHwK+A7wm2EON2T9HItbgYer6hBAVb045BmHpZ9j8Wsm/xIK3f/+tqr+NMQZ\nh6KqngB+f4Yls+rmfER+3j88tYj0cyym+jjwyLxOtHB6HoskbwDeV1VfA1p+J1Y/PxergEuTPJZk\nd5LbhjbdcPVzLB4ErknyArAH+MyQZjvbzKqbQ/9Twzq1JDcw+a6k6xd6lgX0ZWDqNdmWQ9/LEuBt\nwLuAi4AnkzxZVefWH3ma9DlgT1XdkORK4AdJrq2qPy70YIvBfET+ELBiyvby7n3T17yxx5oW9HMs\nSHItsBVYV1Vn+t+1xayfY/F2YHuSMHnt9aYkx6pqx5BmHJZ+jsVB4MWqegV4JcnjwFuYvH7dkn6O\nxTuBzQBV9WyS54CrgZ8MZcKzx6y6OR+Xa058eCrJ+Ux+eGr6L+kO4MNw4hO1p/zwVAN6HoskK4CH\ngduq6tkFmHFYeh6Lqvrb7u1vmLwu/4kGAw/9/Y78G3B9ktckuZDJF9r2DnnOYejnWOwF3g3QvQa9\nCvjFUKccnnD6/4OdVTcHfiZffnjqhH6OBXAncCnw1e4Z7LGqWr1wU8+PPo/FSd8y9CGHpM/fkX1J\nvg88DRwHtlbVzxdw7HnR58/FF4GHkuxhMoCfrarfLdzU8yPJt4AOcFmSXzL5rqLzmWM3/TCUJDXs\nrPkrlJKkwTPyktQwIy9JDTPyktQwIy9JDTPyktQwIy9JDTPyktSw/wOphziaREgegQAAAABJRU5E\nrkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n+8V2OClBh5wAAAAASUVORK5CYII=\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": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Validation error: 0.04\n" + ] + }, + { + "data": { + "image/png": "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\nrIQAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\nAElFTkSuQmCC\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 += abs(error)\n", + " \n", + "val_error = val_net_error/len(validation)\n", + "print(\"Validation error:\",val_error)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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 +} diff --git a/projects/7-dnns/Deitelzweig/Deitelzweig Keras.ipynb b/projects/7-dnns/Deitelzweig/Deitelzweig Keras.ipynb new file mode 100644 index 0000000..b18a027 --- /dev/null +++ b/projects/7-dnns/Deitelzweig/Deitelzweig Keras.ipynb @@ -0,0 +1,441 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using Theano backend.\n" + ] + } + ], + "source": [ + "from keras.models import Sequential\n", + "from keras.layers import Dense\n", + "import numpy\n", + "# fix random seed for reproducibility\n", + "seed = 7\n", + "numpy.random.seed(seed)\n", + "\n", + "# load pima indians dataset\n", + "dataset = numpy.loadtxt(\"pima-indians-diabetes.csv\", delimiter=\",\")\n", + "# split into input (X) and output (Y) variables\n", + "X = dataset[:,0:8]\n", + "Y = dataset[:,8]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# create model\n", + "model = Sequential()\n", + "model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))\n", + "model.add(Dense(8, init='uniform', activation='relu'))\n", + "model.add(Dense(1, init='uniform', activation='sigmoid'))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Compile model\n", + "model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/150\n", + "768/768 [==============================] - 0s - loss: 0.6826 - acc: 0.6328 \n", + "Epoch 2/150\n", + "768/768 [==============================] - 0s - loss: 0.6590 - acc: 0.6510 \n", + "Epoch 3/150\n", + "768/768 [==============================] - 0s - loss: 0.6475 - acc: 0.6549 \n", + "Epoch 4/150\n", + "768/768 [==============================] - 0s - loss: 0.6416 - acc: 0.6615 \n", + "Epoch 5/150\n", + "768/768 [==============================] - 0s - loss: 0.6216 - acc: 0.6745 \n", + "Epoch 6/150\n", + "768/768 [==============================] - 0s - loss: 0.6128 - acc: 0.6680 \n", + "Epoch 7/150\n", + "768/768 [==============================] - 0s - loss: 0.6018 - acc: 0.6927 \n", + "Epoch 8/150\n", + "768/768 [==============================] - 0s - loss: 0.5962 - acc: 0.6927 \n", + "Epoch 9/150\n", + "768/768 [==============================] - 0s - loss: 0.5991 - acc: 0.6953 \n", + "Epoch 10/150\n", + "768/768 [==============================] - 0s - loss: 0.5920 - acc: 0.6927 \n", + "Epoch 11/150\n", + "768/768 [==============================] - 0s - loss: 0.5905 - acc: 0.6979 \n", + "Epoch 12/150\n", + "768/768 [==============================] - 0s - loss: 0.5883 - acc: 0.6901 \n", + "Epoch 13/150\n", + "768/768 [==============================] - 0s - loss: 0.5870 - acc: 0.6953 \n", + "Epoch 14/150\n", + "768/768 [==============================] - 0s - loss: 0.5869 - acc: 0.6836 \n", + "Epoch 15/150\n", + "768/768 [==============================] - 0s - loss: 0.5815 - acc: 0.6953 \n", + "Epoch 16/150\n", + "768/768 [==============================] - 0s - loss: 0.5779 - acc: 0.6966 \n", + "Epoch 17/150\n", + "768/768 [==============================] - 0s - loss: 0.5809 - acc: 0.6849 \n", + "Epoch 18/150\n", + "768/768 [==============================] - 0s - loss: 0.5818 - acc: 0.6953 \n", + "Epoch 19/150\n", + "768/768 [==============================] - 0s - loss: 0.5814 - acc: 0.6901 \n", + "Epoch 20/150\n", + "768/768 [==============================] - 0s - loss: 0.5748 - acc: 0.7096 \n", + "Epoch 21/150\n", + "768/768 [==============================] - 0s - loss: 0.5758 - acc: 0.7005 \n", + "Epoch 22/150\n", + "768/768 [==============================] - 0s - loss: 0.5739 - acc: 0.7135 \n", + "Epoch 23/150\n", + "768/768 [==============================] - 0s - loss: 0.5736 - acc: 0.6927 \n", + "Epoch 24/150\n", + "768/768 [==============================] - 0s - loss: 0.5750 - acc: 0.6940 \n", + "Epoch 25/150\n", + "768/768 [==============================] - 0s - loss: 0.5734 - acc: 0.7031 \n", + "Epoch 26/150\n", + "768/768 [==============================] - 0s - loss: 0.5683 - acc: 0.7083 \n", + "Epoch 27/150\n", + "768/768 [==============================] - 0s - loss: 0.5688 - acc: 0.7018 \n", + "Epoch 28/150\n", + "768/768 [==============================] - 0s - loss: 0.5714 - acc: 0.7070 \n", + "Epoch 29/150\n", + "768/768 [==============================] - 0s - loss: 0.5621 - acc: 0.7188 \n", + "Epoch 30/150\n", + "768/768 [==============================] - 0s - loss: 0.5647 - acc: 0.7122 \n", + "Epoch 31/150\n", + "768/768 [==============================] - 0s - loss: 0.5630 - acc: 0.7135 \n", + "Epoch 32/150\n", + "768/768 [==============================] - 0s - loss: 0.5613 - acc: 0.7214 \n", + "Epoch 33/150\n", + "768/768 [==============================] - 0s - loss: 0.5594 - acc: 0.7188 \n", + "Epoch 34/150\n", + "768/768 [==============================] - 0s - loss: 0.5598 - acc: 0.7187 \n", + "Epoch 35/150\n", + "768/768 [==============================] - 0s - loss: 0.5624 - acc: 0.7187 \n", + "Epoch 36/150\n", + "768/768 [==============================] - 0s - loss: 0.5615 - acc: 0.7201 \n", + "Epoch 37/150\n", + "768/768 [==============================] - 0s - loss: 0.5544 - acc: 0.7214 \n", + "Epoch 38/150\n", + "768/768 [==============================] - 0s - loss: 0.5529 - acc: 0.7135 \n", + "Epoch 39/150\n", + "768/768 [==============================] - 0s - loss: 0.5550 - acc: 0.7227 \n", + "Epoch 40/150\n", + "768/768 [==============================] - 0s - loss: 0.5574 - acc: 0.7331 \n", + "Epoch 41/150\n", + "768/768 [==============================] - 0s - loss: 0.5562 - acc: 0.7357 \n", + "Epoch 42/150\n", + "768/768 [==============================] - 0s - loss: 0.5458 - acc: 0.7370 \n", + "Epoch 43/150\n", + "768/768 [==============================] - 0s - loss: 0.5487 - acc: 0.7253 \n", + "Epoch 44/150\n", + "768/768 [==============================] - 0s - loss: 0.5409 - acc: 0.7344 \n", + "Epoch 45/150\n", + "768/768 [==============================] - 0s - loss: 0.5445 - acc: 0.7435 \n", + "Epoch 46/150\n", + "768/768 [==============================] - 0s - loss: 0.5362 - acc: 0.7357 \n", + "Epoch 47/150\n", + "768/768 [==============================] - 0s - loss: 0.5400 - acc: 0.7357 \n", + "Epoch 48/150\n", + "768/768 [==============================] - 0s - loss: 0.5354 - acc: 0.7409 \n", + "Epoch 49/150\n", + "768/768 [==============================] - 0s - loss: 0.5406 - acc: 0.7357 \n", + "Epoch 50/150\n", + "768/768 [==============================] - 0s - loss: 0.5476 - acc: 0.7357 \n", + "Epoch 51/150\n", + "768/768 [==============================] - 0s - loss: 0.5288 - acc: 0.7461 \n", + "Epoch 52/150\n", + "768/768 [==============================] - 0s - loss: 0.5284 - acc: 0.7474 \n", + "Epoch 53/150\n", + "768/768 [==============================] - 0s - loss: 0.5306 - acc: 0.7370 \n", + "Epoch 54/150\n", + "768/768 [==============================] - 0s - loss: 0.5283 - acc: 0.7487 \n", + "Epoch 55/150\n", + "768/768 [==============================] - 0s - loss: 0.5252 - acc: 0.7539 \n", + "Epoch 56/150\n", + "768/768 [==============================] - 0s - loss: 0.5257 - acc: 0.7552 \n", + "Epoch 57/150\n", + "768/768 [==============================] - 0s - loss: 0.5282 - acc: 0.7422 \n", + "Epoch 58/150\n", + "768/768 [==============================] - 0s - loss: 0.5269 - acc: 0.7513 \n", + "Epoch 59/150\n", + "768/768 [==============================] - 0s - loss: 0.5248 - acc: 0.7487 \n", + "Epoch 60/150\n", + "768/768 [==============================] - 0s - loss: 0.5202 - acc: 0.7500 \n", + "Epoch 61/150\n", + "768/768 [==============================] - 0s - loss: 0.5160 - acc: 0.7552 \n", + "Epoch 62/150\n", + "768/768 [==============================] - 0s - loss: 0.5161 - acc: 0.7461 \n", + "Epoch 63/150\n", + "768/768 [==============================] - 0s - loss: 0.5100 - acc: 0.7591 \n", + "Epoch 64/150\n", + "768/768 [==============================] - 0s - loss: 0.5145 - acc: 0.7526 \n", + "Epoch 65/150\n", + "768/768 [==============================] - 0s - loss: 0.5125 - acc: 0.7474 \n", + "Epoch 66/150\n", + "768/768 [==============================] - 0s - loss: 0.5148 - acc: 0.7617 \n", + "Epoch 67/150\n", + "768/768 [==============================] - 0s - loss: 0.5088 - acc: 0.7539 \n", + "Epoch 68/150\n", + "768/768 [==============================] - 0s - loss: 0.5124 - acc: 0.7721 \n", + "Epoch 69/150\n", + "768/768 [==============================] - 0s - loss: 0.5152 - acc: 0.7487 \n", + "Epoch 70/150\n", + "768/768 [==============================] - 0s - loss: 0.5163 - acc: 0.7552 \n", + "Epoch 71/150\n", + "768/768 [==============================] - 0s - loss: 0.5195 - acc: 0.7422 \n", + "Epoch 72/150\n", + "768/768 [==============================] - 0s - loss: 0.5094 - acc: 0.7461 \n", + "Epoch 73/150\n", + "768/768 [==============================] - 0s - loss: 0.4984 - acc: 0.7617 \n", + "Epoch 74/150\n", + "768/768 [==============================] - 0s - loss: 0.4979 - acc: 0.7617 \n", + "Epoch 75/150\n", + "768/768 [==============================] - 0s - loss: 0.5073 - acc: 0.7591 \n", + "Epoch 76/150\n", + "768/768 [==============================] - 0s - loss: 0.5028 - acc: 0.7513 \n", + "Epoch 77/150\n", + "768/768 [==============================] - 0s - loss: 0.5018 - acc: 0.7552 \n", + "Epoch 78/150\n", + "768/768 [==============================] - 0s - loss: 0.4929 - acc: 0.7578 \n", + "Epoch 79/150\n", + "768/768 [==============================] - 0s - loss: 0.5011 - acc: 0.7630 \n", + "Epoch 80/150\n", + "768/768 [==============================] - 0s - loss: 0.5018 - acc: 0.7474 \n", + "Epoch 81/150\n", + "768/768 [==============================] - 0s - loss: 0.5026 - acc: 0.7578 \n", + "Epoch 82/150\n", + "768/768 [==============================] - 0s - loss: 0.4986 - acc: 0.7604 \n", + "Epoch 83/150\n", + "768/768 [==============================] - 0s - loss: 0.4948 - acc: 0.7578 \n", + "Epoch 84/150\n", + "768/768 [==============================] - 0s - loss: 0.4915 - acc: 0.7747 \n", + "Epoch 85/150\n", + "768/768 [==============================] - 0s - loss: 0.4982 - acc: 0.7578 \n", + "Epoch 86/150\n", + "768/768 [==============================] - 0s - loss: 0.4906 - acc: 0.7721 \n", + "Epoch 87/150\n", + "768/768 [==============================] - 0s - loss: 0.4972 - acc: 0.7578 \n", + "Epoch 88/150\n", + "768/768 [==============================] - 0s - loss: 0.4921 - acc: 0.7695 \n", + "Epoch 89/150\n", + "768/768 [==============================] - 0s - loss: 0.4900 - acc: 0.7630 \n", + "Epoch 90/150\n", + "768/768 [==============================] - 0s - loss: 0.4870 - acc: 0.7669 \n", + "Epoch 91/150\n", + "768/768 [==============================] - 0s - loss: 0.4979 - acc: 0.7591 \n", + "Epoch 92/150\n", + "768/768 [==============================] - 0s - loss: 0.4943 - acc: 0.7682 \n", + "Epoch 93/150\n", + "768/768 [==============================] - 0s - loss: 0.4907 - acc: 0.7630 \n", + "Epoch 94/150\n", + "768/768 [==============================] - 0s - loss: 0.4859 - acc: 0.7617 \n", + "Epoch 95/150\n", + "768/768 [==============================] - 0s - loss: 0.4833 - acc: 0.7695 \n", + "Epoch 96/150\n", + "768/768 [==============================] - 0s - loss: 0.4842 - acc: 0.7695 \n", + "Epoch 97/150\n", + "768/768 [==============================] - 0s - loss: 0.4753 - acc: 0.7786 \n", + "Epoch 98/150\n", + "768/768 [==============================] - 0s - loss: 0.4990 - acc: 0.7422 \n", + "Epoch 99/150\n", + "768/768 [==============================] - 0s - loss: 0.4856 - acc: 0.7695 \n", + "Epoch 100/150\n", + "768/768 [==============================] - 0s - loss: 0.4814 - acc: 0.7721 \n", + "Epoch 101/150\n", + "768/768 [==============================] - 0s - loss: 0.4857 - acc: 0.7695 \n", + "Epoch 102/150\n", + "768/768 [==============================] - 0s - loss: 0.4769 - acc: 0.7878 \n", + "Epoch 103/150\n", + "768/768 [==============================] - 0s - loss: 0.4844 - acc: 0.7552 \n", + "Epoch 104/150\n", + "768/768 [==============================] - 0s - loss: 0.4817 - acc: 0.7760 \n", + "Epoch 105/150\n", + "768/768 [==============================] - 0s - loss: 0.4803 - acc: 0.7760 \n", + "Epoch 106/150\n", + "768/768 [==============================] - 0s - loss: 0.4811 - acc: 0.7812 \n", + "Epoch 107/150\n", + "768/768 [==============================] - 0s - loss: 0.4836 - acc: 0.7773 \n", + "Epoch 108/150\n", + "768/768 [==============================] - 0s - loss: 0.4774 - acc: 0.7826 \n", + "Epoch 109/150\n", + "768/768 [==============================] - 0s - loss: 0.4775 - acc: 0.7786 \n", + "Epoch 110/150\n", + "768/768 [==============================] - 0s - loss: 0.4795 - acc: 0.7695 \n", + "Epoch 111/150\n", + "768/768 [==============================] - 0s - loss: 0.4713 - acc: 0.7747 \n", + "Epoch 112/150\n", + "768/768 [==============================] - 0s - loss: 0.4745 - acc: 0.7826 \n", + "Epoch 113/150\n", + "768/768 [==============================] - 0s - loss: 0.4751 - acc: 0.7773 \n", + "Epoch 114/150\n", + "768/768 [==============================] - 0s - loss: 0.4808 - acc: 0.7617 \n", + "Epoch 115/150\n", + "768/768 [==============================] - 0s - loss: 0.4790 - acc: 0.7643 \n", + "Epoch 116/150\n", + "768/768 [==============================] - 0s - loss: 0.4723 - acc: 0.7786 \n", + "Epoch 117/150\n", + "768/768 [==============================] - 0s - loss: 0.4668 - acc: 0.7799 \n", + "Epoch 118/150\n", + "768/768 [==============================] - 0s - loss: 0.4644 - acc: 0.7839 \n", + "Epoch 119/150\n", + "768/768 [==============================] - 0s - loss: 0.4711 - acc: 0.7839 \n", + "Epoch 120/150\n", + "768/768 [==============================] - 0s - loss: 0.4694 - acc: 0.7839 \n", + "Epoch 121/150\n", + "768/768 [==============================] - 0s - loss: 0.4760 - acc: 0.7839 \n", + "Epoch 122/150\n", + "768/768 [==============================] - 0s - loss: 0.4725 - acc: 0.7747 \n", + "Epoch 123/150\n", + "768/768 [==============================] - 0s - loss: 0.4699 - acc: 0.7826 \n", + "Epoch 124/150\n", + "768/768 [==============================] - 0s - loss: 0.4701 - acc: 0.7799 \n", + "Epoch 125/150\n", + "768/768 [==============================] - 0s - loss: 0.4695 - acc: 0.7747 \n", + "Epoch 126/150\n", + "768/768 [==============================] - 0s - loss: 0.4642 - acc: 0.7799 \n", + "Epoch 127/150\n", + "768/768 [==============================] - 0s - loss: 0.4719 - acc: 0.7656 \n", + "Epoch 128/150\n", + "768/768 [==============================] - 0s - loss: 0.4579 - acc: 0.7865 \n", + "Epoch 129/150\n", + "768/768 [==============================] - 0s - loss: 0.4644 - acc: 0.7865 \n", + "Epoch 130/150\n", + "768/768 [==============================] - 0s - loss: 0.4735 - acc: 0.7760 \n", + "Epoch 131/150\n", + "768/768 [==============================] - 0s - loss: 0.4606 - acc: 0.7773 \n", + "Epoch 132/150\n", + "768/768 [==============================] - 0s - loss: 0.4639 - acc: 0.7760 \n", + "Epoch 133/150\n", + "768/768 [==============================] - 0s - loss: 0.4751 - acc: 0.7865 \n", + "Epoch 134/150\n", + "768/768 [==============================] - 0s - loss: 0.4729 - acc: 0.7773 \n", + "Epoch 135/150\n", + "768/768 [==============================] - 0s - loss: 0.4601 - acc: 0.7917 \n", + "Epoch 136/150\n", + "768/768 [==============================] - 0s - loss: 0.4564 - acc: 0.7852 \n", + "Epoch 137/150\n", + "768/768 [==============================] - 0s - loss: 0.4625 - acc: 0.7852 \n", + "Epoch 138/150\n", + "768/768 [==============================] - 0s - loss: 0.4684 - acc: 0.7760 \n", + "Epoch 139/150\n", + "768/768 [==============================] - 0s - loss: 0.4605 - acc: 0.7734 \n", + "Epoch 140/150\n", + "768/768 [==============================] - 0s - loss: 0.4590 - acc: 0.7839 \n", + "Epoch 141/150\n", + "768/768 [==============================] - 0s - loss: 0.4602 - acc: 0.7734 \n", + "Epoch 142/150\n", + "768/768 [==============================] - 0s - loss: 0.4593 - acc: 0.7760 \n", + "Epoch 143/150\n", + "768/768 [==============================] - 0s - loss: 0.4614 - acc: 0.7878 \n", + "Epoch 144/150\n", + "768/768 [==============================] - 0s - loss: 0.4508 - acc: 0.7969 \n", + "Epoch 145/150\n", + "768/768 [==============================] - 0s - loss: 0.4580 - acc: 0.7747 \n", + "Epoch 146/150\n", + "768/768 [==============================] - 0s - loss: 0.4627 - acc: 0.7812 \n", + "Epoch 147/150\n", + "768/768 [==============================] - 0s - loss: 0.4531 - acc: 0.7943 \n", + "Epoch 148/150\n", + "768/768 [==============================] - 0s - loss: 0.4656 - acc: 0.7734 \n", + "Epoch 149/150\n", + "768/768 [==============================] - 0s - loss: 0.4566 - acc: 0.7839 \n", + "Epoch 150/150\n", + "768/768 [==============================] - 0s - loss: 0.4593 - acc: 0.7839 \n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Fit the model\n", + "model.fit(X, Y, nb_epoch=150, batch_size=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 32/768 [>.............................] - ETA: 0sacc: 79.56%\n" + ] + } + ], + "source": [ + "# evaluate the model\n", + "scores = model.evaluate(X, Y)\n", + "print(\"%s: %.2f%%\" % (model.metrics_names[1], scores[1]*100))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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 +} diff --git a/projects/7-dnns/Deitelzweig/pima-indians-diabetes.csv b/projects/7-dnns/Deitelzweig/pima-indians-diabetes.csv new file mode 100644 index 0000000..982aab8 --- /dev/null +++ b/projects/7-dnns/Deitelzweig/pima-indians-diabetes.csv @@ -0,0 +1,768 @@ +6,148,72,35,0,33.6,0.627,50,1 +1,85,66,29,0,26.6,0.351,31,0 +8,183,64,0,0,23.3,0.672,32,1 +1,89,66,23,94,28.1,0.167,21,0 +0,137,40,35,168,43.1,2.288,33,1 +5,116,74,0,0,25.6,0.201,30,0 +3,78,50,32,88,31.0,0.248,26,1 +10,115,0,0,0,35.3,0.134,29,0 +2,197,70,45,543,30.5,0.158,53,1 +8,125,96,0,0,0.0,0.232,54,1 +4,110,92,0,0,37.6,0.191,30,0 +10,168,74,0,0,38.0,0.537,34,1 +10,139,80,0,0,27.1,1.441,57,0 +1,189,60,23,846,30.1,0.398,59,1 +5,166,72,19,175,25.8,0.587,51,1 +7,100,0,0,0,30.0,0.484,32,1 +0,118,84,47,230,45.8,0.551,31,1 +7,107,74,0,0,29.6,0.254,31,1 +1,103,30,38,83,43.3,0.183,33,0 +1,115,70,30,96,34.6,0.529,32,1 +3,126,88,41,235,39.3,0.704,27,0 +8,99,84,0,0,35.4,0.388,50,0 +7,196,90,0,0,39.8,0.451,41,1 +9,119,80,35,0,29.0,0.263,29,1 +11,143,94,33,146,36.6,0.254,51,1 +10,125,70,26,115,31.1,0.205,41,1 +7,147,76,0,0,39.4,0.257,43,1 +1,97,66,15,140,23.2,0.487,22,0 +13,145,82,19,110,22.2,0.245,57,0 +5,117,92,0,0,34.1,0.337,38,0 +5,109,75,26,0,36.0,0.546,60,0 +3,158,76,36,245,31.6,0.851,28,1 +3,88,58,11,54,24.8,0.267,22,0 +6,92,92,0,0,19.9,0.188,28,0 +10,122,78,31,0,27.6,0.512,45,0 +4,103,60,33,192,24.0,0.966,33,0 +11,138,76,0,0,33.2,0.420,35,0 +9,102,76,37,0,32.9,0.665,46,1 +2,90,68,42,0,38.2,0.503,27,1 +4,111,72,47,207,37.1,1.390,56,1 +3,180,64,25,70,34.0,0.271,26,0 +7,133,84,0,0,40.2,0.696,37,0 +7,106,92,18,0,22.7,0.235,48,0 +9,171,110,24,240,45.4,0.721,54,1 +7,159,64,0,0,27.4,0.294,40,0 +0,180,66,39,0,42.0,1.893,25,1 +1,146,56,0,0,29.7,0.564,29,0 +2,71,70,27,0,28.0,0.586,22,0 +7,103,66,32,0,39.1,0.344,31,1 +7,105,0,0,0,0.0,0.305,24,0 +1,103,80,11,82,19.4,0.491,22,0 +1,101,50,15,36,24.2,0.526,26,0 +5,88,66,21,23,24.4,0.342,30,0 +8,176,90,34,300,33.7,0.467,58,1 +7,150,66,42,342,34.7,0.718,42,0 +1,73,50,10,0,23.0,0.248,21,0 +7,187,68,39,304,37.7,0.254,41,1 +0,100,88,60,110,46.8,0.962,31,0 +0,146,82,0,0,40.5,1.781,44,0 +0,105,64,41,142,41.5,0.173,22,0 +2,84,0,0,0,0.0,0.304,21,0 +8,133,72,0,0,32.9,0.270,39,1 +5,44,62,0,0,25.0,0.587,36,0 +2,141,58,34,128,25.4,0.699,24,0 +7,114,66,0,0,32.8,0.258,42,1 +5,99,74,27,0,29.0,0.203,32,0 +0,109,88,30,0,32.5,0.855,38,1 +2,109,92,0,0,42.7,0.845,54,0 +1,95,66,13,38,19.6,0.334,25,0 +4,146,85,27,100,28.9,0.189,27,0 +2,100,66,20,90,32.9,0.867,28,1 +5,139,64,35,140,28.6,0.411,26,0 +13,126,90,0,0,43.4,0.583,42,1 +4,129,86,20,270,35.1,0.231,23,0 +1,79,75,30,0,32.0,0.396,22,0 +1,0,48,20,0,24.7,0.140,22,0 +7,62,78,0,0,32.6,0.391,41,0 +5,95,72,33,0,37.7,0.370,27,0 +0,131,0,0,0,43.2,0.270,26,1 +2,112,66,22,0,25.0,0.307,24,0 +3,113,44,13,0,22.4,0.140,22,0 +2,74,0,0,0,0.0,0.102,22,0 +7,83,78,26,71,29.3,0.767,36,0 +0,101,65,28,0,24.6,0.237,22,0 +5,137,108,0,0,48.8,0.227,37,1 +2,110,74,29,125,32.4,0.698,27,0 +13,106,72,54,0,36.6,0.178,45,0 +2,100,68,25,71,38.5,0.324,26,0 +15,136,70,32,110,37.1,0.153,43,1 +1,107,68,19,0,26.5,0.165,24,0 +1,80,55,0,0,19.1,0.258,21,0 +4,123,80,15,176,32.0,0.443,34,0 +7,81,78,40,48,46.7,0.261,42,0 +4,134,72,0,0,23.8,0.277,60,1 +2,142,82,18,64,24.7,0.761,21,0 +6,144,72,27,228,33.9,0.255,40,0 +2,92,62,28,0,31.6,0.130,24,0 +1,71,48,18,76,20.4,0.323,22,0 +6,93,50,30,64,28.7,0.356,23,0 +1,122,90,51,220,49.7,0.325,31,1 +1,163,72,0,0,39.0,1.222,33,1 +1,151,60,0,0,26.1,0.179,22,0 +0,125,96,0,0,22.5,0.262,21,0 +1,81,72,18,40,26.6,0.283,24,0 +2,85,65,0,0,39.6,0.930,27,0 +1,126,56,29,152,28.7,0.801,21,0 +1,96,122,0,0,22.4,0.207,27,0 +4,144,58,28,140,29.5,0.287,37,0 +3,83,58,31,18,34.3,0.336,25,0 +0,95,85,25,36,37.4,0.247,24,1 +3,171,72,33,135,33.3,0.199,24,1 +8,155,62,26,495,34.0,0.543,46,1 +1,89,76,34,37,31.2,0.192,23,0 +4,76,62,0,0,34.0,0.391,25,0 +7,160,54,32,175,30.5,0.588,39,1 +4,146,92,0,0,31.2,0.539,61,1 +5,124,74,0,0,34.0,0.220,38,1 +5,78,48,0,0,33.7,0.654,25,0 +4,97,60,23,0,28.2,0.443,22,0 +4,99,76,15,51,23.2,0.223,21,0 +0,162,76,56,100,53.2,0.759,25,1 +6,111,64,39,0,34.2,0.260,24,0 +2,107,74,30,100,33.6,0.404,23,0 +5,132,80,0,0,26.8,0.186,69,0 +0,113,76,0,0,33.3,0.278,23,1 +1,88,30,42,99,55.0,0.496,26,1 +3,120,70,30,135,42.9,0.452,30,0 +1,118,58,36,94,33.3,0.261,23,0 +1,117,88,24,145,34.5,0.403,40,1 +0,105,84,0,0,27.9,0.741,62,1 +4,173,70,14,168,29.7,0.361,33,1 +9,122,56,0,0,33.3,1.114,33,1 +3,170,64,37,225,34.5,0.356,30,1 +8,84,74,31,0,38.3,0.457,39,0 +2,96,68,13,49,21.1,0.647,26,0 +2,125,60,20,140,33.8,0.088,31,0 +0,100,70,26,50,30.8,0.597,21,0 +0,93,60,25,92,28.7,0.532,22,0 +0,129,80,0,0,31.2,0.703,29,0 +5,105,72,29,325,36.9,0.159,28,0 +3,128,78,0,0,21.1,0.268,55,0 +5,106,82,30,0,39.5,0.286,38,0 +2,108,52,26,63,32.5,0.318,22,0 +10,108,66,0,0,32.4,0.272,42,1 +4,154,62,31,284,32.8,0.237,23,0 +0,102,75,23,0,0.0,0.572,21,0 +9,57,80,37,0,32.8,0.096,41,0 +2,106,64,35,119,30.5,1.400,34,0 +5,147,78,0,0,33.7,0.218,65,0 +2,90,70,17,0,27.3,0.085,22,0 +1,136,74,50,204,37.4,0.399,24,0 +4,114,65,0,0,21.9,0.432,37,0 +9,156,86,28,155,34.3,1.189,42,1 +1,153,82,42,485,40.6,0.687,23,0 +8,188,78,0,0,47.9,0.137,43,1 +7,152,88,44,0,50.0,0.337,36,1 +2,99,52,15,94,24.6,0.637,21,0 +1,109,56,21,135,25.2,0.833,23,0 +2,88,74,19,53,29.0,0.229,22,0 +17,163,72,41,114,40.9,0.817,47,1 +4,151,90,38,0,29.7,0.294,36,0 +7,102,74,40,105,37.2,0.204,45,0 +0,114,80,34,285,44.2,0.167,27,0 +2,100,64,23,0,29.7,0.368,21,0 +0,131,88,0,0,31.6,0.743,32,1 +6,104,74,18,156,29.9,0.722,41,1 +3,148,66,25,0,32.5,0.256,22,0 +4,120,68,0,0,29.6,0.709,34,0 +4,110,66,0,0,31.9,0.471,29,0 +3,111,90,12,78,28.4,0.495,29,0 +6,102,82,0,0,30.8,0.180,36,1 +6,134,70,23,130,35.4,0.542,29,1 +2,87,0,23,0,28.9,0.773,25,0 +1,79,60,42,48,43.5,0.678,23,0 +2,75,64,24,55,29.7,0.370,33,0 +8,179,72,42,130,32.7,0.719,36,1 +6,85,78,0,0,31.2,0.382,42,0 +0,129,110,46,130,67.1,0.319,26,1 +5,143,78,0,0,45.0,0.190,47,0 +5,130,82,0,0,39.1,0.956,37,1 +6,87,80,0,0,23.2,0.084,32,0 +0,119,64,18,92,34.9,0.725,23,0 +1,0,74,20,23,27.7,0.299,21,0 +5,73,60,0,0,26.8,0.268,27,0 +4,141,74,0,0,27.6,0.244,40,0 +7,194,68,28,0,35.9,0.745,41,1 +8,181,68,36,495,30.1,0.615,60,1 +1,128,98,41,58,32.0,1.321,33,1 +8,109,76,39,114,27.9,0.640,31,1 +5,139,80,35,160,31.6,0.361,25,1 +3,111,62,0,0,22.6,0.142,21,0 +9,123,70,44,94,33.1,0.374,40,0 +7,159,66,0,0,30.4,0.383,36,1 +11,135,0,0,0,52.3,0.578,40,1 +8,85,55,20,0,24.4,0.136,42,0 +5,158,84,41,210,39.4,0.395,29,1 +1,105,58,0,0,24.3,0.187,21,0 +3,107,62,13,48,22.9,0.678,23,1 +4,109,64,44,99,34.8,0.905,26,1 +4,148,60,27,318,30.9,0.150,29,1 +0,113,80,16,0,31.0,0.874,21,0 +1,138,82,0,0,40.1,0.236,28,0 +0,108,68,20,0,27.3,0.787,32,0 +2,99,70,16,44,20.4,0.235,27,0 +6,103,72,32,190,37.7,0.324,55,0 +5,111,72,28,0,23.9,0.407,27,0 +8,196,76,29,280,37.5,0.605,57,1 +5,162,104,0,0,37.7,0.151,52,1 +1,96,64,27,87,33.2,0.289,21,0 +7,184,84,33,0,35.5,0.355,41,1 +2,81,60,22,0,27.7,0.290,25,0 +0,147,85,54,0,42.8,0.375,24,0 +7,179,95,31,0,34.2,0.164,60,0 +0,140,65,26,130,42.6,0.431,24,1 +9,112,82,32,175,34.2,0.260,36,1 +12,151,70,40,271,41.8,0.742,38,1 +5,109,62,41,129,35.8,0.514,25,1 +6,125,68,30,120,30.0,0.464,32,0 +5,85,74,22,0,29.0,1.224,32,1 +5,112,66,0,0,37.8,0.261,41,1 +0,177,60,29,478,34.6,1.072,21,1 +2,158,90,0,0,31.6,0.805,66,1 +7,119,0,0,0,25.2,0.209,37,0 +7,142,60,33,190,28.8,0.687,61,0 +1,100,66,15,56,23.6,0.666,26,0 +1,87,78,27,32,34.6,0.101,22,0 +0,101,76,0,0,35.7,0.198,26,0 +3,162,52,38,0,37.2,0.652,24,1 +4,197,70,39,744,36.7,2.329,31,0 +0,117,80,31,53,45.2,0.089,24,0 +4,142,86,0,0,44.0,0.645,22,1 +6,134,80,37,370,46.2,0.238,46,1 +1,79,80,25,37,25.4,0.583,22,0 +4,122,68,0,0,35.0,0.394,29,0 +3,74,68,28,45,29.7,0.293,23,0 +4,171,72,0,0,43.6,0.479,26,1 +7,181,84,21,192,35.9,0.586,51,1 +0,179,90,27,0,44.1,0.686,23,1 +9,164,84,21,0,30.8,0.831,32,1 +0,104,76,0,0,18.4,0.582,27,0 +1,91,64,24,0,29.2,0.192,21,0 +4,91,70,32,88,33.1,0.446,22,0 +3,139,54,0,0,25.6,0.402,22,1 +6,119,50,22,176,27.1,1.318,33,1 +2,146,76,35,194,38.2,0.329,29,0 +9,184,85,15,0,30.0,1.213,49,1 +10,122,68,0,0,31.2,0.258,41,0 +0,165,90,33,680,52.3,0.427,23,0 +9,124,70,33,402,35.4,0.282,34,0 +1,111,86,19,0,30.1,0.143,23,0 +9,106,52,0,0,31.2,0.380,42,0 +2,129,84,0,0,28.0,0.284,27,0 +2,90,80,14,55,24.4,0.249,24,0 +0,86,68,32,0,35.8,0.238,25,0 +12,92,62,7,258,27.6,0.926,44,1 +1,113,64,35,0,33.6,0.543,21,1 +3,111,56,39,0,30.1,0.557,30,0 +2,114,68,22,0,28.7,0.092,25,0 +1,193,50,16,375,25.9,0.655,24,0 +11,155,76,28,150,33.3,1.353,51,1 +3,191,68,15,130,30.9,0.299,34,0 +3,141,0,0,0,30.0,0.761,27,1 +4,95,70,32,0,32.1,0.612,24,0 +3,142,80,15,0,32.4,0.200,63,0 +4,123,62,0,0,32.0,0.226,35,1 +5,96,74,18,67,33.6,0.997,43,0 +0,138,0,0,0,36.3,0.933,25,1 +2,128,64,42,0,40.0,1.101,24,0 +0,102,52,0,0,25.1,0.078,21,0 +2,146,0,0,0,27.5,0.240,28,1 +10,101,86,37,0,45.6,1.136,38,1 +2,108,62,32,56,25.2,0.128,21,0 +3,122,78,0,0,23.0,0.254,40,0 +1,71,78,50,45,33.2,0.422,21,0 +13,106,70,0,0,34.2,0.251,52,0 +2,100,70,52,57,40.5,0.677,25,0 +7,106,60,24,0,26.5,0.296,29,1 +0,104,64,23,116,27.8,0.454,23,0 +5,114,74,0,0,24.9,0.744,57,0 +2,108,62,10,278,25.3,0.881,22,0 +0,146,70,0,0,37.9,0.334,28,1 +10,129,76,28,122,35.9,0.280,39,0 +7,133,88,15,155,32.4,0.262,37,0 +7,161,86,0,0,30.4,0.165,47,1 +2,108,80,0,0,27.0,0.259,52,1 +7,136,74,26,135,26.0,0.647,51,0 +5,155,84,44,545,38.7,0.619,34,0 +1,119,86,39,220,45.6,0.808,29,1 +4,96,56,17,49,20.8,0.340,26,0 +5,108,72,43,75,36.1,0.263,33,0 +0,78,88,29,40,36.9,0.434,21,0 +0,107,62,30,74,36.6,0.757,25,1 +2,128,78,37,182,43.3,1.224,31,1 +1,128,48,45,194,40.5,0.613,24,1 +0,161,50,0,0,21.9,0.254,65,0 +6,151,62,31,120,35.5,0.692,28,0 +2,146,70,38,360,28.0,0.337,29,1 +0,126,84,29,215,30.7,0.520,24,0 +14,100,78,25,184,36.6,0.412,46,1 +8,112,72,0,0,23.6,0.840,58,0 +0,167,0,0,0,32.3,0.839,30,1 +2,144,58,33,135,31.6,0.422,25,1 +5,77,82,41,42,35.8,0.156,35,0 +5,115,98,0,0,52.9,0.209,28,1 +3,150,76,0,0,21.0,0.207,37,0 +2,120,76,37,105,39.7,0.215,29,0 +10,161,68,23,132,25.5,0.326,47,1 +0,137,68,14,148,24.8,0.143,21,0 +0,128,68,19,180,30.5,1.391,25,1 +2,124,68,28,205,32.9,0.875,30,1 +6,80,66,30,0,26.2,0.313,41,0 +0,106,70,37,148,39.4,0.605,22,0 +2,155,74,17,96,26.6,0.433,27,1 +3,113,50,10,85,29.5,0.626,25,0 +7,109,80,31,0,35.9,1.127,43,1 +2,112,68,22,94,34.1,0.315,26,0 +3,99,80,11,64,19.3,0.284,30,0 +3,182,74,0,0,30.5,0.345,29,1 +3,115,66,39,140,38.1,0.150,28,0 +6,194,78,0,0,23.5,0.129,59,1 +4,129,60,12,231,27.5,0.527,31,0 +3,112,74,30,0,31.6,0.197,25,1 +0,124,70,20,0,27.4,0.254,36,1 +13,152,90,33,29,26.8,0.731,43,1 +2,112,75,32,0,35.7,0.148,21,0 +1,157,72,21,168,25.6,0.123,24,0 +1,122,64,32,156,35.1,0.692,30,1 +10,179,70,0,0,35.1,0.200,37,0 +2,102,86,36,120,45.5,0.127,23,1 +6,105,70,32,68,30.8,0.122,37,0 +8,118,72,19,0,23.1,1.476,46,0 +2,87,58,16,52,32.7,0.166,25,0 +1,180,0,0,0,43.3,0.282,41,1 +12,106,80,0,0,23.6,0.137,44,0 +1,95,60,18,58,23.9,0.260,22,0 +0,165,76,43,255,47.9,0.259,26,0 +0,117,0,0,0,33.8,0.932,44,0 +5,115,76,0,0,31.2,0.343,44,1 +9,152,78,34,171,34.2,0.893,33,1 +7,178,84,0,0,39.9,0.331,41,1 +1,130,70,13,105,25.9,0.472,22,0 +1,95,74,21,73,25.9,0.673,36,0 +1,0,68,35,0,32.0,0.389,22,0 +5,122,86,0,0,34.7,0.290,33,0 +8,95,72,0,0,36.8,0.485,57,0 +8,126,88,36,108,38.5,0.349,49,0 +1,139,46,19,83,28.7,0.654,22,0 +3,116,0,0,0,23.5,0.187,23,0 +3,99,62,19,74,21.8,0.279,26,0 +5,0,80,32,0,41.0,0.346,37,1 +4,92,80,0,0,42.2,0.237,29,0 +4,137,84,0,0,31.2,0.252,30,0 +3,61,82,28,0,34.4,0.243,46,0 +1,90,62,12,43,27.2,0.580,24,0 +3,90,78,0,0,42.7,0.559,21,0 +9,165,88,0,0,30.4,0.302,49,1 +1,125,50,40,167,33.3,0.962,28,1 +13,129,0,30,0,39.9,0.569,44,1 +12,88,74,40,54,35.3,0.378,48,0 +1,196,76,36,249,36.5,0.875,29,1 +5,189,64,33,325,31.2,0.583,29,1 +5,158,70,0,0,29.8,0.207,63,0 +5,103,108,37,0,39.2,0.305,65,0 +4,146,78,0,0,38.5,0.520,67,1 +4,147,74,25,293,34.9,0.385,30,0 +5,99,54,28,83,34.0,0.499,30,0 +6,124,72,0,0,27.6,0.368,29,1 +0,101,64,17,0,21.0,0.252,21,0 +3,81,86,16,66,27.5,0.306,22,0 +1,133,102,28,140,32.8,0.234,45,1 +3,173,82,48,465,38.4,2.137,25,1 +0,118,64,23,89,0.0,1.731,21,0 +0,84,64,22,66,35.8,0.545,21,0 +2,105,58,40,94,34.9,0.225,25,0 +2,122,52,43,158,36.2,0.816,28,0 +12,140,82,43,325,39.2,0.528,58,1 +0,98,82,15,84,25.2,0.299,22,0 +1,87,60,37,75,37.2,0.509,22,0 +4,156,75,0,0,48.3,0.238,32,1 +0,93,100,39,72,43.4,1.021,35,0 +1,107,72,30,82,30.8,0.821,24,0 +0,105,68,22,0,20.0,0.236,22,0 +1,109,60,8,182,25.4,0.947,21,0 +1,90,62,18,59,25.1,1.268,25,0 +1,125,70,24,110,24.3,0.221,25,0 +1,119,54,13,50,22.3,0.205,24,0 +5,116,74,29,0,32.3,0.660,35,1 +8,105,100,36,0,43.3,0.239,45,1 +5,144,82,26,285,32.0,0.452,58,1 +3,100,68,23,81,31.6,0.949,28,0 +1,100,66,29,196,32.0,0.444,42,0 +5,166,76,0,0,45.7,0.340,27,1 +1,131,64,14,415,23.7,0.389,21,0 +4,116,72,12,87,22.1,0.463,37,0 +4,158,78,0,0,32.9,0.803,31,1 +2,127,58,24,275,27.7,1.600,25,0 +3,96,56,34,115,24.7,0.944,39,0 +0,131,66,40,0,34.3,0.196,22,1 +3,82,70,0,0,21.1,0.389,25,0 +3,193,70,31,0,34.9,0.241,25,1 +4,95,64,0,0,32.0,0.161,31,1 +6,137,61,0,0,24.2,0.151,55,0 +5,136,84,41,88,35.0,0.286,35,1 +9,72,78,25,0,31.6,0.280,38,0 +5,168,64,0,0,32.9,0.135,41,1 +2,123,48,32,165,42.1,0.520,26,0 +4,115,72,0,0,28.9,0.376,46,1 +0,101,62,0,0,21.9,0.336,25,0 +8,197,74,0,0,25.9,1.191,39,1 +1,172,68,49,579,42.4,0.702,28,1 +6,102,90,39,0,35.7,0.674,28,0 +1,112,72,30,176,34.4,0.528,25,0 +1,143,84,23,310,42.4,1.076,22,0 +1,143,74,22,61,26.2,0.256,21,0 +0,138,60,35,167,34.6,0.534,21,1 +3,173,84,33,474,35.7,0.258,22,1 +1,97,68,21,0,27.2,1.095,22,0 +4,144,82,32,0,38.5,0.554,37,1 +1,83,68,0,0,18.2,0.624,27,0 +3,129,64,29,115,26.4,0.219,28,1 +1,119,88,41,170,45.3,0.507,26,0 +2,94,68,18,76,26.0,0.561,21,0 +0,102,64,46,78,40.6,0.496,21,0 +2,115,64,22,0,30.8,0.421,21,0 +8,151,78,32,210,42.9,0.516,36,1 +4,184,78,39,277,37.0,0.264,31,1 +0,94,0,0,0,0.0,0.256,25,0 +1,181,64,30,180,34.1,0.328,38,1 +0,135,94,46,145,40.6,0.284,26,0 +1,95,82,25,180,35.0,0.233,43,1 +2,99,0,0,0,22.2,0.108,23,0 +3,89,74,16,85,30.4,0.551,38,0 +1,80,74,11,60,30.0,0.527,22,0 +2,139,75,0,0,25.6,0.167,29,0 +1,90,68,8,0,24.5,1.138,36,0 +0,141,0,0,0,42.4,0.205,29,1 +12,140,85,33,0,37.4,0.244,41,0 +5,147,75,0,0,29.9,0.434,28,0 +1,97,70,15,0,18.2,0.147,21,0 +6,107,88,0,0,36.8,0.727,31,0 +0,189,104,25,0,34.3,0.435,41,1 +2,83,66,23,50,32.2,0.497,22,0 +4,117,64,27,120,33.2,0.230,24,0 +8,108,70,0,0,30.5,0.955,33,1 +4,117,62,12,0,29.7,0.380,30,1 +0,180,78,63,14,59.4,2.420,25,1 +1,100,72,12,70,25.3,0.658,28,0 +0,95,80,45,92,36.5,0.330,26,0 +0,104,64,37,64,33.6,0.510,22,1 +0,120,74,18,63,30.5,0.285,26,0 +1,82,64,13,95,21.2,0.415,23,0 +2,134,70,0,0,28.9,0.542,23,1 +0,91,68,32,210,39.9,0.381,25,0 +2,119,0,0,0,19.6,0.832,72,0 +2,100,54,28,105,37.8,0.498,24,0 +14,175,62,30,0,33.6,0.212,38,1 +1,135,54,0,0,26.7,0.687,62,0 +5,86,68,28,71,30.2,0.364,24,0 +10,148,84,48,237,37.6,1.001,51,1 +9,134,74,33,60,25.9,0.460,81,0 +9,120,72,22,56,20.8,0.733,48,0 +1,71,62,0,0,21.8,0.416,26,0 +8,74,70,40,49,35.3,0.705,39,0 +5,88,78,30,0,27.6,0.258,37,0 +10,115,98,0,0,24.0,1.022,34,0 +0,124,56,13,105,21.8,0.452,21,0 +0,74,52,10,36,27.8,0.269,22,0 +0,97,64,36,100,36.8,0.600,25,0 +8,120,0,0,0,30.0,0.183,38,1 +6,154,78,41,140,46.1,0.571,27,0 +1,144,82,40,0,41.3,0.607,28,0 +0,137,70,38,0,33.2,0.170,22,0 +0,119,66,27,0,38.8,0.259,22,0 +7,136,90,0,0,29.9,0.210,50,0 +4,114,64,0,0,28.9,0.126,24,0 +0,137,84,27,0,27.3,0.231,59,0 +2,105,80,45,191,33.7,0.711,29,1 +7,114,76,17,110,23.8,0.466,31,0 +8,126,74,38,75,25.9,0.162,39,0 +4,132,86,31,0,28.0,0.419,63,0 +3,158,70,30,328,35.5,0.344,35,1 +0,123,88,37,0,35.2,0.197,29,0 +4,85,58,22,49,27.8,0.306,28,0 +0,84,82,31,125,38.2,0.233,23,0 +0,145,0,0,0,44.2,0.630,31,1 +0,135,68,42,250,42.3,0.365,24,1 +1,139,62,41,480,40.7,0.536,21,0 +0,173,78,32,265,46.5,1.159,58,0 +4,99,72,17,0,25.6,0.294,28,0 +8,194,80,0,0,26.1,0.551,67,0 +2,83,65,28,66,36.8,0.629,24,0 +2,89,90,30,0,33.5,0.292,42,0 +4,99,68,38,0,32.8,0.145,33,0 +4,125,70,18,122,28.9,1.144,45,1 +3,80,0,0,0,0.0,0.174,22,0 +6,166,74,0,0,26.6,0.304,66,0 +5,110,68,0,0,26.0,0.292,30,0 +2,81,72,15,76,30.1,0.547,25,0 +7,195,70,33,145,25.1,0.163,55,1 +6,154,74,32,193,29.3,0.839,39,0 +2,117,90,19,71,25.2,0.313,21,0 +3,84,72,32,0,37.2,0.267,28,0 +6,0,68,41,0,39.0,0.727,41,1 +7,94,64,25,79,33.3,0.738,41,0 +3,96,78,39,0,37.3,0.238,40,0 +10,75,82,0,0,33.3,0.263,38,0 +0,180,90,26,90,36.5,0.314,35,1 +1,130,60,23,170,28.6,0.692,21,0 +2,84,50,23,76,30.4,0.968,21,0 +8,120,78,0,0,25.0,0.409,64,0 +12,84,72,31,0,29.7,0.297,46,1 +0,139,62,17,210,22.1,0.207,21,0 +9,91,68,0,0,24.2,0.200,58,0 +2,91,62,0,0,27.3,0.525,22,0 +3,99,54,19,86,25.6,0.154,24,0 +3,163,70,18,105,31.6,0.268,28,1 +9,145,88,34,165,30.3,0.771,53,1 +7,125,86,0,0,37.6,0.304,51,0 +13,76,60,0,0,32.8,0.180,41,0 +6,129,90,7,326,19.6,0.582,60,0 +2,68,70,32,66,25.0,0.187,25,0 +3,124,80,33,130,33.2,0.305,26,0 +6,114,0,0,0,0.0,0.189,26,0 +9,130,70,0,0,34.2,0.652,45,1 +3,125,58,0,0,31.6,0.151,24,0 +3,87,60,18,0,21.8,0.444,21,0 +1,97,64,19,82,18.2,0.299,21,0 +3,116,74,15,105,26.3,0.107,24,0 +0,117,66,31,188,30.8,0.493,22,0 +0,111,65,0,0,24.6,0.660,31,0 +2,122,60,18,106,29.8,0.717,22,0 +0,107,76,0,0,45.3,0.686,24,0 +1,86,66,52,65,41.3,0.917,29,0 +6,91,0,0,0,29.8,0.501,31,0 +1,77,56,30,56,33.3,1.251,24,0 +4,132,0,0,0,32.9,0.302,23,1 +0,105,90,0,0,29.6,0.197,46,0 +0,57,60,0,0,21.7,0.735,67,0 +0,127,80,37,210,36.3,0.804,23,0 +3,129,92,49,155,36.4,0.968,32,1 +8,100,74,40,215,39.4,0.661,43,1 +3,128,72,25,190,32.4,0.549,27,1 +10,90,85,32,0,34.9,0.825,56,1 +4,84,90,23,56,39.5,0.159,25,0 +1,88,78,29,76,32.0,0.365,29,0 +8,186,90,35,225,34.5,0.423,37,1 +5,187,76,27,207,43.6,1.034,53,1 +4,131,68,21,166,33.1,0.160,28,0 +1,164,82,43,67,32.8,0.341,50,0 +4,189,110,31,0,28.5,0.680,37,0 +1,116,70,28,0,27.4,0.204,21,0 +3,84,68,30,106,31.9,0.591,25,0 +6,114,88,0,0,27.8,0.247,66,0 +1,88,62,24,44,29.9,0.422,23,0 +1,84,64,23,115,36.9,0.471,28,0 +7,124,70,33,215,25.5,0.161,37,0 +1,97,70,40,0,38.1,0.218,30,0 +8,110,76,0,0,27.8,0.237,58,0 +11,103,68,40,0,46.2,0.126,42,0 +11,85,74,0,0,30.1,0.300,35,0 +6,125,76,0,0,33.8,0.121,54,1 +0,198,66,32,274,41.3,0.502,28,1 +1,87,68,34,77,37.6,0.401,24,0 +6,99,60,19,54,26.9,0.497,32,0 +0,91,80,0,0,32.4,0.601,27,0 +2,95,54,14,88,26.1,0.748,22,0 +1,99,72,30,18,38.6,0.412,21,0 +6,92,62,32,126,32.0,0.085,46,0 +4,154,72,29,126,31.3,0.338,37,0 +0,121,66,30,165,34.3,0.203,33,1 +3,78,70,0,0,32.5,0.270,39,0 +2,130,96,0,0,22.6,0.268,21,0 +3,111,58,31,44,29.5,0.430,22,0 +2,98,60,17,120,34.7,0.198,22,0 +1,143,86,30,330,30.1,0.892,23,0 +1,119,44,47,63,35.5,0.280,25,0 +6,108,44,20,130,24.0,0.813,35,0 +2,118,80,0,0,42.9,0.693,21,1 +10,133,68,0,0,27.0,0.245,36,0 +2,197,70,99,0,34.7,0.575,62,1 +0,151,90,46,0,42.1,0.371,21,1 +6,109,60,27,0,25.0,0.206,27,0 +12,121,78,17,0,26.5,0.259,62,0 +8,100,76,0,0,38.7,0.190,42,0 +8,124,76,24,600,28.7,0.687,52,1 +1,93,56,11,0,22.5,0.417,22,0 +8,143,66,0,0,34.9,0.129,41,1 +6,103,66,0,0,24.3,0.249,29,0 +3,176,86,27,156,33.3,1.154,52,1 +0,73,0,0,0,21.1,0.342,25,0 +11,111,84,40,0,46.8,0.925,45,1 +2,112,78,50,140,39.4,0.175,24,0 +3,132,80,0,0,34.4,0.402,44,1 +2,82,52,22,115,28.5,1.699,25,0 +6,123,72,45,230,33.6,0.733,34,0 +0,188,82,14,185,32.0,0.682,22,1 +0,67,76,0,0,45.3,0.194,46,0 +1,89,24,19,25,27.8,0.559,21,0 +1,173,74,0,0,36.8,0.088,38,1 +1,109,38,18,120,23.1,0.407,26,0 +1,108,88,19,0,27.1,0.400,24,0 +6,96,0,0,0,23.7,0.190,28,0 +1,124,74,36,0,27.8,0.100,30,0 +7,150,78,29,126,35.2,0.692,54,1 +4,183,0,0,0,28.4,0.212,36,1 +1,124,60,32,0,35.8,0.514,21,0 +1,181,78,42,293,40.0,1.258,22,1 +1,92,62,25,41,19.5,0.482,25,0 +0,152,82,39,272,41.5,0.270,27,0 +1,111,62,13,182,24.0,0.138,23,0 +3,106,54,21,158,30.9,0.292,24,0 +3,174,58,22,194,32.9,0.593,36,1 +7,168,88,42,321,38.2,0.787,40,1 +6,105,80,28,0,32.5,0.878,26,0 +11,138,74,26,144,36.1,0.557,50,1 +3,106,72,0,0,25.8,0.207,27,0 +6,117,96,0,0,28.7,0.157,30,0 +2,68,62,13,15,20.1,0.257,23,0 +9,112,82,24,0,28.2,1.282,50,1 +0,119,0,0,0,32.4,0.141,24,1 +2,112,86,42,160,38.4,0.246,28,0 +2,92,76,20,0,24.2,1.698,28,0 +6,183,94,0,0,40.8,1.461,45,0 +0,94,70,27,115,43.5,0.347,21,0 +2,108,64,0,0,30.8,0.158,21,0 +4,90,88,47,54,37.7,0.362,29,0 +0,125,68,0,0,24.7,0.206,21,0 +0,132,78,0,0,32.4,0.393,21,0 +5,128,80,0,0,34.6,0.144,45,0 +4,94,65,22,0,24.7,0.148,21,0 +7,114,64,0,0,27.4,0.732,34,1 +0,102,78,40,90,34.5,0.238,24,0 +2,111,60,0,0,26.2,0.343,23,0 +1,128,82,17,183,27.5,0.115,22,0 +10,92,62,0,0,25.9,0.167,31,0 +13,104,72,0,0,31.2,0.465,38,1 +5,104,74,0,0,28.8,0.153,48,0 +2,94,76,18,66,31.6,0.649,23,0 +7,97,76,32,91,40.9,0.871,32,1 +1,100,74,12,46,19.5,0.149,28,0 +0,102,86,17,105,29.3,0.695,27,0 +4,128,70,0,0,34.3,0.303,24,0 +6,147,80,0,0,29.5,0.178,50,1 +4,90,0,0,0,28.0,0.610,31,0 +3,103,72,30,152,27.6,0.730,27,0 +2,157,74,35,440,39.4,0.134,30,0 +1,167,74,17,144,23.4,0.447,33,1 +0,179,50,36,159,37.8,0.455,22,1 +11,136,84,35,130,28.3,0.260,42,1 +0,107,60,25,0,26.4,0.133,23,0 +1,91,54,25,100,25.2,0.234,23,0 +1,117,60,23,106,33.8,0.466,27,0 +5,123,74,40,77,34.1,0.269,28,0 +2,120,54,0,0,26.8,0.455,27,0 +1,106,70,28,135,34.2,0.142,22,0 +2,155,52,27,540,38.7,0.240,25,1 +2,101,58,35,90,21.8,0.155,22,0 +1,120,80,48,200,38.9,1.162,41,0 +11,127,106,0,0,39.0,0.190,51,0 +3,80,82,31,70,34.2,1.292,27,1 +10,162,84,0,0,27.7,0.182,54,0 +1,199,76,43,0,42.9,1.394,22,1 +8,167,106,46,231,37.6,0.165,43,1 +9,145,80,46,130,37.9,0.637,40,1 +6,115,60,39,0,33.7,0.245,40,1 +1,112,80,45,132,34.8,0.217,24,0 +4,145,82,18,0,32.5,0.235,70,1 +10,111,70,27,0,27.5,0.141,40,1 +6,98,58,33,190,34.0,0.430,43,0 +9,154,78,30,100,30.9,0.164,45,0 +6,165,68,26,168,33.6,0.631,49,0 +1,99,58,10,0,25.4,0.551,21,0 +10,68,106,23,49,35.5,0.285,47,0 +3,123,100,35,240,57.3,0.880,22,0 +8,91,82,0,0,35.6,0.587,68,0 +6,195,70,0,0,30.9,0.328,31,1 +9,156,86,0,0,24.8,0.230,53,1 +0,93,60,0,0,35.3,0.263,25,0 +3,121,52,0,0,36.0,0.127,25,1 +2,101,58,17,265,24.2,0.614,23,0 +2,56,56,28,45,24.2,0.332,22,0 +0,162,76,36,0,49.6,0.364,26,1 +0,95,64,39,105,44.6,0.366,22,0 +4,125,80,0,0,32.3,0.536,27,1 +5,136,82,0,0,0.0,0.640,69,0 +2,129,74,26,205,33.2,0.591,25,0 +3,130,64,0,0,23.1,0.314,22,0 +1,107,50,19,0,28.3,0.181,29,0 +1,140,74,26,180,24.1,0.828,23,0 +1,144,82,46,180,46.1,0.335,46,1 +8,107,80,0,0,24.6,0.856,34,0 +13,158,114,0,0,42.3,0.257,44,1 +2,121,70,32,95,39.1,0.886,23,0 +7,129,68,49,125,38.5,0.439,43,1 +2,90,60,0,0,23.5,0.191,25,0 +7,142,90,24,480,30.4,0.128,43,1 +3,169,74,19,125,29.9,0.268,31,1 +0,99,0,0,0,25.0,0.253,22,0 +4,127,88,11,155,34.5,0.598,28,0 +4,118,70,0,0,44.5,0.904,26,0 +2,122,76,27,200,35.9,0.483,26,0 +6,125,78,31,0,27.6,0.565,49,1 +1,168,88,29,0,35.0,0.905,52,1 +2,129,0,0,0,38.5,0.304,41,0 +4,110,76,20,100,28.4,0.118,27,0 +6,80,80,36,0,39.8,0.177,28,0 +10,115,0,0,0,0.0,0.261,30,1 +2,127,46,21,335,34.4,0.176,22,0 +9,164,78,0,0,32.8,0.148,45,1 +2,93,64,32,160,38.0,0.674,23,1 +3,158,64,13,387,31.2,0.295,24,0 +5,126,78,27,22,29.6,0.439,40,0 +10,129,62,36,0,41.2,0.441,38,1 +0,134,58,20,291,26.4,0.352,21,0 +3,102,74,0,0,29.5,0.121,32,0 +7,187,50,33,392,33.9,0.826,34,1 +3,173,78,39,185,33.8,0.970,31,1 +10,94,72,18,0,23.1,0.595,56,0 +1,108,60,46,178,35.5,0.415,24,0 +5,97,76,27,0,35.6,0.378,52,1 +4,83,86,19,0,29.3,0.317,34,0 +1,114,66,36,200,38.1,0.289,21,0 +1,149,68,29,127,29.3,0.349,42,1 +5,117,86,30,105,39.1,0.251,42,0 +1,111,94,0,0,32.8,0.265,45,0 +4,112,78,40,0,39.4,0.236,38,0 +1,116,78,29,180,36.1,0.496,25,0 +0,141,84,26,0,32.4,0.433,22,0 +2,175,88,0,0,22.9,0.326,22,0 +2,92,52,0,0,30.1,0.141,22,0 +3,130,78,23,79,28.4,0.323,34,1 +8,120,86,0,0,28.4,0.259,22,1 +2,174,88,37,120,44.5,0.646,24,1 +2,106,56,27,165,29.0,0.426,22,0 +2,105,75,0,0,23.3,0.560,53,0 +4,95,60,32,0,35.4,0.284,28,0 +0,126,86,27,120,27.4,0.515,21,0 +8,65,72,23,0,32.0,0.600,42,0 +2,99,60,17,160,36.6,0.453,21,0 +1,102,74,0,0,39.5,0.293,42,1 +11,120,80,37,150,42.3,0.785,48,1 +3,102,44,20,94,30.8,0.400,26,0 +1,109,58,18,116,28.5,0.219,22,0 +9,140,94,0,0,32.7,0.734,45,1 +13,153,88,37,140,40.6,1.174,39,0 +12,100,84,33,105,30.0,0.488,46,0 +1,147,94,41,0,49.3,0.358,27,1 +1,81,74,41,57,46.3,1.096,32,0 +3,187,70,22,200,36.4,0.408,36,1 +6,162,62,0,0,24.3,0.178,50,1 +4,136,70,0,0,31.2,1.182,22,1 +1,121,78,39,74,39.0,0.261,28,0 +3,108,62,24,0,26.0,0.223,25,0 +0,181,88,44,510,43.3,0.222,26,1 +8,154,78,32,0,32.4,0.443,45,1 +1,128,88,39,110,36.5,1.057,37,1 +7,137,90,41,0,32.0,0.391,39,0 +0,123,72,0,0,36.3,0.258,52,1 +1,106,76,0,0,37.5,0.197,26,0 +6,190,92,0,0,35.5,0.278,66,1 +2,88,58,26,16,28.4,0.766,22,0 +9,170,74,31,0,44.0,0.403,43,1 +9,89,62,0,0,22.5,0.142,33,0 +10,101,76,48,180,32.9,0.171,63,0 +2,122,70,27,0,36.8,0.340,27,0 +5,121,72,23,112,26.2,0.245,30,0 +1,126,60,0,0,30.1,0.349,47,1 +1,93,70,31,0,30.4,0.315,23,0 diff --git a/projects/8-chm-writeup/Deitelzweig.md b/projects/8-chm-writeup/Deitelzweig.md new file mode 100644 index 0000000..1a7e70a --- /dev/null +++ b/projects/8-chm-writeup/Deitelzweig.md @@ -0,0 +1 @@ +Recently, many companies have started to develop self-driving cars that they hope will occupy the roads in a few years. In the forefront of this development is Google. They have been working for years on accomplishing this, and in the last year or so, they have started to test drive these on the road. Google is not the only company that has this feature in cars. Tesla and many other cars have self-driving functions; however, many of them are just used for parking. Eventually, these companies hope that self-driving cars will be the only cars on the road, and they hope that it will make driving safer overall. If these cars are finished in the future, they will be able to be used by all people. These people also want to be safe when they drive on the road, so their goals are aligned with the creators. It will likely learn the rules of the road and also be trained statistically to learn new environments. They will have sensors that allow them to see their environment and therefore be able to react to stimuli. It interacts with humans because humans are the ones that give it controls of where to go. It can also be stopped in the event of failure. A hostile user could theoretically sabotage the system by intentionally turning it off in a dangerous situation or by jumping in front of the car. In this instance, the car may not know what to do. It also presents important moral dilemmas since the car must likely at some point decide which is more valuable in terms of lives, similar to the trolley problem. However, it still would likely present a much safer driving environment on the road since here is not room for human error as much. \ No newline at end of file