{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8VACQkcNO4a0" }, "source": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "7wUPVE6hTsOq" }, "source": [ "# **Problem Statement: **Implement Dyna-Q and reproduce the blocking maze and shortcut maze experiments (see page 135, 136 in Sutton & Barto) in Pycolab." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "MZ0KbuTo027H" }, "source": [ "## Dyna-Q is an architecture which integrates different modules needed while planning an agent on-line. It provides a platform to integrate learning, planning and acting." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "2I6BG5S6Pwte" }, "source": [ "**Installing Pycolab and Gym for our work**" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 326, "output_extras": [ { "item_id": 5 } ] }, "colab_type": "code", "executionInfo": { "elapsed": 6083, "status": "ok", "timestamp": 1519718330483, "user": { "displayName": "Khimya Khetarpal", "photoUrl": "//lh4.googleusercontent.com/-N2vm2KOF7iE/AAAAAAAAAAI/AAAAAAAACL8/3K7KcnaQmY0/s50-c-k-no/photo.jpg", "userId": "111336538593611088506" }, "user_tz": 300 }, "id": "0habow5OQAye", "outputId": "0c92b01a-13b8-4db4-a1ac-ace5ec0c1ce8" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting git+https://github.com/deepmind/pycolab.git\r\n", " Cloning https://github.com/deepmind/pycolab.git to /tmp/pip-AKfsmE-build\n", " Requirement already satisfied (use --upgrade to upgrade): pycolab==1.0 from git+https://github.com/deepmind/pycolab.git in /usr/local/lib/python2.7/dist-packages\n", "Requirement already satisfied: numpy>=1.9 in /usr/local/lib/python2.7/dist-packages (from pycolab==1.0)\n", "Requirement already satisfied: six in /usr/local/lib/python2.7/dist-packages (from pycolab==1.0)\n", "Collecting git+https://github.com/openai/gym.git\n", " Cloning https://github.com/openai/gym.git to /tmp/pip-6gSLlr-build\n", " Requirement already satisfied (use --upgrade to upgrade): gym==0.10.2 from git+https://github.com/openai/gym.git in /usr/local/lib/python2.7/dist-packages\n", "Requirement already satisfied: numpy>=1.10.4 in /usr/local/lib/python2.7/dist-packages (from gym==0.10.2)\n", "Requirement already satisfied: pyglet>=1.2.0 in /usr/local/lib/python2.7/dist-packages (from gym==0.10.2)\n", "Requirement already satisfied: requests>=2.0 in /usr/local/lib/python2.7/dist-packages (from gym==0.10.2)\n", "Requirement already satisfied: six in /usr/local/lib/python2.7/dist-packages (from gym==0.10.2)\n", "Requirement already satisfied: future in /usr/local/lib/python2.7/dist-packages (from pyglet>=1.2.0->gym==0.10.2)\n", "Requirement already satisfied: idna<2.7,>=2.5 in /usr/local/lib/python2.7/dist-packages (from requests>=2.0->gym==0.10.2)\n", "Requirement already satisfied: urllib3<1.23,>=1.21.1 in /usr/local/lib/python2.7/dist-packages (from requests>=2.0->gym==0.10.2)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python2.7/dist-packages (from requests>=2.0->gym==0.10.2)\n", "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python2.7/dist-packages (from requests>=2.0->gym==0.10.2)\n" ] } ], "source": [ "! pip install git+https://github.com/deepmind/pycolab.git\n", "! pip install git+https://github.com/openai/gym.git" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "r-Nn4ndW3eqe" }, "source": [ "# Pycolab Maze Environment with a Gym Wrapper" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 } }, "colab_type": "code", "collapsed": true, "id": "DXOP3C6A1p1O" }, "outputs": [], "source": [ "from __future__ import absolute_import\n", "from __future__ import division\n", "from __future__ import print_function\n", "\n", "import curses\n", "import sys\n", "import gym\n", "\n", "from pycolab import ascii_art\n", "from pycolab import human_ui\n", "from pycolab.prefab_parts import sprites as prefab_sprites\n", "\n", "class PlayerSprite(prefab_sprites.MazeWalker):\n", " \"\"\"A `Sprite` for our player.\n", "\n", " This `Sprite` ties actions to going in the four cardinal directions. If we\n", " reach the goal state (0,8), the agent receives a\n", " reward of 1 and the epsiode terminates.\n", " \"\"\"\n", "\n", " def __init__(self, corner, position, character):\n", " \"\"\"Inform superclass that we can't walk through walls.\"\"\"\n", " super(PlayerSprite, self).__init__(\n", " corner, position, character, impassable='#', confined_to_board=True)\n", "\n", " def update(self, actions, board, layers, backdrop, things, the_plot):\n", " del layers, backdrop, things # Unused.\n", "\n", " # Apply motion commands.\n", " if actions == 0: # walk upward?\n", " self._north(board, the_plot)\n", " elif actions == 1: # walk downward?\n", " self._south(board, the_plot)\n", " elif actions == 2: # walk leftward?\n", " self._west(board, the_plot)\n", " elif actions == 3: # walk rightward?\n", " self._east(board, the_plot)\n", "\n", " # # See if we've found the mystery spot.\n", " if self.position == (0, 8):\n", " the_plot.add_reward(1)\n", " the_plot.terminate_episode()\n", " else:\n", " the_plot.add_reward(0)\n", " \n", "\n", "# The game art for the case where \n", "# the path on the left is open. \n", "LEFT_OPEN_GAME_ART = \\\n", " [' G',\n", " ' ',\n", " ' ',\n", " ' ########',\n", " ' ',\n", " ' P ']\n", "\n", "\n", "# The game art for the case where \n", "# the path on the right is open. \n", "RIGHT_OPEN_GAME_ART = \\\n", " [' G',\n", " ' ',\n", " ' ',\n", " '######## ',\n", " ' ',\n", " ' P ']\n", " \n", "\n", "# The game art for the case where the path\n", "# on both the right and left are open. \n", "BOTH_OPEN_GAME_ART = \\\n", " [' G',\n", " ' ',\n", " ' ',\n", " ' ####### ',\n", " ' ',\n", " ' P ']\n", " \n", " \n", "def get_game_art(type):\n", " \"\"\" Return game art based on type.\n", " \n", " Args:\n", " type: Type of game art. \n", " left => left open.\n", " right => right open.\n", " both => both left and right open.\n", " \n", " Returns:\n", " The game art based on type.\n", " \n", " Raises:\n", " ValueError if value not in ('left','right', 'both').\n", " \"\"\"\n", " if type == 'left':\n", " return LEFT_OPEN_GAME_ART\n", " if type == 'right':\n", " return RIGHT_OPEN_GAME_ART\n", " if type == 'both':\n", " return BOTH_OPEN_GAME_ART\n", " raise ValueError(\"type must be one of ['left','right', 'both']. Given: \" + type)\n", " \n", " \n", "class BlockedMaze(gym.Env):\n", " \"\"\" Gym wrapper around BlockedMaze environment constructed in pycolab. \n", " \"\"\"\n", " def __init__(self, game_type):\n", " \"\"\" Init BlockedMaze environment.\n", " \n", " Args:\n", " game_type: Possible values (\"left\", \"right\", \"both\").\n", " \"\"\"\n", " self.game_type = game_type\n", " self.game= ascii_art.ascii_art_to_game(\n", " get_game_art(game_type), what_lies_beneath=' ',\n", " sprites={'P': PlayerSprite})\n", " self.action_space = range(4)\n", " self.observation_space = range(54)\n", " obs, reward, gamma = self.game.its_showtime()\n", " self.inital_obs = obs\n", " \n", " def step(self, action):\n", " \"\"\" Take given action and return the next state observation and reward.\n", " \"\"\"\n", " obs, reward, gamma = self.game.play(action)\n", " return obs, reward, self.game.game_over, \"\"\n", " \n", " def reset(self):\n", " \"\"\" Resets the game and returns the observation for the start state.\n", " \"\"\"\n", " self.game= ascii_art.ascii_art_to_game(\n", " get_game_art(self.game_type), what_lies_beneath=' ',\n", " sprites={'P': PlayerSprite})\n", " obs, reward, gamma = self.game.its_showtime()\n", " self.intial_obs = obs\n", " return obs\n", "\n", "def obsv2state(obs):\n", " \"\"\" Convert pycolab's observation to int state. \n", " The state is flattened in our case and is (0,54).\n", " \n", " Args:\n", " obs: Pycolab's Observation object. \n", " \n", " Returns:\n", " Integer state from (0,54). \n", " \"\"\"\n", " state = np.array(obs.layers['P'], dtype=np.float).flatten()\n", " states = np.flatnonzero(state)\n", " assert len(states) == 1, \"There should be just one P.\"\n", " return states[0]\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "V2YJqtnX1rgL" }, "source": [ "# Dyna-Q Algorithm Implementation" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 } }, "colab_type": "code", "collapsed": true, "id": "H0ByyxpBHcFb" }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "def plot(x,y,xlabel,ylabel, legend, title):\n", " \"\"\"Plots y vs x marking x-axis with xlabel and y-axis with ylabel.\n", " \n", " Args:\n", " x: 1-D array like data to be plotted on x-axis.\n", " y: 1-D array like data to be plotted on y-axis.\n", " xlabel: Label for x-axis.\n", " ylabel: Label for y-axis.\n", " \"\"\"\n", " plt.plot(x,y, linewidth=3, color=\"red\")\n", " plt.xlabel(xlabel, fontsize=14)\n", " plt.ylabel(ylabel, fontsize=14)\n", " plt.title(title, fontsize=14)\n", " plt.legend(legend, prop={'size': 16}, loc='upper left', fancybox=True, framealpha=0.5)\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 } }, "colab_type": "code", "collapsed": true, "id": "VtLGyQTj-gQh" }, "outputs": [], "source": [ "from pycolab.examples.classics import four_rooms as env\n", "from pycolab.rendering import ObservationToFeatureArray\n", "import numpy as np\n", "import random\n", "import matplotlib.pyplot as plt\n", "\n", "# Hyper parameters for expirements.\n", "params = {\n", " 'gamma': 0.95,\n", " 'alpha': 0.1,\n", " 'epsilon': 0.1,\n", " 'episodes': 200, \n", " 'runs': 10, \n", " 'max_steps': 3000\n", "}\n", "\n", "# Range of planning steps to try.\n", "planning_nsteps = [0, 5, 50]\n", "\n", "class Model(object):\n", " \"\"\"Model class that returns next state, observation \n", " when presented with current state and action.\"\"\"\n", " \n", " def __init__(self):\n", " \"\"\"Init model class\"\"\"\n", " self.model = {} # (state, action) -> (next_state, reward)\n", " \n", " def set(self, state, action, next_state, reward):\n", " \"\"\" Store (next_state, reward) information for given (state, action).\n", " \n", " Args:\n", " state: int-type value of current state.\n", " action: int-type value of current action.\n", " next_state: int-type next state returned by the environment when \n", " action is presented.\n", " reward: float-type reward returned by the environment when action is \n", " presented.\n", " \"\"\"\n", " self.model[(state, action)] = (next_state, reward)\n", " \n", " def get(self, state, action):\n", " \"\"\" Returns next_state, reward stored for (state, action). \n", " If no entry found for (state, action), it returns (None, None).\n", " This should never happen.\n", " \n", " Args:\n", " state: int-type value of the current state.\n", " action: int-type value of the action action.\n", " \n", " Returns:\n", " next_state: int-type value for the next_state most recently seen for \n", " (state, action) pair.\n", " reward: float-type value for the reward most recently seen for \n", " (state, action) pair.\n", " \"\"\"\n", " return self.model.get((state, action), (None, None))\n", " \n", " def keys(self):\n", " \"Return all the (state, action) pair stored in model.\"\n", " return self.model.keys()\n", " \n", " def reset(self):\n", " \"Clear the model. Delete all stored (state, action) pairs.\"\n", " self.model.clear()\n", " \n", "class DynaQ(object):\n", " \"\"\"DynaQ implementation class. run(.) method runs the DynaQ algorithm.\"\"\"\n", " \n", " def __init__(self, params, model, action_space, state_space, rng):\n", " \"\"\" Init DynaQ object\n", " \n", " Args:\n", " params: Hyperparameters for the DynaQ model.\n", " model: Model of the world.\n", " action_spaces: 1D int array. Range of possible actions.\n", " state_space: 1D int array. Range of possible states.\n", " rng: Random Number Generator.\n", " \"\"\"\n", " self.params = params\n", " self.model = model\n", " self.rng = rng\n", " \n", " self.action_space = action_space\n", " self.state_space = state_space\n", " \n", " self.Q = np.zeros((len(self.state_space), len(self.action_space)))\n", " \n", " def run(self, initial_state, maze, planning_nsteps=0):\n", " \"\"\"Run DynaQ algorithm. \n", " \n", " Args:\n", " initial_state: Value on the start state.\n", " maze: Gym type object of one of the mazes.\n", " planning_nsteps: Number of times to do planning.\n", " \"\"\"\n", " state = initial_state\n", " step = 0\n", " totalreward = 0\n", " done = False\n", " while not done:\n", " step += 1\n", " action = self._get_action(state)\n", " state, reward, done = self._run_step(state, action, maze, planning_nsteps)\n", " totalreward += reward\n", " return step, totalreward\n", " \n", " def _run_step(self, state, action, maze, planning_nsteps):\n", " \"\"\" Run a single DynaQ step. \n", " This function samples the environment, updates the Q value,\n", " updates the model and then uses model to update Q value planning_nsteps\n", " time.\n", " \n", " Args:\n", " state: Current state on the world.\n", " action: Action to be taken.\n", " maze: Gym type object of one of the mazes.\n", " planning_nsteps: Number of times to do planning.\n", " \"\"\"\n", " obs, orig_reward, done, _ = maze.step(action)\n", " next_state = obsv2state(obs)\n", " self._updateQ(state, action, orig_reward, next_state)\n", " self.model.set(state, action, next_state, orig_reward)\n", " \n", " for n in range(planning_nsteps):\n", " obs_state_actions = self.model.keys()\n", " index = self.rng.choice(len(obs_state_actions))\n", " state, action = obs_state_actions[index]\n", " new_state, reward = self.model.get(state, action)\n", " self._updateQ(state, action, reward, new_state)\n", " \n", " return next_state, orig_reward, done\n", "\n", " def _updateQ(self, state, action, reward, next_state):\n", " \"\"\" This functions updates the Q value. \n", " Q_{t+1}(s,a) = Q_t{s,a} + \\alpha * (r + \\gamma * max_a{Q_t(s,a)} -Q_t(s,a))\n", " \n", " Args:\n", " state: Current state of the world.\n", " action: Current action chosen.\n", " reward: Reward for taking action in state.\n", " next_state: The next state to transition to.\n", " \"\"\"\n", " self.Q[state, action] = self.Q[state, action] + \\\n", " self.params['alpha'] * \\\n", " (reward + \\\n", " self.params['gamma'] * np.max(self.Q[next_state, :]) - \\\n", " self.Q[state, action])\n", " \n", " def _get_action(self, state):\n", " \"\"\" Choose action for state with a \\epsilon-greedy policy.\n", " \n", " Args:\n", " state: Current state of the world.\n", " \"\"\"\n", " if self.rng.uniform() < self.params['epsilon']:\n", " return self.rng.choice(self.action_space)\n", " q_vals = self.Q[state]\n", " q_max = np.max(q_vals)\n", " return self.rng.choice([action for action, value in enumerate(q_vals) if value == q_max])\n", " \n", " def reset(self):\n", " \"\"\" Reset the DynaQ algorithms. \n", " This resets the model and resets the Q values.\n", " \"\"\"\n", " self.model.reset()\n", " self.Q.fill(0)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "q-stTWvHQf_X" }, "source": [ "# Simple Dyna-Q Maze: Variant of Example 8.1 with Left Blocking Maze" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 484, "output_extras": [ { "item_id": 4 }, { "item_id": 5 } ] }, "colab_type": "code", "executionInfo": { "elapsed": 64695, "status": "ok", "timestamp": 1519718451404, "user": { "displayName": "Khimya Khetarpal", "photoUrl": "//lh4.googleusercontent.com/-N2vm2KOF7iE/AAAAAAAAAAI/AAAAAAAACL8/3K7KcnaQmY0/s50-c-k-no/photo.jpg", "userId": "111336538593611088506" }, "user_tz": 300 }, "id": "IBBaVPwiQV4n", "outputId": "655bdd7f-00b2-487e-8768-1d1fa860ee0b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running Agent For Planning n-steps: 0\n", "Running Agent For Planning n-steps: 5\n", "Running Agent For Planning n-steps: 50\n", "The figure below shows the average learning curves for Dyna-Q agents varying in their number of planning steps (n) per real step.\n", " \n", " \n" ] }, { "data": { "image/png": "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\nQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "model = Model()\n", "\n", "left_open_maze = BlockedMaze('left')\n", "\n", "legend = []\n", "\n", "for planning_nstep in planning_nsteps:\n", " print(\"Running Agent For Planning n-steps: %d\" % planning_nstep)\n", " total_steps = np.zeros((params['runs'], params['episodes']))\n", " for run in range(params['runs']):\n", " dynaQ = DynaQ(params, model, left_open_maze.action_space, left_open_maze.observation_space, np.random)\n", "\n", " for episode in range(params['episodes']):\n", " obs = left_open_maze.reset()\n", " initial_state = obsv2state(obs)\n", " steps, totalreward = dynaQ.run(initial_state, left_open_maze, planning_nstep)\n", " total_steps[run, episode] = steps\n", " episodes_index = np.linspace(0, params['episodes'], params['episodes'], endpoint=True) \n", " temp = \"N Steps = {:}\".format(planning_nstep)\n", " legend.append(temp)\n", " plt.plot(episodes_index, np.average(total_steps, axis=0), linewidth=3)\n", " \n", "plt.xlabel(\"Episodes\", fontsize=14)\n", "plt.ylabel(\"Steps\", fontsize=14)\n", "plt.title(\"Average learning curves for Dyna-Q agents\", fontsize=14)\n", "plt.legend(legend, prop={'size': 16}, loc='upper right', fancybox=True, framealpha=0.5)\n", "print(\"The figure below shows the average learning curves for Dyna-Q agents varying in their number of planning steps (n) per real step.\")\n", "print(\" \")\n", "print(\" \")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "z674kPBPdD0d" }, "source": [ "**Results & Analysis:** As expected, the non-planning agent i.e. planning with nsteps = 0 took approximately 25 episodes to reach the optimal performance, whereas the agent planning with n-steps = 5 and 50 took approximately 5 and 2 episodes roughly. It is observed here planning with n steps help learn faster as opposed to direct learning." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "dgsglzY1Fsg7" }, "source": [ "# **Blocking Maze Experiment**\n", "\n", "---\n", "\n" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 416, "output_extras": [ { "item_id": 1 }, { "item_id": 2 } ] }, "colab_type": "code", "executionInfo": { "elapsed": 21281, "status": "ok", "timestamp": 1519718484307, "user": { "displayName": "Khimya Khetarpal", "photoUrl": "//lh4.googleusercontent.com/-N2vm2KOF7iE/AAAAAAAAAAI/AAAAAAAACL8/3K7KcnaQmY0/s50-c-k-no/photo.jpg", "userId": "111336538593611088506" }, "user_tz": 300 }, "id": "SoTKa8R3_1r1", "outputId": "20ea5746-123c-483f-8ed6-88e961ad45de" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "For Planning n-steps: 10\n", "\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfYAAAFtCAYAAAD1Skg8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3XdYFFf3wPHvwtJBmkjsmuR9MYmi\nYAO7xo4Fe4+999hiezX23ktiNGpi16jRqFFMrLFFsKCxxo5IUZTelv394c/RCcXVACt4Ps/j88iZ\n2Zmzd8vZe+fOjEav1+sRQgghRK5gYuwEhBBCCJF5pLALIYQQuYgUdiGEECIXkcIuhBBC5CJS2IUQ\nQohcRAq7EEIIkYtIYc9Ap06dmDlz5r/ezldffcWgQYPSXDZu3DiGDRv2r/chnjtx4gRubm4kJCQY\nOxWRjuTkZNzc3Dh69OgbP1an01GqVCn++OOPLMjs3fW69/Xu3bvx8vKiY8eO2ZyZeBe9t4W9Vq1a\nfPbZZ5QqVQp3d3cqVapE//79uXPnTrbmMWXKFObOnZsl2+7UqRNubm7cu3cv1bKLFy/i5ubGV199\nlSX7Ts/OnTspVaqU8s/NzY2SJUsqfy9btixb80nPyJEjcXNz4+zZs8ZO5b13+fJlTpw4AYCpqSmB\ngYFUrlzZyFm9W1asWIGvry8//vhjpmxv+PDhfPLJJ5QqVYqSJUvi5eVFr169OHz4cKZs/23p9Xq2\nbNlCy5Yt8fDwwMPDgxYtWrBlyxbe5UuyrF69muTk5Gzb33tb2AFGjx5NYGAgFy9eZPfu3QB8+eWX\nRs4qczk7O7Nr165U8V27duHs7Jzt+fj6+hIYGEhgYCCnTp0CYNWqVUqsX79+2Z7TP0VGRrJ//37q\n1avHtm3bjJ3Oe2/Lli1KYRdpi4yMpGjRomg0mkzbZv369ZXP5fbt26lVqxbDhw9nyZIlmbaPNzV+\n/Hi+/fZbBg4cyJkzZzhz5gyDBw/m22+/Zdy4cUbLKyPh4eHMmDEDnU6Xbft8rwv7q5ydnfHx8eH2\n7dvprrN161YaNmyIu7s7derUYdOmTcoynU7HvHnzqFKlCuXKlaN///6Eh4enuZ0lS5ZQr149IiIi\nVMP027dvp3HjxuzcuZOaNWvi6enJ8OHDlTdEXFwcgwcPxt3dnbp163L06FE8PDw4dOhQujlXr149\n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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "model = Model()\n", "\n", "left_open_maze = BlockedMaze('left')\n", "right_open_maze = BlockedMaze('right')\n", "\n", "planning_nsteps = 10\n", "print(\"For Planning n-steps: %d\" % planning_nsteps)\n", "print(\"\")\n", "\n", "params['alpha'] = 0.7\n", "params['runs'] = 20\n", "params['episodes'] = 1000\n", "params['max_steps'] = 3000\n", " \n", "rewards = np.zeros((params['runs'], params['max_steps']))\n", "\n", "for run in range(params['runs']):\n", " cumulativereward = 0\n", " timesteps = 0\n", " last_steps = 0\n", " dynaQ = DynaQ(params, model, right_open_maze.action_space, left_open_maze.observation_space, np.random.RandomState(run))\n", " for episode in range(params['episodes']):\n", " if timesteps <= 1000:\n", " maze = right_open_maze\n", " elif timesteps > 1000:\n", " maze = left_open_maze \n", "\n", " obs = maze.reset()\n", " initial_state = obsv2state(obs)\n", " steps, totalreward = dynaQ.run(initial_state, maze, planning_nsteps)\n", " timesteps += steps\n", " \n", " if timesteps > params['max_steps']:\n", " break\n", " \n", " cumulativereward += totalreward\n", " rewards[run, timesteps:] = cumulativereward\n", " \n", "\n", "plot(range(0, params['max_steps']), np.average(rewards, axis=0), \"Time Steps\", \"Cumulative Reward\", \n", " [\"Dyna Q\"], \"Blocking Maze Task: Average cumulative reward for Dyna-Q agents\")" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "SegwHn3SoGsP" }, "source": [ "**Results & Analysis:** Similar to the experiments in the Sutton book, we observe that the first part of the graph indicates that Dyna agents found the short path within 1000 steps. However, when the environment changed, the graphs become flat, \"indicating a period during which the agents obtained no reward because they were wandering around behind the barrier. After a while, however, they were able to find the new opening and the new optimal behavior.\"\"" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "jKu6yFb_GGzf" }, "source": [ "# Shortcut Maze Experiment" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 416, "output_extras": [ { "item_id": 1 }, { "item_id": 2 } ] }, "colab_type": "code", "executionInfo": { "elapsed": 28500, "status": "ok", "timestamp": 1519718537049, "user": { "displayName": "Khimya Khetarpal", "photoUrl": "//lh4.googleusercontent.com/-N2vm2KOF7iE/AAAAAAAAAAI/AAAAAAAACL8/3K7KcnaQmY0/s50-c-k-no/photo.jpg", "userId": "111336538593611088506" }, "user_tz": 300 }, "id": "WSKGERb1GGij", "outputId": "762d37ac-0d50-4d9a-f974-d521ee78153a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "For Planning n-steps: 50\n", " \n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "model = Model()\n", "\n", "left_open_maze = BlockedMaze('left')\n", "both_open_maze = BlockedMaze('both')\n", "\n", "planning_nsteps = 50\n", "print(\"For Planning n-steps: %d\" % planning_nsteps)\n", "print(\" \")\n", "\n", "params['alpha'] = 0.7\n", "params['runs'] = 5\n", "params['episodes'] = 1000\n", "params['max_steps'] = 6000\n", " \n", "rewards = np.zeros((params['runs'], params['max_steps']))\n", "\n", "for run in range(params['runs']):\n", " cumulativereward = 0\n", " timesteps = 0\n", " last_steps = 0\n", " dynaQ = DynaQ(params, model, left_open_maze.action_space, left_open_maze.observation_space, np.random.RandomState(run))\n", " for episode in range(params['episodes']):\n", " if timesteps <= 3000:\n", " maze = left_open_maze\n", " elif timesteps > 3000:\n", " maze = both_open_maze \n", "\n", " obs = maze.reset()\n", " initial_state = obsv2state(obs)\n", " steps, totalreward = dynaQ.run(initial_state, maze, planning_nsteps)\n", " timesteps += steps\n", " \n", " if timesteps > params['max_steps']:\n", " break\n", " \n", " cumulativereward += totalreward\n", " rewards[run, timesteps:] = cumulativereward\n", " \n", "\n", "plot(range(0, params['max_steps']), np.average(rewards, axis=0), \"Time Steps\", \"Cumulative Reward\", \n", " [\"Dyna Q\"], \"Shortcut Maze Task: Average cumulative reward for Dyna-Q agents\")" ] } ], "metadata": { "colab": { "collapsed_sections": [], "default_view": {}, "name": "Dyna-Q.ipynb", "provenance": [], "version": "0.3.2", "views": {} }, "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.8.5" } }, "nbformat": 4, "nbformat_minor": 1 }