{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# DiscreteDP Example: POMDP Tiger Example" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We solve the Tiger Example,\n", "a famous example of POMDP (Partially Observable Markov Decision Process),\n", "by discretizing the belief state of the corresponding MDP." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from __future__ import division\n", "import numpy as np\n", "import scipy.sparse as sparse\n", "import matplotlib.pyplot as plt\n", "from quantecon.markov import DiscreteDP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "States (in POMDP):\n", "* `s_L`: Tiger is on the left\n", "* `s_R`: Tiger is on the right\n", "\n", "Actions:\n", "* 0: Listen\n", "* 1: Open left\n", "* 2: Open right\n", "\n", "Obervations:\n", "* TL\n", "* TR\n", "\n", "States (in MDP):\n", "* $s \\in [0, 1]$: belief of state `s_R`" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def prob_TL(belief, noise_prob_L=0.15, noise_prob_R=0.15):\n", " return (1-noise_prob_L) * (1-belief) + noise_prob_R * belief\n", "\n", "def prob_TR(belief, noise_prob_L=0.15, noise_prob_R=0.15):\n", " return noise_prob_L * (1-belief) + (1-noise_prob_R) * belief\n", "\n", "def bayes_update_TL(belief, noise_prob_L=0.15, noise_prob_R=0.15):\n", " return noise_prob_R * belief / prob_TL(belief, noise_prob_L, noise_prob_R)\n", "\n", "def bayes_update_TR(belief, noise_prob_L=0.15, noise_prob_R=0.15):\n", " return (1-noise_prob_R) * belief / prob_TR(belief, noise_prob_L, noise_prob_R)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def nearest_idx(grid, v):\n", " mid_points = (grid[:-1] + grid[1:]) / 2\n", " return np.searchsorted(mid_points, v)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def tiger_mdp(belief_grid, beta=0.95):\n", " # Number of actions\n", " num_actions = 3\n", " # Actions\n", " # 0: Listen, 1: OpenL, 2:OpenR\n", "\n", " # Number of state-action pairs\n", " grid_size = len(belief_grid)\n", " L = grid_size * num_actions\n", "\n", " s_indices = np.repeat(np.arange(grid_size), num_actions)\n", " a_indices = np.tile(np.arange(num_actions), grid_size)\n", "\n", " # Reward vector\n", " reward = 10\n", " penalty = -100\n", " cost = -1\n", "\n", " R = np.empty((grid_size, num_actions))\n", " # Listen\n", " R[:, 0] = cost\n", " # OpenL\n", " R[:, 1] = penalty * (1 - belief_grid) + reward * belief_grid\n", " # OpenR\n", " R[:, 2] = reward * (1 - belief_grid) + penalty * belief_grid\n", "\n", " R.shape = (L,)\n", "\n", " # Transition probability matrix\n", " data = np.empty(grid_size*(num_actions+1))\n", " row = np.empty(grid_size*(num_actions+1), dtype=int)\n", " col = np.empty(grid_size*(num_actions+1), dtype=int)\n", "\n", " # If listen:\n", " a = 0\n", " # observe TL with prob prob_TL\n", " data[a*grid_size:(a+1)*grid_size] = prob_TL(belief_grid)\n", " row[a*grid_size:(a+1)*grid_size] = np.arange(a, L, num_actions)\n", " col[a*grid_size:(a+1)*grid_size] = \\\n", " nearest_idx(belief_grid, bayes_update_TL(belief_grid))\n", " # observe TL with prob prob_TR\n", " data[(a+1)*grid_size:(a+2)*grid_size] = prob_TR(belief_grid)\n", " row[(a+1)*grid_size:(a+2)*grid_size] = np.arange(a, L, num_actions)\n", " col[(a+1)*grid_size:(a+2)*grid_size] = \\\n", " nearest_idx(belief_grid, bayes_update_TR(belief_grid))\n", "\n", " # Once open the door, the problem is reset\n", " prob_half_idx = np.abs(belief_grid-1/2).argmin()\n", " for a in [1, 2]:\n", " data[(a+1)*grid_size:(a+2)*grid_size] = 1\n", " row[(a+1)*grid_size:(a+2)*grid_size] = np.arange(a, L, num_actions)\n", " col[(a+1)*grid_size:(a+2)*grid_size] = prob_half_idx\n", "\n", " Q = sparse.coo_matrix((data, (row, col)), shape=(L,grid_size))\n", " Q.sum_duplicates()\n", " \n", " return DiscreteDP(R, Q, beta, s_indices, a_indices)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "grid_size = 5001\n", "belief_grid = np.linspace(0, 1, grid_size)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0.00000000e+00, 2.00000000e-04, 4.00000000e-04, ...,\n", " 9.99600000e-01, 9.99800000e-01, 1.00000000e+00])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "belief_grid" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mdp = tiger_mdp(belief_grid, beta=0.95)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "res = mdp.solve(method='policy_iteration')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res.num_iter" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\ngwY0bNiQjIwMwJe68/Pzy6vg27dvz5AhQ7jxxhvZunUrpaWlLF++nFmzZoXyvpKdkrqIiMTc0KFD\nady4cfnjrrvuKi+F79y5k9tuu42srCzat2/P+vXrGTduHAAjR44E4KCDDuKYY44BYOLEiezatYs+\nffrQqlUrRo4cyTfffANUfvtcXb6dTuOpi4ikqGD87bDDkFqq6nOLxXjqKqmLiIikCSV1ERGRNKGk\nLiIikiaU1EVERNKEkrqIiEiaUFIXERFJE0rqIiIiaUJJXUREJE0oqYuIiFTh4Ycfpm3btmRmZrJx\n48aww6mRkrqIiMTFhAkT6N+/P02aNKF9+/Zce+21bNmyJZRY6tWrx5dfflmrdXbv3s1NN93EzJkz\nKSoqYsGCBXTu3DlOEcaGkrqIiMTc/fffz6233sr9999PUVERH330EStWrODMM89k9+7dYYcXlW++\n+YYdO3bQu3fvsEOJmpK6iIjEVFFREWPHjuWhhx5iyJAhZGRk0LVrV5577jny8/N56qmnABg7diwX\nXnghF110EZmZmRx99NEsWLCgfDsFBQVccMEFtGnThu7du/O3v/2tfN7YsWMZNWoUl19+OZmZmfTr\n1485c+bUOtadO3fy61//mq5du9KuXTuuueYaduzYwdKlS8uTeYsWLTjttNMYOnQoBQUFNGvWjMzM\nzPJBZZKJkrqIiMTUBx98wI4dOxgxYsQe05s0acLQoUN54403yqdNmTKFUaNGsWnTJkaPHs3w4cMp\nKSmhtLSU8847jwEDBlBQUMDMmTMZP348//3vf8vXffXVV7n44ovZsmULw4YN4xe/+EWtY7311ltZ\ntmwZn332GcuWLWP16tXcfffd9OzZk4ULFwKwZcsW3nrrLaZPn06HDh3YunUrRUVFtGvXbh+PUPwc\nEHYAIiISH3ZXbIYgdXfWbiS49evX07p1a+rV27vc2K5dO+bOnVv++phjjilP/jfeeCP3338/H374\nIfXr12f9+vX87ne/A6Bbt25cffXVTJo0iSFDhgAwaNAgzj77bAAuueQSxo8fX7v35RyPPPIICxYs\noEWLFgDcdttt/PjHP+aee+7ZayS1VBgRT0ldRCRN1TYZx0rr1q1Zv349paWleyX2NWvWkJWVVf66\nU6dO5c/NjE6dOlFQUICZUVBQQMuWLcvnl5SUcMopp5S/btu2bfnzxo0bs2PHjkr3WZV169bx3Xff\ncfTRR5dPc85RWloa/ZuNkVc+fyUm21FSFxGRmDrhhBNo0KABL7zwAiNHjiyfvm3bNmbMmMG4cePK\np61atar8eWlpKV9//TUdO3YkIyODbt26sXTp0kr3Ybb/tRCtW7emUaNGLFq0iPbt29e4fCz2WZXn\nFz8fk+3omrqIiMRU8+bNufPOO7nuuut4/fXX2b17N/n5+YwaNYrOnTtz6aWXli87Z84cXnrpJYqL\nixk/fjwNGzZk4MCBHHvssTRr1oz77ruP7du3U1JSQl5eHp9++imwb1XhO3fuZMeOHeUP5xw//elP\nueGGG1i3bh0Aq1ev3uO6faS2bduyYcMGioqK9uGoVC+vMC8m21FSFxGRmLv55pu55557+PWvf03z\n5s0ZOHAgXbt2ZebMmdSvXx/wJd/zzz+fyZMn06pVK55++mlefPFFMjIyyMjIYOrUqcyfP5/u3buT\nlZXFmDFjyhOqme1Vcq6pJN23b18aN25c/njiiSe499576dGjBwMHDqR58+aceeaZe9QORG6zV69e\nXHzxxXTv3p1WrVrFrPV7cWkxS9Yvicm2LFkv/JuZS9bYRESSgZmlROOtqtx1110sW7aMJ598MuxQ\nEqri57Z43WKGTRrGsuuX4Zzbrzp+ldRFRCQUqXxCEkt5hXn0a9MvJtuKW1I3s85m9raZLTSzPDO7\nPph+nJnNNrN5ZvaJmR1b5UZC6k5QRETir7Iq9LootzCX/m36x2Rbcat+N7N2QDvn3HwzawrMAYYD\nDwPjnHOvm9k5wC3OuVMrWd+5996Dk06KS3wiIqku1avf66qKn9sPJ/+Q0f1GM6rfqOStfnfOfeOc\nmx883wYsBjoCa4DmwWItgNVVbiQ3N17hiYiIJIXctbkxq35PyH3qZnYwMAD4CPgCeM/M/ow/qTih\nyhXzYtPEX0REJBl9u+tbCrYWcOhBh8Zke3FP6kHV+/PAL51z28zsZeB659xLZjYSeAw4s7J1x776\nKrRuDUB2djbZ2dnxDldERCQhcnJyeHrK02QuzeQPd/8hJtuM6y1tZlYfmApMd86ND6YVOecyg+cG\nbHbONa9kXedatoQNG0ANKURE9qJr6qkp8nN7bN5jvJ3/Nk/+8Mmy6cl5TT1I2I8Ci8oSemCZmQ0O\nnp8GVN4HIMABB0BBQbxCFBERCVVeYV7MWr5DfO9TPwm4BDg1uH1tXtDafQxwn5nNB/4QvK5c//66\nri4iInE3dOjQqDvByc7O5tFHH43JfmN5OxvEt/X7e865es65I51zA4LHdOfcp86544PpJzjn5lW5\nkX791AJeRCRFTZgwgf79+9OkSRPat2/Ptddey5aQ+h+pV68eTZs2pVmzZnTs2JHrr7+e4uLi8vnT\npk3bo0/66lR3f31+fj716tWLeqS33LW59G+bAkk9Jvr3V1IXEUlB999/P7feeiv3338/RUVFfPTR\nR6xYsYIzzzyT3bt3hxLTggUL2Lp1K7NmzeLFF1/kX//6V9z2FU1bh3XfrmNH8Q46NusYs/0mf1JX\n9buISEopKipi7NixPPTQQwwZMoSMjAy6du3Kc889R35+Pk899RQAY8eO5cILL+Siiy4iMzOTo48+\nmgULFpRvp6CggAsuuIA2bdrQvXt3/va3v5XPGzt2LKNGjeLyyy8nMzOTfv36MWfOnKjiO+SQQzjp\npJNYuHBh+bTIKvWSkhJuuukmsrKy6N69Ow899NBepe/8/HxOPvlkMjMzOeuss9iwYQNA+XjvLVq0\noFmzZnz88cdVxpFXmEf/tv1j2qtecif1Pn1g8WIoKQk7EhERidIHH3zAjh07GDFixB7TmzRpwtCh\nQ3njjTfKp02ZMoVRo0axadMmRo8ezfDhwykpKaG0tJTzzjuPAQMGUFBQwMyZMxk/fvwew6K++uqr\nXHzxxWzZsoVhw4bxi1/8otq4ykrPn3/+Oe+++y7HH398+bzIKvVHHnmEGTNm8NlnnzF37lxefvnl\nPRKvc45nnnmGCRMmUFhYyK5du/jzn/8MwLvvvgvAli1b2Lp16x77qCjW19Mh2ZN6s2bQrh0sWxZ2\nJCIiqccsNo9aWr9+Pa1bt6Zevb1TTLt27Vi/fn3562OOOYYRI0aQkZHBjTfeyI4dO/jwww/55JNP\nWL9+Pb/73e844IAD6NatG1dffTWTJk0qX3fQoEGcffbZmBmXXHIJn332WbVxHXXUUTRt2pQ+ffpw\n4YUXctlll1W63HPPPccNN9xAhw4daNGiBbfddtse1elmxpVXXkmPHj1o2LAho0aNYv78+UDtBqmJ\n5UAuZZI7qYOq4EVE9pVzsXnUUuvWrVm/fn2ljcXWrFlDVlZW+etOnTqVPzczOnXqREFBAStXrqSg\noICWLVuWP8aNG0dhYWH58m3bti1/3rhxY3bs2FFtA7V58+axbds2Jk+ezMSJE1mxYkWly61Zs4bO\nnTtXGmOZdu3alT9v1KgR27Ztq3K/Val7JXVQC3gRkRRzwgkn0KBBA1544YU9pm/bto0ZM2Zw+umn\nl09btWpV+fPS0lK+/vprOnbsSOfOnenWrRubNm0qfxQVFTF16lSA/boOPXLkSM4991zGjh1b6fz2\n7dvvEVfk85pEG1epK2Vh4cI6WlJXUhcRSRnNmzfnzjvv5LrrruP1119n9+7d5OfnM2rUKDp37rzH\nrWNz5szhpZdeori4mPHjx9OwYUMGDhzIscceS7NmzbjvvvvYvn07JSUl5OXl8emnnwL7Pxb7rbfe\nyrPPPsvXX3+917xRo0bx4IMPUlBQwObNm7n33nv3StZV7T8rK4t69eqxfPnyave/cstKMhtk0rJR\ny31/E5VIjaSu6ncRkZRy8803c8899/DrX/+a5s2bM3DgQLp27crMmTOpX78+4Eu1559/PpMnT6ZV\nq1Y8/fTTvPjii2RkZJCRkcHUqVOZP38+3bt3JysrizFjxlBUVFS+bsVEW10pueK8fv36cdppp/HA\nAw/stexPf/pThgwZwuGHH87RRx/ND37wAzIyMvZoIxC5vchYGjduzG9/+1tOOukkWrZsyezZsyuN\nJ9b3p5fHkqz9BpuZc87B7t2QmQkbN0KjRmGHJSKSNFK97/e77rqLZcuWRd2TW1imT5/ONddcQ35+\nfky2Z2b876z/ZfOOzdx35n17TE/avt9jpn59OPRQWLQo7EhERCSGkvWEZMeOHUybNo3i4mJWr17N\nXXfdtdftefsrtzB2Y6hHSv6kDqqCFxFJQ9V1txom5xxjx46lVatWHHXUUfTt25e77747pvuI9UAu\nZZK/+h3gj3+E9eshuLlfRERSv/q9rjIzGv6hIZt+s4mGBzTcY3r6V7+DbmsTEZG00rV51z0Seqyk\nRlLXbW0iIpJG4tHyHVIlqXfpAtu2QdBhvoiISCqLx/V0gAPistVYM/NV8Hl5MHhw2NGIiCSNZGxo\nJjWLR8t3SJWkDt9XwSupi4gAyXtLmFSv24Pd4lZST43qd9BtbSIikvK27tzKum/X0b1l97hsP3WS\nulrAi4hIissrzKN3Vm8y6mXEZfupk9TLSuqqbhIRkRQVjzHUI6VOUj/oIGjSBGoxBJ6IiEgyiccY\n6pFSJ6mDquBFRCSlKalHUic0IiKSopxz5K6Nz0AuZVIvqasFvIiIpKC1364FoF3TdnHbR+oldZXU\nRUQkBeWuzaV/2/5x7TAotZJ6796wdCns3h12JCIiIrWSW5hLv6z4Vb1DqiX1xo2hc2f44ouwIxER\nEamVvMK8uA3kUia1kjqoCl5ERFJSvFu+Qyomdd3WJiIiKaaktIRF6xbRt03fuO4n9ZK6WsCLiEiK\n+WrzV2Q1ziKzQWZc95OaSV0ldRERSSFlLd/jLfWS+iGHwJo1sG1b2JGIiIhEJREt3yEVk/oBB0Cv\nXrBwYdiRiIiIRCURLd8hFZM66Lq6iIiklES0fIdUTepqAS8iIiliR/EO8jfnc1jrw+K+r9RM6mos\nJyIiKeLz9Z9zSMtDODDjwLjvK3WTuqrfRUQkBSSq5TvEMambWWcze9vMFppZnpldHzHvOjNbHEy/\nt9Yb79ABdu2CwsKYxiwiIhJribqeDvEtqe8GfuWc6wsMBH5uZr3N7FRgGHC4c64f8Odab9lMVfAi\nIpIScgvjO4Z6pLgldefcN865+cHzbcBioCPw/4Bxzrndwbx1+7QDVcGLiEgKyCvMS4uSejkzOxgY\nAHwM9AROMbOPzCzHzI7Zp42qpC4iIklu0/ZNbN6xma4tuiZkf3FP6mbWFHge+KVzbitwANDSOTcQ\nuBl4bp82rNvaREQkyeUV5tE3qy/1LDHt0g+I58bNrD7wAvCUc+7lYPLXwIsAzrlPzKzUzA5yzm2o\nuP7YsWPLn2dnZ5Odnf39zH79YNEiKC2FeqnZiF9ERNJbdVXvOTk55OTkxHR/5pyL6QbLN2xmwBPA\nBufcryKm/wzo4Jy708x6Am8657pUsr6rMbYuXSAnB7p3j2nsIiIisXDta9fSq3Uvrj/++hqXNTOc\nc7Y/+4tnEfck4BLgVDObFzzOBh4DuptZLvAscNk+70FV8CIiksQS2fId4lj97px7j6pPGi6NyU7K\nWsCff35MNiciIhIrzrmEtnyHVO1RroxawIuISJJavXU1DTIakNUkK2H7TO2krup3ERFJUrlrE1v1\nDqme1Hv3hi+/hJ07w45ERERkD4mueodUT+oNGkC3brBkSdiRiIiI7CG3MHEDuZRJ7aQOqoIXEZGk\nlMiBXMqkflJXYzkREUkyxaXFLFm/hD5ZfRK63/RI6hrYRUREksiyjcvo0KwDTQ5sktD9pkdSV0ld\nRESSSO7axF9Ph3RI6t26wYYNsGVL2JGIiIgAQU9yWYm9nQ3SIanXqwd9+sDChWFHIiIiAgS3s6mk\nvo9UBS8iIkkkjJbvkC5JXbe1iYhIkvh217esLlpNj1Y9Er7v9EjqagEvIiJJYvH6xfQ8qCf1M+on\nfN/pk9TzAoUpAAAgAElEQVRzcyFOY8OLiIhEK6yW75AuSb1NG99gbs2asCMREZE6LqyW75AuSd1M\nVfAiIpIUwmr5DumS1EEt4EVEJCmE1fId0impqwW8iIiEbP1369m+ezudMjuFsv/0SeoqqYuISMjy\nCvPo16YfZhbK/tMnqfftC4sXQ0lJ2JGIiEgdlbs2vKp3SKek3qwZtG0Ly5eHHYmIiNRRuYXh3c4G\n6ZTUQVXwIiISqtzCXPq1Ced2NkjHpK7b2kREJATOORYWLlT1e8yopC4iIiFZsWUFmQ0yadmoZWgx\npFdS121tIiISkty14Va9Q7ol9cMOg5UrYfv2sCMREZE6Jq8wL9Sqd0i3pF6/Phx6qL+1TUREJIHC\nbvkO6ZbUQVXwIiISirBbvkM6JnW1gBcRkQTbVbKLZRuX0bt171DjSM+krpK6iIgk0NINS+navCuN\n6jcKNY6ok7qZNY5nIDGj6ncREUmwZGj5DlEkdTM70cwWAUuC10ea2T/iHtm+6toVtm6FjRvDjkRE\nROqIZGj5DtGV1McDZwPrAZxz84HB8Qxqv5j50rquq4uISIIkQ8t3iLL63Tm3ssKk4jjEEjuqghcR\nkQRKhpbvAAdEscxKMzsJwMwOBK4HkvtGcLWAFxGRBNm6cyuF3xZySMtDwg4lqpL6NcDPgY7AamBA\n8Dp5qQW8iIgkyMJ1C+ndujcZ9TLCDqXmkrpzbh0wOgGxxE7ZNXXn/DV2ERGROMldmxzX0yGKpG5m\nj1eY5ACcc1fGJaJYaN0aGjWCVaugS5ewoxERkTSWW5hLv6zwr6dDdNXvrwFTg8dMoDnwbU0rmVln\nM3vbzBaaWZ6ZXV9h/k1mVmpmrfYl8BrpurqIiCRAXmFe6pTUnXPPR742s2eA96PY9m7gV865+WbW\nFJhjZm845xabWWfgTGDFvgQdlbLr6kOHxm0XIiJStznn/O1sSXCPOuxbN7E9gayaFnLOfRPc045z\nbhu+xXyHYPYDwC37sO+olfbpx6ZZaiwnIiLx88WatewuLqVd03ZhhwJEd019G8F19ODvWuA3tdmJ\nmR2MbzX/sZmdD3ztnFtgcWzEtrrDsUyasYSzFsDhh8dtNyIiUoeNe6CItrsuJ575rDaiqX5vuj87\nCKrenwd+CZQCt+Or3ssXqWrdsWPHlj/Pzs4mOzs76v12Pqcfpff8kXPO8cOrZ2bWLm4REZHqvPIK\n/Of/evLZZw/s0/o5OTnk5OTENCZzzlU+w+xovi+h78U5N7fGjZvVxzewm+6cG29m/YE3ge+CRTrh\n730/zjlXWGFdV1Vs0XIOzjsPtm+HN96Aeuk3Jp2IiIQgLw+OPx4mToQLLojNNs0M59x+FfmrS+o5\nVJ/UT60hOAOeADY4535VxTJfAUc75/YafSUWSR3g229hwAAYNQr+8If93pyIiNRxZXll9GiIqFDe\nb3FN6vvLzE4GZgEL+P7k4Hbn3PSIZb4EjolnUgdYtAiOOQaeeQaGD4/JJkVEpA4qLYURI6CoCN58\nM7Y1wAlL6kG1eW+gYdk059zE/dlxFPuMWVIHePFFuPRSmDMHevWK2WZFRKQOuftueOwxmDsXWsW4\nl5WEJHUzG4sfarUvviOac4D3nHMX7s+Oawwsxkkd4PbbfXKfN893OCciIhKtt9+GIUNgwQLo3Tv2\n209UUs8DjgDmOueOMLO2wNPOuTP2Z8c1BhaHpF5aCtnZ0KYN/Oc/6hZeRESis2IFHHEEPPggXH55\nfPYRi6QezdWA7c65EqDYzJoDhUDn/dlpWOrVg5degvfeg3vuCTsaERFJBdu3+xL6ZZfFL6HHSpX3\nqZvZP4BngE/MrAXwCPApvt/3DxITXuwddBDMnOnPuE48EU6ttg2/iIjUdWPGQNu2MH582JHUrLrO\nZ5YCf8J37boNeBbfaUymc25BAmKLm7594d//9i0YFy2C9u3DjkhERJLR//2f7+dk3rzU6Oskmmvq\nBwMXAT8CGuNL788655bGNbA4XFOvaMwYmDVLDedERGRvM2fCWWfBW2/BKafEf38Jv0/dzAYAjwP9\nnXMZ+7PjKPYV96ReUgKnnQadOsFTT6nhnIiIeAUF0KePr3K/4orE7DMhDeXM7AAzGxYMuToD+BwY\nsT87TRYZGb4V/FtvwUMPhR2NiIgkg5IS38X4qFGJS+ixUl03sUPw1e4/AGbjr6lPCYZRjX9gCSip\nl/ngA1+18uGHcOyxCdmliIgkqZ//HN5913cwc0CNw57FTrz7fn8Ln8hfqKwb13hLZFIHX1K//Xb4\n6ivfQl5EROqep5+Gq6+GJUugS5fE7jup+37fX4lO6gA//jGsWuV7DcqIa4sBERFJNvPn+5HXpkzx\nDeQSLVGdz9QZjz4KmzfDLbeEHYmIiCTS5s0wbBjccUc4CT1WVFKvYNkyP6Teo4/6RhIiIpLenIOz\nz/bXz6dODe9OqFiU1BPYBCA19OgBkyb5lo99+/qHiIikr9//HvLy/HX0VL+1WSX1Ktx9t+9JaMkS\naNYstDBERCSOXnsNfvhDyM2Fww4LNxY1lIuz887z9yu+9lrqn72JiMiePv8cjjsOnnjCJ/awqaFc\nnD3zDCxd6qtmREQkfWzb5hvGXXNNciT0WFFJvQYLF/ozubLr7CIikvp++EMoKvKDtSTLQC1qKJcA\nffv6fuGHD/cJvlevsCMSEZH9MW6cH8xr+fLkSeixopJ6lO64AyZO9Im9adOwoxERkX3x2mt+2O15\n8/yALclEDeUSqOw+xnr1YNo0NZwTEUk1X34JRxwB//43/OhHYUezNzWUSyAzeP55f9vDX/4SdjQi\nIlIbu3b56+hXX52cCT1WVFKvpdmzYdAgmD7dj8UuIiLJ77LLYPFiPxpnIkdeqw2V1ENw3HHwr3/B\nuefCihVhRyMiIjX561/h5Zf9pdNkTeixopL6PrrpJpgxwze2OPDAsKMREZHKvPuur1V9/31fKEtm\nKqmH6E9/gubNfccFIiKSfL75Bi68EB5+OPkTeqyopL4fVq+Go46C226DG24IOxoRESmzezeceCL0\n6wePPx52NNHRLW1J4KOPYPBg35HB8ceHHY2IiABcey188gl88AHUrx92NNFR9XsSGDjQV8UPHQqF\nhWFHIyIiTzzhewJ9/vnUSeixopJ6DDgHl17qh2n96CPIyAg7IhGRumnBAjjySHjzzdS77Vgl9SRh\nBo89Blu36tq6iEhYNm2Cs86Ce+9NvYQeKyqpx9Dq1XDIIfDPf8Lll4cdjYhI3VFa6hN5mzbw3HNh\nR7NvNEpbkunY0XducO65vsXl0UeHHZGISN3w29/6W9hmzAg7knCppB4H48bB3/8OixZBZmbY0YiI\npLcpU2D0aJg7F3r2DDuafadb2pKUc3DeefDtt/DWWxrRTUQkXhYtggEDYNIkP2BLKlNDuSRl5q/p\n5OfDnXeGHY2ISHoqKvI9xt10U+on9FhRST2OFi3y97FPnAjDh4cdjYhIehk+HHbuhKlT0+NW4qQv\nqZtZZzN728wWmlmemV0fTP+TmS02s8/M7EUzax7POMLSpw88+SSMGOETvIiIxMYf/uD7BZk8OT0S\neqzEtaRuZu2Ads65+WbWFJgDDAc6ATOdc6Vm9kcA59ytFdZN+ZJ6mbvu8gMKLFjgb7cQEZF999hj\ncNVVsHChLzyli6QvqTvnvnHOzQ+ebwMWAx2cc28450qDxT7GJ/m0dccdMGiQf+zYEXY0IiKpa8oU\nn9CnTUuvhB4rCWsoZ2YHAwPwSTzSlcC0RMURhnr1fMvMgw7ynSPs2hV2RCIiqScnB84/H/74Rzjn\nnLCjSU4JaSgXVL3nAH9wzr0cMf23wFHOuQsqWSdtqt/LbN0KXbr4xnPTpulWNxGRaK1b5y9fjh4N\nTz8ddjTxkRI9yplZfeAF4KkKCf0KYChwelXrjh07tvx5dnY22dnZ8QozIZo1g/fe80O03nADPPhg\n2BGJiCS/776Do46CkSP96GvpIicnh5ycnJhuM94N5Qx4AtjgnPtVxPSzgfuBwc659VWsm3Yl9TKf\nfgrHHusHHbjllrCjERFJXsXFvnazSRNf/Z7ONZxJ36OcmZ0MzAIWAGU7uh34K3AgsDGY9qFz7toK\n66ZtUgf473/9aEJTp8IPfhB2NCIiycc5OO44WLMGli2Dhg3Djii+kj6p7490T+rgG89dfDHMnu1L\n7iIi4jkHV14JEybAxo3QsmXYEcVfSlxTl6pddBGsWOHPRJcuhUMPDTsiEZHk8Pvf+4Sem1s3Enqs\nqKSeBEaP9sMFLl+uL6+IyKOPwtVX+2vogweHHU3iqPo9TTgHQ4bAnDmwdi3Urx92RCIi4ZgzB445\nBp54Ai67LOxoEivpe5ST6JjBiy/6e9gvvNAneRGRuuaLL3wHXePH172EHisqqSeRzZuhf3/IzvYj\nu6XzrRsiIpHWrYPDDoOf/ATuvz/saMKh6vc09OWXcMghcOONdfeLLSJ1y65dvkDTuze8/HLNy6cr\ntX5PQ927w8yZcPrp0LMn/OxnYUckIhI/paW+TVFGBrzwQtjRpD5dU09Cp53mv9zXXQdvvx12NCIi\n8XP11fDNN76/Do2Lvv+U1JPUiBH+Hs1hw/w47CIi6eauu/ztvLNmQdOmYUeTHlT9nsRGj4ZVq+CM\nM2D+fOjQIeyIRERiY+JEP/7FvHl+9DWJDTWUSwHXXANvvgmffAItWoQdjYjI/pkxw4+L/sYbcMop\nYUeTPNT6vY4oLYUTT/RJfedOOED1KyKSot55x9+2O3kyjBoVdjTJRZ3P1BH16vkz27Ztfav40tKw\nIxIRqb1Fi3xCv+kmJfR4UUk9hWzYAK1bw/XXw4MPhh2NiEj0Nm2CVq3giivg8cfDjiY56T71Ouag\ng/ygL4cc4l8rsYtIKti+HQ4/3N/V89hjYUeT3lT9nmK6d4fXXoO//hWefjrsaEREqrdzp79suHu3\n/81S99fxpaSegoYOhUmT4JJL4K23wo5GRKRqV13lR16bPx8aNgw7mvSn6vcU9aMfwcqV/gw4Nxf6\n9Qs7IhGRPd1yiy+dr14N7dqFHU3doKSewm6+GfLzfWvSxYshKyvsiEREvAkT4E9/8l1dq+OsxFHr\n9zQwcqS/zr5uHTRpEnY0IlLXvfIKDB/uO5c544ywo0kd6nxGAN8A5fDDYeNG363sgQeGHZGI1FXv\nvQeDBsF99/naRImeOp8RAOrXh48+ggYN4PLLQedCIhKGVavg3HPhhhuU0MOiknoaWbfOD4zwu9/B\n//xP2NGISF2ydSv07QsnnQTPPht2NKlJnc/IHrKyYOFC/49VXAzjxoUdkYjUBWUJ/bDD4Kmnwo6m\nblNJPQ39979w1ln+bPmii8KORkTSmXNw8sm+QLFmDTRqFHZEqUvX1KVSQ4b4sYpHj4acnLCjEZF0\n5Rz84hfw+eewdKkSejJQ9XuauvRS3znND37g72Hv0iXsiEQk3Tz8MPzjH/DFF749j4RPST2N/fa3\nvvHc8cfDggXqnEZEYuc///Gt3D/8EHr0CDsaKaNr6mnOOTj1VJ/UL7/cX/saNszfBiciUhvLl/se\n4l54AWbM8F3Ajh4ddlTpQ9fUpUZmftCX117zndRcfbXvnOaII/zQre+/H3aEIpKsduzwifuWW3xX\nrz16wLRpMHCgrwVUQk8+KqnXMSUlsH69bxm/cCH8+9/QrJn/hx0zxjey0+AwInXX5Mnw5pvw5JN+\n2NT69eGnP4ULL4TjjlNX1PGkbmJlv5WUwLZt8Mwz8PHH8MQTPslfdJH/B/7xj31PdfVUpyOSdnbv\nhq+/9kM5T5vmu3ht08aXwE891Q8W1ayZxkBPFCV1ibldu/zYxzNm+NL8l1/6xH/llb7KbeRIaNEi\n7ChFZF8UF8OSJf5/+8MP/aU58KXwE07wY59nZiqJh0VJXRLi44/9tfcJE/ztcccd53uOuuIK6N8f\nWrYMO0IRqcqXX8Ls2TBlik/iO3dCp05wzTU+metWtOShpC4JV1TkW79OmuST/dq1PskPHAiDB/sq\nuwYNwo5SpO5avtzf7fLkk36AlU8/hWOOgREj4JRT4MQTVRJPVkrqErrPPvMlgcmTYfp0f43u2GP9\nSE3nnAN9+uh6vEg87dwJL7/se3V7+mnfEcyxx/rhT0eMgEMOgXbtwo5SoqGkLkmlpMT3/fzEE5CX\n56v7du70LWcPP9w3uunZEzIywo5UJHVt2vT9ifRnn/mxHpo29b1Inn46nHEGNG8edpSyL5TUJel9\n+KFvVfvKK1BQ4H9sTjjBt6498UQ1uhOJxqJF8O67vkT+xhu+BqxFC/9/dOGF0Lp12BFKLCR1Ujez\nzsBEoA3ggH855/5qZq2AyUBXIB8Y5ZzbXMn6SuppZtcuf8vMCy/AvHk+4Wdl+RLGGWf46/JqdCd1\nnXN+3IaXXoIPPvCJPCMDzjzT9yNx6ql+mFNJP8me1NsB7Zxz882sKTAHGA78BFjvnLvPzH4DtHTO\n3VrJ+krqaW73bnj9dXjnHf8Dtny5T+6DB/sfr+OOCztCkcTYvt13+PL8876l+sqV/s6SH/0IzjvP\nXxdX47b0l9RJfa8dmb0MPBQ8Bjvn1gaJP8c516uS5ZXU65gvv/S3zk2ZAq++Co0bw9ln+0Y/558P\n3brph03Sw7ZtkJvrG5dOn+5bqPfr58dmGDHC/9UwpnVPyiR1MzsYeAfoB6x0zrUMphuwsex1hXWU\n1OuwHTt8JxnTp/sEP38+tG/vr8cPGeIHpVEnGZIqiot9Hw9vvunHYXj/fX8d/Iwz/CiKF1zgX+v7\nXLelRFIPqt7fAf7HOfeymW2KTOJmttE516qS9dydd95Z/jo7O5vs7Oy4xirJa/t2f1/8K6/464yz\nZ0P37v6+2x/8wP84qtGdJJMFC2DWLN/hy0sv+YGUhg3zpfDTT9cYCwI5OTnk5OSUv77rrruSO6mb\nWX1gKjDdOTc+mPY5kO2c+8bM2gNvq/pdaqukxHdlW1Z1+fHH0LGjH1729NN9o7vGjcOOUuqSlSt9\nC/X//td3w1pS4pP4Kaf47+Thh4cdoSS7pC6pB1XrTwAbnHO/iph+XzDtXjO7FWihhnKyv3bt8gn+\n7bf9j+rixb4XrXPOgeHD/Q/qAQeEHaWkky1bfEPPmTN9Y88lS+Css3wCz8723zn1rii1kexJ/WRg\nFrAAf0sbwG3AbOA5oAu6pU3iwDlYscKX5N9/3yf5wkL/g1tW9XnEESrJS+2sWePbdrzxhr/88/77\ncOSR/hazU0/1tUNZWWFHKaksqZP6/lJSl1gpLvYtjadO9T/KH37or9EPHuwb3p1+uv9xVkleIq1b\nBwsX+s6T3n/ft+U45JDv+1Q46SQ49NCwo5R0oqQusg+c89XzTz3lu7N97z3fiOncc31J/txz1UNX\nXeScr0J//nn/nXj9dd9n+rnn+hbq55+vkrjEl5K6SAyUlPiS2PTp/vronDm+BDZsmL9HfvBgDU+Z\nrpYt+/6zf/tt3zZj0CCfxK++Gtq2DTtCqUuU1EXiYMUK+OgjyMnxtyN99ZX/kT/pJF9Vf9ppGpQm\nVX31le+iePp0/3fhQt+P+gUX+MZtRx0FDRuGHaXUVUrqIglQUOBL788+6x/gO8A56ijfjecRR6jT\nkGRVXOzvEX/lFZg71192OfhguOQS/xkefbQaTEryUFIXCcGaNTBhgk8SU6Z8P/Lceef56vrDD1eS\nD8u2bb7Pgtmz/UAos2f7kvjAgb6TouHDoV69sKMUqZySukjISkr8dfhPPvFJZMEC37hq0CBfTT9i\nBDRpAvXrhx1petqxw1epT57s72x4/XV/vM8809/CePTRfmAUkVSgpC6SZHbu9P17v/mm7+nuvfd8\nkhkzxieZI47wSV/23eLFvjT+6qvw4ou+5H3hhb6G5Ic/9CVzkVSkpC6S5IqLvx9a9tlnYeNG31HJ\nSSf5UuTZZ6thVk3WrPGXOXJzfRJfs8ZXpw8bBhddBF27qkpd0oOSukiK2bDBV9NPm+ZL8kVF/rap\nCy7wCapHDw25+d13vobjlVf8MZo7158AHXecv1d88GB1FCTpSUldJMXNm+fvk37vPZ/swSevVq38\nvfFz5/rR5+rVg9JSX/Lv3Nk3CDvwQFi71p8oZGb65Xbu9AmvsNDPb9HC956Xnw8nnuh7Sdu1yy8z\nb55Plps37znYSFkjv127YOlSv/62bb43taIiXzJet87vu2NH2LrVL3vQQT6+li19jcTOnT62nj19\nxy7Nm8OmTb7P9BYt/DYbNvTLHnEEfP21j3PpUj/M7qhRvkQ+ZIg/HiLpTkldJM2sWuWr6hct8gmz\nsNAnTOd8Cb5BA9+r2datPjFu2eITaX6+v1WruNg3HsvI8H/Lknpxsa8FmD/fnyxkZPjp9er5W7q6\ndfP7L/uXcw6+/dZXde/c6U8QzPzju+98gt661U93zm/LzK9zxBHw5Zc+gXfqBE2b+m00aeLnf/MN\nNGvm49u40cfVuDF8/jmMHOlHNWvaNKxPQCQ8SuoiIiJpIhZJXc1LRERE0oSSuoiISJpQUhcREUkT\nSuoiIiJpQkldREQkTSipi4iIpAkldRERkTShpC4iIpImlNRFRETShJK6iIhImlBSFxERSRNK6iIi\nImlCSV1ERCRNKKmLiIikCSV1ERGRNKGkLiIikiaU1EVERNKEkrqIiEiaUFIXERFJE0rqIiIiaUJJ\nXUREJE0oqYuIiKQJJXUREZE0oaQuIiKSJpTURURE0kRck7qZPWZma80sN2LacWY228zmmdknZnZs\nPGMQERGpK+JdUn8cOLvCtPuAO5xzA4DfB6/jIicnJ16bTgs6PvGnYxx/OsaJoeNctWQ6NnFN6s65\nd4FNFSavAZoHz1sAq+O1/2Q60MlIxyf+dIzjT8c4MXScq5ZMx+aAEPZ5K/Cemf0Zf1JxQggxiIiI\npJ0wGso9ClzvnOsC/Ap4LIQYRERE0o455+K7A7ODgVedc/2D10XOuczguQGbnXPNK1kvvoGJiIgk\nGeec7c/6YVS/LzOzwc65d4DTgKWVLbS/b0xERKSuiWtJ3cyeBQYDrYG1+NbuucDfgQbAduBa59y8\nuAUhIiJSR8S9+l1EREQSI+EN5czsbDP73My+MLPfVLHMX4P5n5nZgCrWfXRftxPMywg6wHk1tu8w\nfDUdYzP7cXBMFpjZ+2Z2eLTryveiPVZmdqyZFZvZBbVdt66L8vciO/hfzjOznNqsK1H9XrQ2sxlm\nNj84xldEu246iOL4tDSzl4Lf1I/NrG/EvBZm9ryZbQ5+A5ZVs59o8l7Nx9g5l7AHkAEsAw4G6gPz\ngd4VlhkKTAueHw98VMm6DYCdwOm13U7E/BuBp4EpiTwGSXKMTwCaB8/PruIYV7quHtEf54jl3gKm\nAhfoOMf2GOP7ulgIdApet9YxjvkxHguMKzu+wAZ8e6y0P8ZRHp8/4TtUAzgMeDNi3hPAlcAg4Bhg\nYRX7iSbvRXWME11SPw5Y5pzLd87tBiYB51dYZhj+QOCc+xhoYWbtItcFjgLygWNruZ22AGbWCX8Q\n/w2kW4O8Go+xc+5D59yW4OXHQKdo15Vy0R6r64DngXX7sG5dF81xGg284Jz7GsA5t74W60p0x2kN\nkBk8zwQ2OOeKo1w31UXzHnsDbwM455YAB5tZlpk1BwY55x5zviO29UBpFfupMe9Fe4wTndQ7Aqsi\nXn8dTItmmQ4R0zsCBRHr1mY7AH8BbqbqA5zKojnGka4Cpu3junVZjcfKzDri/wEfDiaVNWDRcY5O\nNMfpUKCVmb1tZp+a2aW1WFeiO06PAH3NrAD4DPhlLdZNddG8x8+AEeDHNgG64gtK3YB1Zva4mc0F\nxlF1ITKavFfV/veQ6KQebau8mkrP+7odM7NzgULnW9ynWykdoj82mNmp+Kqhsus0ajUZvWiO1Xjg\nVufr0Yzvv286ztGJ5jjVx9fcDQXOAu4ws0OjXFeiO063A/Odcx2AI4G/m1mz+IaVNKI5Pn/El6zn\nAb8A5gEl+EsURwH/cM4dhb/bK6ua7cQkHyX6PvXVQOeI153xZx7VLdMpWKZ+xPTV+LOVGbXczmrg\nAmCYmQ0FGgKZZjbROXfZvryhJBTNMSZoHPcIcLZzblNt1hUgumN1NDDJ97FEa+AcM9sd5boS3XFa\nBax3zm0HtpvZLOCIYDkd45pFc4xPBP4XwDm33My+wl87rgvHuMbj45zbii8cARAcny+BpsDXzrlP\nglnTgAuj3E9lea/S/e8lwY0ODgCW4y/6H0jNDdwG8n2Dgch1G/F9Q7labafCMoPxvd2F3iAjwce4\nC77xxcDarqvHvh0r/IiFI3ScY3uMgV7Am/gGRY3x/WD00TGO6TF+ALgzeN4Wn1Ra1YVjHOXxaQ4c\nGDz/KTAhYt4soGfwfDywror9RJP3ojrGCS2pO+eKzewXwOv4f8JHnXOLzexnwfx/OuemmdnQoOn/\nt8BPqlj3GeAftd1OZWHF7x0nXjTHGN8JUEvg4aAUuds5d1xV64byRpJclMe5VusmIu5UEuXvxedm\nNgNYgG8j84hzbhGAjnHNovwe3wM8bmaf4S/Z3uKc2wjpf4yjPD59gAnmuzbPw7dTKnMd8LSZ9cDX\nDGeY2SrgTnwpvLZ5r8ZjrM5nRERE0kQYo7SJiIhIHCipi4iIpAkldRERkTShpC4iIpImlNRFRETS\nhJK6iIhImlBSF0lTZlYSDEk638zmmNkJUayzLfjbwcz+E8XyfwqG47w3FjGLyP7RfeoiacrMtjrn\nmgXPhwC3O+eyo10nyn1sBlo6/ZCIJAWV1EXqhubAxrIXZnazmc02s8/MbGzFhc3sYDPLDZ5nBCXy\nsuXHBNOn4Pu3nmtmoxLzNkSkOoke0EVEEqdRMHJUQ6A9cCqUl9p7OOeOM7N6wBQzG+T8mM+VuQrY\nHCzfAHjPzF53zg0LSvYDEvFmRKRmSuoi6Wt7WcI1s4HAk0A/YAgwJEj4AE2AHkBVSX0I0N/MykaY\nynrf8tIAAADLSURBVMSPY74iXoGLyL5RUhepA5xzH5lZazMrG895nHPuX7XYxC+cc2/EIzYRiR1d\nUxepA8ysF/7/fT1+xKcrzaxJMK9jRLKvzOvAtWZ2QLB8TzNrHO+YRaT2VFIXSV+NIqrYDbg8aKX+\nhpn1Bj4Mht7dBvwYWMeeQxGXPf83fjznueZXKASGV1hGRJKAbmkTERFJE6p+FxERSRNK6iIiImlC\nSV1ERCRNKKmLiIikCSV1ERGRNKGkLiIikiaU1EVERNKEkrqIiEia+P/PxPdC37A4jwAAAABJRU5E\nrkJggg==\n", "text/plain": [ "<matplotlib.figure.Figure at 0x1176b7790>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(8,5))\n", "action_labels = ['Listen', 'Open Left', 'Open Right']\n", "upper_bounds = np.empty(len(action_labels))\n", "for a, label in enumerate(action_labels):\n", " segment = np.where(res.sigma==a)[0]\n", " ax.plot(belief_grid[segment], res.v[segment], label=label)\n", "ax.set_title('Value function with regular grid of size {0}'.format(grid_size))\n", "ax.set_xlabel('Belief')\n", "ax.set_ylabel('Value')\n", "cutoffs = (np.where(res.sigma==1)[0][0], np.where(res.sigma==2)[0][-1])\n", "plt.xticks(list(plt.xticks()[0]) +\n", " [belief_grid[cutoff] for cutoff in cutoffs])\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }