diff --git a/temporal-difference/.ipynb_checkpoints/Temporal_Difference-checkpoint.ipynb b/temporal-difference/.ipynb_checkpoints/Temporal_Difference-checkpoint.ipynb new file mode 100644 index 0000000..8d474c8 --- /dev/null +++ b/temporal-difference/.ipynb_checkpoints/Temporal_Difference-checkpoint.ipynb @@ -0,0 +1,356 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Temporal-Difference Methods\n", + "\n", + "In this notebook, you will write your own implementations of many Temporal-Difference (TD) methods.\n", + "\n", + "While we have provided some starter code, you are welcome to erase these hints and write your code from scratch.\n", + "\n", + "---\n", + "\n", + "### Part 0: Explore CliffWalkingEnv\n", + "\n", + "We begin by importing the necessary packages." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import gym\n", + "import numpy as np\n", + "from collections import defaultdict, deque\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "import check_test\n", + "from plot_utils import plot_values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the code cell below to create an instance of the [CliffWalking](https://github.com/openai/gym/blob/master/gym/envs/toy_text/cliffwalking.py) environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "env = gym.make('CliffWalking-v0')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The agent moves through a $4\\times 12$ gridworld, with states numbered as follows:\n", + "```\n", + "[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],\n", + " [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],\n", + " [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],\n", + " [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47]]\n", + "```\n", + "At the start of any episode, state `36` is the initial state. State `47` is the only terminal state, and the cliff corresponds to states `37` through `46`.\n", + "\n", + "The agent has 4 potential actions:\n", + "```\n", + "UP = 0\n", + "RIGHT = 1\n", + "DOWN = 2\n", + "LEFT = 3\n", + "```\n", + "\n", + "Thus, $\\mathcal{S}^+=\\{0, 1, \\ldots, 47\\}$, and $\\mathcal{A} =\\{0, 1, 2, 3\\}$. Verify this by running the code cell below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(env.action_space)\n", + "print(env.observation_space)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this mini-project, we will build towards finding the optimal policy for the CliffWalking environment. The optimal state-value function is visualized below. Please take the time now to make sure that you understand _why_ this is the optimal state-value function.\n", + "\n", + "_**Note**: You can safely ignore the values of the cliff \"states\" as these are not true states from which the agent can make decisions. For the cliff \"states\", the state-value function is not well-defined._" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# define the optimal state-value function\n", + "V_opt = np.zeros((4,12))\n", + "V_opt[0:13][0] = -np.arange(3, 15)[::-1]\n", + "V_opt[0:13][1] = -np.arange(3, 15)[::-1] + 1\n", + "V_opt[0:13][2] = -np.arange(3, 15)[::-1] + 2\n", + "V_opt[3][0] = -13\n", + "\n", + "plot_values(V_opt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 1: TD Control: Sarsa\n", + "\n", + "In this section, you will write your own implementation of the Sarsa control algorithm.\n", + "\n", + "Your algorithm has four arguments:\n", + "- `env`: This is an instance of an OpenAI Gym environment.\n", + "- `num_episodes`: This is the number of episodes that are generated through agent-environment interaction.\n", + "- `alpha`: This is the step-size parameter for the update step.\n", + "- `gamma`: This is the discount rate. It must be a value between 0 and 1, inclusive (default value: `1`).\n", + "\n", + "The algorithm returns as output:\n", + "- `Q`: This is a dictionary (of one-dimensional arrays) where `Q[s][a]` is the estimated action value corresponding to state `s` and action `a`.\n", + "\n", + "Please complete the function in the code cell below.\n", + "\n", + "(_Feel free to define additional functions to help you to organize your code._)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sarsa(env, num_episodes, alpha, gamma=1.0):\n", + " # initialize action-value function (empty dictionary of arrays)\n", + " Q = defaultdict(lambda: np.zeros(env.nA))\n", + " # initialize performance monitor\n", + " # loop over episodes\n", + " for i_episode in range(1, num_episodes+1):\n", + " # monitor progress\n", + " if i_episode % 100 == 0:\n", + " print(\"\\rEpisode {}/{}\".format(i_episode, num_episodes), end=\"\")\n", + " sys.stdout.flush() \n", + " \n", + " ## TODO: complete the function\n", + " \n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the next code cell to visualize the **_estimated_** optimal policy and the corresponding state-value function. \n", + "\n", + "If the code cell returns **PASSED**, then you have implemented the function correctly! Feel free to change the `num_episodes` and `alpha` parameters that are supplied to the function. However, if you'd like to ensure the accuracy of the unit test, please do not change the value of `gamma` from the default." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# obtain the estimated optimal policy and corresponding action-value function\n", + "Q_sarsa = sarsa(env, 5000, .01)\n", + "\n", + "# print the estimated optimal policy\n", + "policy_sarsa = np.array([np.argmax(Q_sarsa[key]) if key in Q_sarsa else -1 for key in np.arange(48)]).reshape(4,12)\n", + "check_test.run_check('td_control_check', policy_sarsa)\n", + "print(\"\\nEstimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\")\n", + "print(policy_sarsa)\n", + "\n", + "# plot the estimated optimal state-value function\n", + "V_sarsa = ([np.max(Q_sarsa[key]) if key in Q_sarsa else 0 for key in np.arange(48)])\n", + "plot_values(V_sarsa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 2: TD Control: Q-learning\n", + "\n", + "In this section, you will write your own implementation of the Q-learning control algorithm.\n", + "\n", + "Your algorithm has four arguments:\n", + "- `env`: This is an instance of an OpenAI Gym environment.\n", + "- `num_episodes`: This is the number of episodes that are generated through agent-environment interaction.\n", + "- `alpha`: This is the step-size parameter for the update step.\n", + "- `gamma`: This is the discount rate. It must be a value between 0 and 1, inclusive (default value: `1`).\n", + "\n", + "The algorithm returns as output:\n", + "- `Q`: This is a dictionary (of one-dimensional arrays) where `Q[s][a]` is the estimated action value corresponding to state `s` and action `a`.\n", + "\n", + "Please complete the function in the code cell below.\n", + "\n", + "(_Feel free to define additional functions to help you to organize your code._)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def q_learning(env, num_episodes, alpha, gamma=1.0):\n", + " # initialize empty dictionary of arrays\n", + " Q = defaultdict(lambda: np.zeros(env.nA))\n", + " # loop over episodes\n", + " for i_episode in range(1, num_episodes+1):\n", + " # monitor progress\n", + " if i_episode % 100 == 0:\n", + " print(\"\\rEpisode {}/{}\".format(i_episode, num_episodes), end=\"\")\n", + " sys.stdout.flush()\n", + " \n", + " ## TODO: complete the function\n", + " \n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the next code cell to visualize the **_estimated_** optimal policy and the corresponding state-value function. \n", + "\n", + "If the code cell returns **PASSED**, then you have implemented the function correctly! Feel free to change the `num_episodes` and `alpha` parameters that are supplied to the function. However, if you'd like to ensure the accuracy of the unit test, please do not change the value of `gamma` from the default." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# obtain the estimated optimal policy and corresponding action-value function\n", + "Q_sarsamax = q_learning(env, 5000, .01)\n", + "\n", + "# print the estimated optimal policy\n", + "policy_sarsamax = np.array([np.argmax(Q_sarsamax[key]) if key in Q_sarsamax else -1 for key in np.arange(48)]).reshape((4,12))\n", + "check_test.run_check('td_control_check', policy_sarsamax)\n", + "print(\"\\nEstimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\")\n", + "print(policy_sarsamax)\n", + "\n", + "# plot the estimated optimal state-value function\n", + "plot_values([np.max(Q_sarsamax[key]) if key in Q_sarsamax else 0 for key in np.arange(48)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 3: TD Control: Expected Sarsa\n", + "\n", + "In this section, you will write your own implementation of the Expected Sarsa control algorithm.\n", + "\n", + "Your algorithm has four arguments:\n", + "- `env`: This is an instance of an OpenAI Gym environment.\n", + "- `num_episodes`: This is the number of episodes that are generated through agent-environment interaction.\n", + "- `alpha`: This is the step-size parameter for the update step.\n", + "- `gamma`: This is the discount rate. It must be a value between 0 and 1, inclusive (default value: `1`).\n", + "\n", + "The algorithm returns as output:\n", + "- `Q`: This is a dictionary (of one-dimensional arrays) where `Q[s][a]` is the estimated action value corresponding to state `s` and action `a`.\n", + "\n", + "Please complete the function in the code cell below.\n", + "\n", + "(_Feel free to define additional functions to help you to organize your code._)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def expected_sarsa(env, num_episodes, alpha, gamma=1.0):\n", + " # initialize empty dictionary of arrays\n", + " Q = defaultdict(lambda: np.zeros(env.nA))\n", + " # loop over episodes\n", + " for i_episode in range(1, num_episodes+1):\n", + " # monitor progress\n", + " if i_episode % 100 == 0:\n", + " print(\"\\rEpisode {}/{}\".format(i_episode, num_episodes), end=\"\")\n", + " sys.stdout.flush()\n", + " \n", + " ## TODO: complete the function\n", + " \n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the next code cell to visualize the **_estimated_** optimal policy and the corresponding state-value function. \n", + "\n", + "If the code cell returns **PASSED**, then you have implemented the function correctly! Feel free to change the `num_episodes` and `alpha` parameters that are supplied to the function. However, if you'd like to ensure the accuracy of the unit test, please do not change the value of `gamma` from the default." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# obtain the estimated optimal policy and corresponding action-value function\n", + "Q_expsarsa = expected_sarsa(env, 10000, 1)\n", + "\n", + "# print the estimated optimal policy\n", + "policy_expsarsa = np.array([np.argmax(Q_expsarsa[key]) if key in Q_expsarsa else -1 for key in np.arange(48)]).reshape(4,12)\n", + "check_test.run_check('td_control_check', policy_expsarsa)\n", + "print(\"\\nEstimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\")\n", + "print(policy_expsarsa)\n", + "\n", + "# plot the estimated optimal state-value function\n", + "plot_values([np.max(Q_expsarsa[key]) if key in Q_expsarsa else 0 for key in np.arange(48)])" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "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.7.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/temporal-difference/README.md b/temporal-difference/README.md new file mode 100644 index 0000000..98c5f7d --- /dev/null +++ b/temporal-difference/README.md @@ -0,0 +1,5 @@ +# Temporal-Difference Methods + +### Instructions + +Follow the instructions in `Temporal_Difference.ipynb` to write your own implementations of many temporal-difference methods! The corresponding solutions can be found in `Temporal_Difference_Solution.ipynb`. diff --git a/temporal-difference/Temporal_Difference.ipynb b/temporal-difference/Temporal_Difference.ipynb new file mode 100644 index 0000000..8d474c8 --- /dev/null +++ b/temporal-difference/Temporal_Difference.ipynb @@ -0,0 +1,356 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Temporal-Difference Methods\n", + "\n", + "In this notebook, you will write your own implementations of many Temporal-Difference (TD) methods.\n", + "\n", + "While we have provided some starter code, you are welcome to erase these hints and write your code from scratch.\n", + "\n", + "---\n", + "\n", + "### Part 0: Explore CliffWalkingEnv\n", + "\n", + "We begin by importing the necessary packages." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import gym\n", + "import numpy as np\n", + "from collections import defaultdict, deque\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "import check_test\n", + "from plot_utils import plot_values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the code cell below to create an instance of the [CliffWalking](https://github.com/openai/gym/blob/master/gym/envs/toy_text/cliffwalking.py) environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "env = gym.make('CliffWalking-v0')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The agent moves through a $4\\times 12$ gridworld, with states numbered as follows:\n", + "```\n", + "[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],\n", + " [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],\n", + " [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],\n", + " [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47]]\n", + "```\n", + "At the start of any episode, state `36` is the initial state. State `47` is the only terminal state, and the cliff corresponds to states `37` through `46`.\n", + "\n", + "The agent has 4 potential actions:\n", + "```\n", + "UP = 0\n", + "RIGHT = 1\n", + "DOWN = 2\n", + "LEFT = 3\n", + "```\n", + "\n", + "Thus, $\\mathcal{S}^+=\\{0, 1, \\ldots, 47\\}$, and $\\mathcal{A} =\\{0, 1, 2, 3\\}$. Verify this by running the code cell below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(env.action_space)\n", + "print(env.observation_space)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this mini-project, we will build towards finding the optimal policy for the CliffWalking environment. The optimal state-value function is visualized below. Please take the time now to make sure that you understand _why_ this is the optimal state-value function.\n", + "\n", + "_**Note**: You can safely ignore the values of the cliff \"states\" as these are not true states from which the agent can make decisions. For the cliff \"states\", the state-value function is not well-defined._" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# define the optimal state-value function\n", + "V_opt = np.zeros((4,12))\n", + "V_opt[0:13][0] = -np.arange(3, 15)[::-1]\n", + "V_opt[0:13][1] = -np.arange(3, 15)[::-1] + 1\n", + "V_opt[0:13][2] = -np.arange(3, 15)[::-1] + 2\n", + "V_opt[3][0] = -13\n", + "\n", + "plot_values(V_opt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 1: TD Control: Sarsa\n", + "\n", + "In this section, you will write your own implementation of the Sarsa control algorithm.\n", + "\n", + "Your algorithm has four arguments:\n", + "- `env`: This is an instance of an OpenAI Gym environment.\n", + "- `num_episodes`: This is the number of episodes that are generated through agent-environment interaction.\n", + "- `alpha`: This is the step-size parameter for the update step.\n", + "- `gamma`: This is the discount rate. It must be a value between 0 and 1, inclusive (default value: `1`).\n", + "\n", + "The algorithm returns as output:\n", + "- `Q`: This is a dictionary (of one-dimensional arrays) where `Q[s][a]` is the estimated action value corresponding to state `s` and action `a`.\n", + "\n", + "Please complete the function in the code cell below.\n", + "\n", + "(_Feel free to define additional functions to help you to organize your code._)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sarsa(env, num_episodes, alpha, gamma=1.0):\n", + " # initialize action-value function (empty dictionary of arrays)\n", + " Q = defaultdict(lambda: np.zeros(env.nA))\n", + " # initialize performance monitor\n", + " # loop over episodes\n", + " for i_episode in range(1, num_episodes+1):\n", + " # monitor progress\n", + " if i_episode % 100 == 0:\n", + " print(\"\\rEpisode {}/{}\".format(i_episode, num_episodes), end=\"\")\n", + " sys.stdout.flush() \n", + " \n", + " ## TODO: complete the function\n", + " \n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the next code cell to visualize the **_estimated_** optimal policy and the corresponding state-value function. \n", + "\n", + "If the code cell returns **PASSED**, then you have implemented the function correctly! Feel free to change the `num_episodes` and `alpha` parameters that are supplied to the function. However, if you'd like to ensure the accuracy of the unit test, please do not change the value of `gamma` from the default." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# obtain the estimated optimal policy and corresponding action-value function\n", + "Q_sarsa = sarsa(env, 5000, .01)\n", + "\n", + "# print the estimated optimal policy\n", + "policy_sarsa = np.array([np.argmax(Q_sarsa[key]) if key in Q_sarsa else -1 for key in np.arange(48)]).reshape(4,12)\n", + "check_test.run_check('td_control_check', policy_sarsa)\n", + "print(\"\\nEstimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\")\n", + "print(policy_sarsa)\n", + "\n", + "# plot the estimated optimal state-value function\n", + "V_sarsa = ([np.max(Q_sarsa[key]) if key in Q_sarsa else 0 for key in np.arange(48)])\n", + "plot_values(V_sarsa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 2: TD Control: Q-learning\n", + "\n", + "In this section, you will write your own implementation of the Q-learning control algorithm.\n", + "\n", + "Your algorithm has four arguments:\n", + "- `env`: This is an instance of an OpenAI Gym environment.\n", + "- `num_episodes`: This is the number of episodes that are generated through agent-environment interaction.\n", + "- `alpha`: This is the step-size parameter for the update step.\n", + "- `gamma`: This is the discount rate. It must be a value between 0 and 1, inclusive (default value: `1`).\n", + "\n", + "The algorithm returns as output:\n", + "- `Q`: This is a dictionary (of one-dimensional arrays) where `Q[s][a]` is the estimated action value corresponding to state `s` and action `a`.\n", + "\n", + "Please complete the function in the code cell below.\n", + "\n", + "(_Feel free to define additional functions to help you to organize your code._)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def q_learning(env, num_episodes, alpha, gamma=1.0):\n", + " # initialize empty dictionary of arrays\n", + " Q = defaultdict(lambda: np.zeros(env.nA))\n", + " # loop over episodes\n", + " for i_episode in range(1, num_episodes+1):\n", + " # monitor progress\n", + " if i_episode % 100 == 0:\n", + " print(\"\\rEpisode {}/{}\".format(i_episode, num_episodes), end=\"\")\n", + " sys.stdout.flush()\n", + " \n", + " ## TODO: complete the function\n", + " \n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the next code cell to visualize the **_estimated_** optimal policy and the corresponding state-value function. \n", + "\n", + "If the code cell returns **PASSED**, then you have implemented the function correctly! Feel free to change the `num_episodes` and `alpha` parameters that are supplied to the function. However, if you'd like to ensure the accuracy of the unit test, please do not change the value of `gamma` from the default." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# obtain the estimated optimal policy and corresponding action-value function\n", + "Q_sarsamax = q_learning(env, 5000, .01)\n", + "\n", + "# print the estimated optimal policy\n", + "policy_sarsamax = np.array([np.argmax(Q_sarsamax[key]) if key in Q_sarsamax else -1 for key in np.arange(48)]).reshape((4,12))\n", + "check_test.run_check('td_control_check', policy_sarsamax)\n", + "print(\"\\nEstimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\")\n", + "print(policy_sarsamax)\n", + "\n", + "# plot the estimated optimal state-value function\n", + "plot_values([np.max(Q_sarsamax[key]) if key in Q_sarsamax else 0 for key in np.arange(48)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 3: TD Control: Expected Sarsa\n", + "\n", + "In this section, you will write your own implementation of the Expected Sarsa control algorithm.\n", + "\n", + "Your algorithm has four arguments:\n", + "- `env`: This is an instance of an OpenAI Gym environment.\n", + "- `num_episodes`: This is the number of episodes that are generated through agent-environment interaction.\n", + "- `alpha`: This is the step-size parameter for the update step.\n", + "- `gamma`: This is the discount rate. It must be a value between 0 and 1, inclusive (default value: `1`).\n", + "\n", + "The algorithm returns as output:\n", + "- `Q`: This is a dictionary (of one-dimensional arrays) where `Q[s][a]` is the estimated action value corresponding to state `s` and action `a`.\n", + "\n", + "Please complete the function in the code cell below.\n", + "\n", + "(_Feel free to define additional functions to help you to organize your code._)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def expected_sarsa(env, num_episodes, alpha, gamma=1.0):\n", + " # initialize empty dictionary of arrays\n", + " Q = defaultdict(lambda: np.zeros(env.nA))\n", + " # loop over episodes\n", + " for i_episode in range(1, num_episodes+1):\n", + " # monitor progress\n", + " if i_episode % 100 == 0:\n", + " print(\"\\rEpisode {}/{}\".format(i_episode, num_episodes), end=\"\")\n", + " sys.stdout.flush()\n", + " \n", + " ## TODO: complete the function\n", + " \n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the next code cell to visualize the **_estimated_** optimal policy and the corresponding state-value function. \n", + "\n", + "If the code cell returns **PASSED**, then you have implemented the function correctly! Feel free to change the `num_episodes` and `alpha` parameters that are supplied to the function. However, if you'd like to ensure the accuracy of the unit test, please do not change the value of `gamma` from the default." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# obtain the estimated optimal policy and corresponding action-value function\n", + "Q_expsarsa = expected_sarsa(env, 10000, 1)\n", + "\n", + "# print the estimated optimal policy\n", + "policy_expsarsa = np.array([np.argmax(Q_expsarsa[key]) if key in Q_expsarsa else -1 for key in np.arange(48)]).reshape(4,12)\n", + "check_test.run_check('td_control_check', policy_expsarsa)\n", + "print(\"\\nEstimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\")\n", + "print(policy_expsarsa)\n", + "\n", + "# plot the estimated optimal state-value function\n", + "plot_values([np.max(Q_expsarsa[key]) if key in Q_expsarsa else 0 for key in np.arange(48)])" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "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.7.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/temporal-difference/Temporal_Difference_Solution.ipynb b/temporal-difference/Temporal_Difference_Solution.ipynb new file mode 100644 index 0000000..8e16799 --- /dev/null +++ b/temporal-difference/Temporal_Difference_Solution.ipynb @@ -0,0 +1,713 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Temporal-Difference Methods\n", + "\n", + "In this notebook, you will write your own implementations of many Temporal-Difference (TD) methods.\n", + "\n", + "While we have provided some starter code, you are welcome to erase these hints and write your code from scratch.\n", + "\n", + "---\n", + "\n", + "### Part 0: Explore CliffWalkingEnv\n", + "\n", + "We begin by importing the necessary packages." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import gym\n", + "import numpy as np\n", + "import random\n", + "import math\n", + "from collections import defaultdict, deque\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "import check_test\n", + "from plot_utils import plot_values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the code cell below to create an instance of the [CliffWalking](https://github.com/openai/gym/blob/master/gym/envs/toy_text/cliffwalking.py) environment." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "env = gym.make('CliffWalking-v0')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The agent moves through a $4\\times 12$ gridworld, with states numbered as follows:\n", + "```\n", + "[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],\n", + " [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],\n", + " [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],\n", + " [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47]]\n", + "```\n", + "At the start of any episode, state `36` is the initial state. State `47` is the only terminal state, and the cliff corresponds to states `37` through `46`.\n", + "\n", + "The agent has 4 potential actions:\n", + "```\n", + "UP = 0\n", + "RIGHT = 1\n", + "DOWN = 2\n", + "LEFT = 3\n", + "```\n", + "\n", + "Thus, $\\mathcal{S}^+=\\{0, 1, \\ldots, 47\\}$, and $\\mathcal{A} =\\{0, 1, 2, 3\\}$. Verify this by running the code cell below." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Discrete(4)\n", + "Discrete(48)\n" + ] + } + ], + "source": [ + "print(env.action_space)\n", + "print(env.observation_space)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this mini-project, we will build towards finding the optimal policy for the CliffWalking environment. The optimal state-value function is visualized below. Please take the time now to make sure that you understand _why_ this is the optimal state-value function.\n", + "\n", + "_**Note**: You can safely ignore the values of the cliff \"states\" as these are not true states from which the agent can make decisions. For the cliff \"states\", the state-value function is not well-defined._" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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++dPM/jsu8kbFt5/+GqLWPHyBCqL8pvr8xh9ye8p2raYNQun468v5fRLrZMHgM8X/rFvlyu1zWOlpfksen8C9fXhn3vIzjqds86cw+YtL7Ls7zNwxiVzztn/eVLH25HiHElMHfsydb6DvPX5FNbueI7vDv0VA3IuAKCoMp+XV0yg1hfOo2fa6Zw/fA5f7XqR976YgcuRzEUjrZNHv5SzuGLg06wrWcj8zZfy1aE3ueKUZ+ibHL6Ocm9tPvPWT6DaH84jL+l0Lus/h9UHXuTlrTNw2ZOZMsA6eRxLfu1SflUQ2Z+MSb6Ui9Nn8k7pLF6GmUuUAAAgAElEQVQoupk+rhFMzey++5Mj5dj7cF/SH9kUWM1DNVP4pPFt7kz8Hf0d4Z8A+DaQz53VEygLhbePwY7TuSVhDot9LzK7ZgYJRjK3J3Te9mGYZuzfb/d4PP2B3bs+/phA3rEv4Pq/IKP82DX/lyiPaMojWmZZZ4+ga8lQHlEyYn+D9v9Zer5E0+tptHTlESVTeUTR60dESXAf99RcCDDA6/Xuaf2YdT66EhERERERiUFNj4iIiIiIWJqaHhERERERsTQ1PSIiIiIiYmlqekRERERExNLU9IiIiIiIiKWp6REREREREUtT0yMiIiIiIpampkdERERERCxNTY+IiIiIiFiamh4REREREbE0NT0iIiIiImJpanpERERERMTS1PSIiIiIiIilqekRERERERFLU9MjIiIiIiKWpqZHREREREQsTU2PiIiIiIhYmpoeERERERGxNDU9IiIiIiJiaWp6RERERETE0tT0iIiIiIiIpanpERERERERS1PTIyIiIiIilqamR0RERERELE1Nj4iIiIiIWJqaHhERERERsTQ1PSIiIiIiYmlqekRERERExNIcxypIq4JQwskYSteXUd7ZI+halEe0zLLOHkHXkqE8omRUdPYIuhY9X6Lp9TRauvKIkqk8ouj1I5pePyKaoN1DOjrSIyIiIiIilqamR0RERERELE1Nj4iIiIiIWJqaHhERERERsTQ1PSIiIiIiYmlqekRERERExNLU9IiIiIiIiKWp6REREREREUtT0yMiIiIiIpampkdERERERCxNTY+IiIiIiFiamh4REREREbE0NT0iIiIiImJpanpERERERMTS1PSIiIiIiIilqekRERERERFLU9MjIiIiIiKWpqZH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fmi7EGCA1+vd0/ox63yUJyIiIiIiEoOaHhERERERsTQ1PSIiIiIiYmlqekRERERExNLU9IiIiIiIiKWp6REREREREUtT0yMiIiIiIpampkdERERERCxNTY+IiIiIiFiamh4REREREbE0NT0iIiIiImJpanpERERERMTS1PSIiIiIiIilqekRERERERFLU9MjIiIiIiKWpqZHREREREQsTU2PiIiIiIhYmpoeERERERGxNDU9IiIiIiJiaWp6RERERETE0tT0iIiIiIiIpanpERERERERS1PTIyIiIiIilqamR0RERERELE1Nj4iIiIiIWJqaHhERERERsTQ1PSIiIiIiYmlqekRERERExNLU9IiIiIiIiKU5jlWQVgm4TsJIuoGM8s4eQdeSWdbZI+haMpRHlIyKzh5B16LnSzS9nkZLVx5RMpVHFL1+RNPrRzS9/4hotAGZsR/TkR4REREREbE0NT0iIiIiImJpanpERERERMTS1PSIiIiIiIilqekRERERERFLU9MjIiIiIiKWpqZHREREREQsTU2PiIiIiIhYmpoeERERERGxNDU9IiIiIiJiaWp6RERERETE0tT0iIiIiIiIpanpERERERERS1PTIyIiIiIilqamR0RERERELE1Nj4iIiIiIWJqaHhERERERsTQ1PSIiIiIiYmlqekRERERExNLU9IiIiIiIiKWp6REREREREUtT0yMiIiIiIpampkdERERERCxNTY+IiIiIiFiamh4REREREbE0NT0iIiIiImJpjs4eAAAHCjDumIz57jqwtxrSyqUYb70AxfugV1/MG/4Dxl3Q/nI+eB3j3QVQXwPfmYQ58xFwJ3T8+E+w4MECah6cTOqCdRj2tv9ETVu/oOEPD5Iy7x9HXY5/zRJ87z5LqLIU58jvEH/LHGzJGR017A7TVFLA3qcmM+DJ6Dwa92+jZOGj+A9sw5k7kOyrZ+Hue1q7y6la+ToVHy8g5KshadQksqY/gs3V/bYPgPrirRR8NIf64q24M/qRd+HPSR14brv11XvWUvi3x2ksLySx92n0v2wu7ox+J3HEHaumbDtbP32M6pItuBJzGHjmHfTyTGm3vmzfWratepz6qkJSc05j+AVzSUyzRh5r1j7A7t2L2kxPTMxj6pSPY85TULiUDRvm0dBwiB49xjPurLm43ZkdPdSTptZ3kE+3zmZv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8NM+HW9v8rjSOX/qY7QH9/D0v6azcuMvOHX8DxlZcDoAtc1VPLZsGoFgPI+i7GM4beI83t38EIvfqsTryuDzk+yTx/DMz3Dh6Ht5v24h89ecy7t7n+LCUfcxLCN+nf72QBX3r5pGazieR3H6MXxpxDxW7HqIxz6sxOvMYPpI++RxOFWBl/nh1sSxZErGuZyZM5tF9XfwYO3VlHjLOd8/OI8lyRQ4S7gp/XfURFbw/bbp/CP0DDem/ZIRrvhPAHwUqeLG1mk0xOL7xxjXMXwtdR5Lgg8xt62SVCODWan22T9WGH8lakS4zfFVrnRM655+ZMwG4EOquNIxjXrieYznGG405/G08RDfMSpJI4Nvm/bJ43D2Omr5Ut40aj65JXVRrJi7W3/FX7xLuDpnJo2Oen7a8iCOfmo/jH2XBx1o7NixI4CPY4++BoWH/4Lff4Lcxv4ewcDib+jvEQwsucrDIjf5HbT/Y+nfi5VeT61ylIeFX3lY6PXDSq8fVjr/SKh17GCG/wyAkevXr9+y/zL7vLUpIiIiIiKShJoeERERERGxNTU9IiIiIiJia2p6RERERETE1tT0iIiIiIiIranpERERERERW1PTIyIiIiIitqamR0REREREbE1Nj4iIiIiI2JqaHhERERERsTU1PSIiIiIiYmtqekRERERExNbU9IiIiIiIiK2p6REREREREVtT0yMiIiIiIrampkdERERERGxNTY+IiIiIiNiamh4REREREbE1NT0iIiIiImJranpERERERMTW1PSIiIiIiIitqekRERERERFbU9MjIiIiIiK2pqZHRERERERsTU2PiIiIiIjYmpoeERERERGxNTU9IiIiIiJia2p6RERERETE1tT0iIiIiIiIrbkOV9CcDbHcvhjKwPfRmP4egYiIiIiIJNPhAvzJl+mTHhERERERsTU1PSIiIiIiYmtqekRERERExNbU9IiIiIiIiK2p6REREREREVtT0yMiIiIiIrampkdERERERGxNTY+IiIiIiNiamh4REREREbE1NT0iIiIiImJranpERERERMTW1PSIiIiIiIitqekRERERERFbU9MjIiIiIiK2pqZHRERERERsTU2PiIiIiIjYmpoeERERERGxNTU9IiIiIiJia2p6RERERETE1tT0iIiIiIiIranpERERERERW1PTIyIiIiIitqamR0REREREbE1Nj4iIiIiI2JqaHhERERERsTU1PSIiIiIiYmsDoulxbN+K/9SjIRKxzPe+uJici87Ef+rRZH29Etfa1Yd8Ht+iP5Az/RRyzziG9Dtvhc6O3hx2rwkbYX5Q8AOOG30cnx31WRbkLDho7TrPOi4tuZTJpZOZMWwGq72HzmgwUh5WysNKeVgpDyvlYaU8rJSHlfKwUh5Wgz2Pfm96HHtqyfzuLIxwyDLf/fYbpP9sLu3XzaHpqReJTJxM5revxWgPJH0ez7KlpD78AO3fu53WXz+B68Ma0n55dx9swZF3T949VKVU8diOx5i7Zy4P5T7ESxkv9ajrMDq4pvgaJgcn8+y2Zzm281hmDZ1FwEie0WClPKyUh5XysFIeVsrDSnlYKQ8r5WGlPKwGfR6maSadysrKRpSVlZl5a7abuQ1mr0xHPfuKWXr8Ceaoc84zy8rKzNw9Xd3Lip563hz6i992P/ZvazPLysrMgn+8l/S5Rl5yuVn8k/u6Hxf8/R1zTHm5mbs9cMTGmzypIzu1G+3mpNJJ5hupb3TP+03ub8zKksoetYsyF5mfG/k5M0rUNDHNGDHzzBFnmgszF/bJWJWH8ujvSXkoD+WhPJSH8lAeymPftN213SwrKzPLyspGHLi0Xz/pcb+1nPZZc2ifc1uPZaGzz6fzimvjD4JBfE8/TizHT3R0Wc8nikZxfVBDV8Vx3bMiEyvi8zd82FvD7xXrvOsIG2GO7Ty2e96xncdS460hgvXyv2pfNVM6p+D45K/RwGBK5xSqUqr6dMy9SXlYKQ8r5WGlPKyUh5XysFIeVsrDSnlY2SGPfm162m+aS+j8Sw5Z4165HP/pFaQ+8msC3/o+Zlp6jxoj0IoRDhHLK0jMdLkwM7Nx7N19pIfdq+pcdWTFsvCa3u55edE8uhxdNDobe9QWRAos8/xRP3tce/pkrH1BeVgpDyvlYaU8rJSHlfKwUh5WysNKeVjZIQ9Xv/7fP4XImHE0P/4cnuWvkXHnLbQMKSZSXmGpMYJBAEyPxzLf9HgwusJ9NtYjodPoxGNat2Pf47Bh3ZZOR/LaA+sGM+VhpTyslIeV8rBSHlbKw0p5WCkPK+VhZYc8+qzpSXl8PqlPPNz9uOW+BUQqph52PdOfT9SfT2fZeNw1Vfiee5rAAU2P6Yl3nUbYGqYRDmN6fUdg9H3Ha3p77BT7HqeYKdbaWPJanzm4tvlQlIeV8rBSHlbKw0p5WCkPK+VhpTyslIeVHfLos6YneGEloTO+2P04ll94yHpXTRWmL4XomHHd86IjS3Fu29Kj1szKxvR4cTTUJ77zE4lgtDZbL3kbBAojhbQ6WgkTxkO8S65z1uGJeciKZvWorXPVWebVO+vJj+T32Xh7m/KwUh5WysNKeVgpDyvlYaU8rJSHlfKwskMeffadHjMrm1jJ8O4J36G7Pd/ip0j97QOWea51a4mMGNWz2OEgMmES7tXvJWrXrAKnk0jZ+CMy/r4yPjQet+m2fNnrvZT3mBiaiOuAHnVycDJVvipMTABMTKpSqqgIWj8JG8yUh5XysFIeVsrDSnlYKQ8r5WGlPKyUh5Ud8uj33+k5mODML+N583V8i57EsX0LqQ/fj3PDWoKXfuWTgiBGQ6KL7JxxOb4/Popn2VJcH9aQ/rO5BL80E1LT+mcD/j+lmClc0HoBcwvmstq3mtfSXuPRnEe5qukqIN5VB434d5jODpxNh6ODeQXz2OjZyF35dxFwBDin9Zz+3IQjSnlYKQ8r5WGlPKyUh5XysFIeVsrDSnlY2SKPg93pui9+p2ffVPjKyh6/05PbYJpHLV5qjvrCOeaY8nJz5PkzLb/RU/TE4vg6+9UPfeBhs/T4E83SKceaw+bcYubu7Dyi4+yre6F3GB3mTYU3mRWlFeZnR33WfCTnke5lZWVl5uLMxd2Pq73V5gXDLjDLS8vNmcNmmjXemn6/l7vyUB7KQ3kMlEl5KA/loTyUx39OHof6nR7DNM2kzdDYsWNHAB83PvsasaLiPm3EBqoGf3+PQEREREREktnh2sEZo84AGLl+/fot+y8bsJe3iYiIiIiIHAlqekRERERExNbU9IiIiIiIiK2p6REREREREVtT0yMiIiIiIrampkdERERERGxNTY+IiIiIiNiamh4REREREbE1NT0iIiIiImJranpERERERMTW1PSIiIiIiIitqekRERERERFbU9MjIiIiIiK2pqZHRERERERsTU2PiIiIiIjYmpoeERERERGxNTU9IiIiIiJia2p6RERERETE1tT0iIiIiIiIranpERERERERW1PTIyIiIiIitqamR0REREREbE1Nj4iIiIiI2JqaHhERERERsTU1PSIiIiIiYmtqekRERERExNbU9IiIiIiIiK2p6REREREREVtzHWKZE8Cxd3cfDWXg23GotEREREREpN/sdnX3Lc4Dlx3qNL4IIPu6L/fCkAanM0b19whEREREROQwioBN+884VNPzDnAyUAtEe3FQIiIiIiIi/1dO4g3POwcuMEzT7PvhiIiIiIiI9BHdyEBERERERGxNTY+IiIiIiNiamh4REREREbE1NT0iIiIiImJr/w/BsA4+aM67rgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# define the optimal state-value function\n", + "V_opt = np.zeros((4,12))\n", + "V_opt[0][0:13] = -np.arange(3, 15)[::-1]\n", + "V_opt[1][0:13] = -np.arange(3, 15)[::-1] + 1\n", + "V_opt[2][0:13] = -np.arange(3, 15)[::-1] + 2\n", + "V_opt[3][0] = -13\n", + "\n", + "plot_values(V_opt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 1: TD Control: Sarsa\n", + "\n", + "In this section, you will write your own implementation of the Sarsa control algorithm.\n", + "\n", + "Your algorithm has four arguments:\n", + "- `env`: This is an instance of an OpenAI Gym environment.\n", + "- `num_episodes`: This is the number of episodes that are generated through agent-environment interaction.\n", + "- `alpha`: This is the step-size parameter for the update step.\n", + "- `gamma`: This is the discount rate. It must be a value between 0 and 1, inclusive (default value: `1`).\n", + "\n", + "The algorithm returns as output:\n", + "- `Q`: This is a dictionary (of one-dimensional arrays) where `Q[s][a]` is the estimated action value corresponding to state `s` and action `a`.\n", + "\n", + "Please complete the function in the code cell below.\n", + "\n", + "(_Feel free to define additional functions to help you to organize your code._)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def update_Q_sarsa(alpha, gamma, Q, state, action, reward, next_state=None, next_action=None):\n", + " \"\"\"Returns updated Q-value for the most recent experience.\"\"\"\n", + " current = Q[state][action] # estimate in Q-table (for current state, action pair)\n", + " # get value of state, action pair at next time step\n", + " Qsa_next = Q[next_state][next_action] if next_state is not None else 0 \n", + " target = reward + (gamma * Qsa_next) # construct TD target\n", + " new_value = current + (alpha * (target - current)) # get updated value\n", + " return new_value\n", + "\n", + "def epsilon_greedy(Q, state, nA, eps):\n", + " \"\"\"Selects epsilon-greedy action for supplied state.\n", + " \n", + " Params\n", + " ======\n", + " Q (dictionary): action-value function\n", + " state (int): current state\n", + " nA (int): number actions in the environment\n", + " eps (float): epsilon\n", + " \"\"\"\n", + " if random.random() > eps: # select greedy action with probability epsilon\n", + " return np.argmax(Q[state])\n", + " else: # otherwise, select an action randomly\n", + " return random.choice(np.arange(env.action_space.n))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def sarsa(env, num_episodes, alpha, gamma=1.0, plot_every=100):\n", + " nA = env.action_space.n # number of actions\n", + " Q = defaultdict(lambda: np.zeros(nA)) # initialize empty dictionary of arrays\n", + " \n", + " # monitor performance\n", + " tmp_scores = deque(maxlen=plot_every) # deque for keeping track of scores\n", + " avg_scores = deque(maxlen=num_episodes) # average scores over every plot_every episodes\n", + " \n", + " for i_episode in range(1, num_episodes+1):\n", + " # monitor progress\n", + " if i_episode % 100 == 0:\n", + " print(\"\\rEpisode {}/{}\".format(i_episode, num_episodes), end=\"\")\n", + " sys.stdout.flush() \n", + " score = 0 # initialize score\n", + " state = env.reset() # start episode\n", + " \n", + " eps = 1.0 / i_episode # set value of epsilon\n", + " action = epsilon_greedy(Q, state, nA, eps) # epsilon-greedy action selection\n", + " \n", + " while True:\n", + " next_state, reward, done, info = env.step(action) # take action A, observe R, S'\n", + " score += reward # add reward to agent's score\n", + " if not done:\n", + " next_action = epsilon_greedy(Q, next_state, nA, eps) # epsilon-greedy action\n", + " Q[state][action] = update_Q_sarsa(alpha, gamma, Q, \\\n", + " state, action, reward, next_state, next_action)\n", + " \n", + " state = next_state # S <- S'\n", + " action = next_action # A <- A'\n", + " if done:\n", + " Q[state][action] = update_Q_sarsa(alpha, gamma, Q, \\\n", + " state, action, reward)\n", + " tmp_scores.append(score) # append score\n", + " break\n", + " if (i_episode % plot_every == 0):\n", + " avg_scores.append(np.mean(tmp_scores))\n", + "\n", + " # plot performance\n", + " plt.plot(np.linspace(0,num_episodes,len(avg_scores),endpoint=False), np.asarray(avg_scores))\n", + " plt.xlabel('Episode Number')\n", + " plt.ylabel('Average Reward (Over Next %d Episodes)' % plot_every)\n", + " plt.show()\n", + " # print best 100-episode performance\n", + " print(('Best Average Reward over %d Episodes: ' % plot_every), np.max(avg_scores)) \n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the next code cell to visualize the **_estimated_** optimal policy and the corresponding state-value function. \n", + "\n", + "If the code cell returns **PASSED**, then you have implemented the function correctly! Feel free to change the `num_episodes` and `alpha` parameters that are supplied to the function. However, if you'd like to ensure the accuracy of the unit test, please do not change the value of `gamma` from the default." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Episode 5000/5000" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best Average Reward over 100 Episodes: -13.0\n" + ] + }, + { + "data": { + "text/markdown": [ + "**PASSED**" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Estimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\n", + "[[ 1 3 1 2 3 3 1 2 2 2 2 2]\n", + " [ 0 0 1 1 0 3 1 1 2 1 2 2]\n", + " [ 1 1 1 1 1 1 1 1 1 1 1 2]\n", + " [ 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1]]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAz0AAAEsCAYAAADpfd1iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xd4FNX++PH3bN9seoc0+tIRBEEsKDZEsYFebIgdsVwVroJYEAT0inDtKFdRVECw4FUUaSoqKkhHYCGEFNJI79vn98eGJGs2iEpIvvl9Xs8zj+7MOWfOOUzOzGfnzKyiqipCCCGEEEII0VZpWroCQgghhBBCCNGcJOgRQgghhBBCtGkS9AghhBBCCCHaNAl6hBBCCCGEEG2aBD1CCCGEEEKINk2CHiGEEEIIIUSbpmvpCgghhAjMarUOAeYAUfi+pMoCJttstt9qt68BbrDZbIV/UM4JpftdnkWAw2azTfjd+tHAkzabrd9x8k4Hom02230nur8/qMu3QApQ1nC9zWY77WSU32A/YcCnNptteO3nHcB5Nput9GTuRwghxKknQY8QQrRCVqvVCHwBXGyz2bbVrrsJ+MpqtXa02Wwe4KITLO5E0zX0KrDearU+ZLPZahqsv6t226n2L5vN9lEz7yMCOOPYh5MdVAkhhGg5EvQIIUTrFASEA8EN1n0AlANaq9X639p131it1pFAP+AxwADEAu/abLYnau/YNEznBV4BkgE9sMxms83+/c5tNtuvVqvVBowB3gOwWq0dgIHA1bWfHwOuBMyABd9dqE8blmO1WtOBMTab7dfff7ZarUOB52rzeoCnbTbbF3+mk2rvAr1yLCBq+NlqtdqBZ4GLgXbAv2022+u16aYCtwBu4CAwHlgEmGvv8Jxeuy3GZrMVWq3WJ4Dra9cdAO6z2Wx5tfv7CTirtk/XAXfZbDbvn2mHEEKI5iXP9AghRCtks9lKgEeA1VarNc1qtb4H3Aqss9lsTpvNdmtt0vOBI8Ak4BabzTYQGAJMtVqt0Q3T2Wy2LHwBzNs2m+10fHc1LrRardc1UY3XgNsbfL4TWGyz2aqtVmsKcCG+6V99gWnAjBNtn9VqjcAXZNxss9kG4AueXrdarclNZHnearXuaLCMPIHdGIFCm802FF/wNt9qtZqsVusV+IKcM202W2/gMHAfvv6tsdlsp9XeSTtW11uBS4FBtW3dA7zTYD+dgfOAvrXphp1QJwghhDhl5E6PEEK0UjabbZ7Val2I7yL6XOBR4FGr1XqGzWYra5BOtVqto4DLrVbrDUAPQMF3B6XuOR6r1WqpLSvSarXOrF0dDJwGLA9QhWX4go3OQAa+OyPn1+4zw2q1jgNutFqtXfAFWsEBymjKmfjuvqy0Wq3H1qn4AofMAOn/6vS2z2r/uw1fEGTBF6ytqA0ssdlsD0PdnaxALgUW2Wy2qtrPLwLTrFarofbz57V3dsqtVmsqEPkX6imEEKIZSdAjhBCtkNVqPQsYarPZnsf3bM8XtdPJ9uB7RuejBmktwHbgU+B74G3gKnyBT0Pa2nVDbTZbdW3eaMButVonAMdeWvCrzWa7w2az2a1W6zvAbcAWYI/NZjtYm28AvoBiPrAG+A54PUBT1N/V41igoAX22Wy2wQ3a0R4oOKEO+uPyj6mBusCQ2rTu2nzH9huObyphU7QN0+ObJaFrsN+Gzzz9vj5CCCFaAZneJoQQrVMB8LjVaj27wbp2QBiwu/azB99zOV2BUOBxm832Ob6pVkZ8F+t16Ww2WznwM3DszkY48CNwpc1mW1A7res0m812R4N9vg6MxTcd7JUG68/FFxzNwxfwXNVgf79vx8Da/Z1X2wZq69HVarWeW7vtNHzP1iScQN80VX5PfHeK/sg64Bqr1Rpa+3k6vj5x43te6vdBy2rgttrgEuABYKPNZnP8yboKIYRoIRL0CCFEK2Sz2Q7gCyRm1z7TsxffFLRbbTabrTbZCnwBhxff3aD9Vqt1HzAK2At0aZjOarX2Bm4Ahlit1t3AL8BSm832wXHqkQbsB/oAXzbYtBSIrt3fXqAS37S5kN8V8Sjwz9qXA9wMbK0ttwAYjW/63E58zxrdbLPZ0v9ENwE8A1xstVr34HumaOMfZbDZbF/ie57ox9p+iMf3TFIusBn4zWq1RjXI8ha+QGlzbXsHADf+yXoKIYRoQYqqqn+cSgghhBBCCCH+j5I7PUIIIYQQQog2TYIeIYQQQgghRJsmQY8QQgghhBCiTZOgRwghhBBCCNGmNfk7PVar1QgMwvc2G09T6YQQQgghhBCiFdDi+2mELb//WYHj/TjpIHw/cieEEEIIIYQQ/1ecA/zQcMXxgp5cAM2sD1Ci45uzUv9nmOwtXYPWxVLZ0jVoXYKlP/yEVrR0DVqXEOkPPyHlLV2D1kX+XvyFyvHhR8YPfzJ++JPrj3rF3jxmV9wItXFMQ8cLejwASnQ8SmxiM1Xt/xZNTUvXoHXRmVq6Bq2LwdDSNWhdjNqWrkHrYlZaugati8Xb0jVoXUJkErmfMGdL16B1CXP8cZr/n4TpW7oGrUuonG8DaTSqyosMhBBCCCGEEG2aBD1CCCGEEEKINk2CHiGEEEIIIUSbJkGPEEIIIYQQok2ToEcIIYQQQgjRpknQI4QQQgghhGjTJOgRQgghhBBCtGkS9AghhBBCCCHaNAl6hBBCCCGEEG2aBD1CCCGEEEKINk2CHiGEEEIIIUSbJkGPEEIIIYQQok2ToEcIIYQQQgjRpknQI4QQQgghhGjTJOgRQgghhBBCtGkS9AghhBBCCCHaNAl6hBBCCCGEEG2aBD1CCCGEEEKINk2CHiGEEEIIIUSbJkGPEEIIIYQQok2ToEcIIYQQQgjRpknQI4QQQgghhGjTJOgRQgghhBBCtGkS9AghhBBCCCHaNN2p2Imam4HnwVFol2xD0dbvUj28H8+CpyB9PyR2RjthOkrXvoHLUFXU5a/iXbsc7DUofc9Ec9eTKOHRjdJ6V7yGd+1H6N7cUL9u109435sLR9IgMhbN1XegufDak9/YE+DNy6Dq0VEEv+3fH56M/djfegpv5n407Ttjun062s5N9Ed1JfbFs3Bv2wCqiv6MSzDePAXFZPFtd7twLJ2L+/uVqIB+8AiM46ah6A0A2Bc+geub5X5lGm+eiuHS8c3S5hPhytpH2bKZuLL2oY1NIfTqSZh6nRMwbf5jw/EUZTdabx56DRG3zMFrr6L80xew71iL6nRg7HYGYWOfQBsRB4CnspiypTNx7P0RjcmC5YJbCL5wfHM270+zZ+8j/7OZ2LP3YYhOIWbkJIKtgfsDoCr1Z45+NgtnUSampL60u/YZDNEpjdLlrpiGLiSamBEP1a3zuhwUrHqe8p1fguoluPdFxI2agsZoaZa2/RXVRw+QvnoGVbm/YQiJJeGce4nuc0WT6fM2LyZvy/u4KgsIiu1G8oWPEpI0oG770e0ryPlxAa6qYkKST6fjyBkYw9oD4KouJn31TMrSfkRrsBA/+BbaDR7f3E08YXvWTiFn/6eN1ptDEznnlvXHzVuS/StbPrmJc25Zhzk0EQBnTTH7v5tJYeaP6AwWUvrdQkr/8XV53M5K9n/3DEfT1qLRmUjsdS2dB/8TRVFOarv+jprqfLb98jT5uZswGMPp3vtOulhvDJh2xXvWgOt79bufnn3vQ1VV9uz4D4cPLseruunYZQx9+09G0Wj5befL7N31SoDcCtfevP8ktuiv+37nE+zP8B/fh/SaSp/O4wOm35P2LnvS3sPuLCEx9mzO6vMkZmNUo3Qbd0zDbIxmUI/6saPGUcRPe2aTXfAjoJAcdx5Dek/FqA89iS36e74+8AS78vz74/xOUxmYOP64+X7KeI2imjQu7z434PYvbVMIMyZwVof7AUgv2cSK3bcGTHtDv6UkhA0IuK2luL1OXjtwNb3CR3BB/P0B09g9lazKnsX+8g2ASq+wS7i0/RSMWt+5ociRyZc5s8mo2opBY6ZP+EgujH8IvcbIx5lT2F7SeJyKMCQyqcfxx6lTaU/1N/yvZB6F7gxidR0ZFfEwvYKGBUzrVb1MzjwNl+rwW/9c0haCtKGk2bcxP+96v20J+u5MSfgMgBJ3LsuLnibVvoUgTRjDQm9meFjgY6al/Ob6iRXVc8nxpBGhiWWk+Q6GGZu+Xv7GvoxV9oVUeEvoouvPOMuTxGl91x4l3nweLD3XL32QEsLrEb8CkO/JZEn1bA64t2LEzGDjSEabH8KgGJulbc0e9KiFuXhm3Q1O/wNEtVfjmXkHytkj0dw3G++aZXieuRvtgrUo5uDG5az5EO+aD9E8NBclJALPG9PxvvIY2sff9E+XdQjvitchPKZ+XU463ll3o7l2IsrDl6Ie2In31WkQFoVm0PDmaXgTvEW51Dx/N7ga90fNc3egO3Mkprtn41q/jJrn78YyP3B/2BdNx5ubTtBji8Drwf7mNBzvzcF05zMAOJb8G/ev6zFNeg1FUah5ZTLKp69ivM53svJmp2K84RF0Z9dfNAbaz6niqSimcN44TH2HE3bTTFxpOyhZcD9Rk97D0KFPo/TRUz8Cr6fus2PfJkrfm4blPN9FTvny2TgP7yTyrhdRTMGUf/xvil+fSPSUFSgaDSWv34fqtBP1z7dQHVWULpoCikLwBbecsjYfj7uymMw3xhHcczjxo2dSk7mD7HfvJ/me9zAnNe4PV2ku2e/cQ9QFEwnueT6Fa1/lyDsT6fjw5yia+hu6Rd8spGzzR0RdMMEvf+HaV6hK/ZnE2xYAkLtsCkdXzSX+mqeat6EnyOt2cuDDCYR3G06ny2dTnrmZtM+nYopMITihX6P0hbs/48h3L9Lx8llY4npwdMdH7F96B/0mfIUhNI5i2zrSV8+g06jZWOJ7krFmNqmfTqLX+KUAHFxxHx6Xne43vIXHWUXa/6agKArxZ7SO48N67jS6Dp1U99lZXcTmj28g5bTjnzw9bge/bZgGqH7rd6y6D4/bzulXvoXHVcWetb6/h5TTfO3dveYR7JV5DLzmfZzVBez6ejKmkAQSe7XMF0e/p6pefvjmHozGCC687GNKi/exZdMUQkI6ENf+rEbpR435we/z4dRPsO19iw6drwHg4L53SD/0CWcOexFVVfnlh8kYjRF0730X1p630bnb2Lq8Hredb9bcRFKHkc3byD+hpCKVwT0foUti/fhu0AUe3/dnLGfzvnmc3Wc6MRF92X7gVVb/fCdXnfsRilI/duw8uBBb5kec1tV/7NiwdRJe1c3IMxfhVd38sGs6G3dM46JBLzdP4/6CoupUhnV8hJ5x9f1h1B7/fLfv6Bf8mPEK3WMD/7v+nPkGv+V/ytDk++rWJYUN5J4h/sfWattUnJ4q2oUG/gKzJX179HWOOlLpdZw0nx+ZTqEjnVs7LULFw6dZ0/gyZw5XJz2D2+vk/cMTiDV14a4uy6hyF/FJ1mMAXNp+CpclTOPidvXjVKW7iP+m3sBZMa3nIj/XmcpbRx/gqshH6WUexs7qNfz36L1MS/iKaH1So/RF7izcqpOnEzegw1C33qwJASDPdYhkQ2/ujl1Qt02r1F9qv13wIBHaeP7V/iPyXId4t2AyEbp4+lsubcZWnrg8TzrzK+7mSvNE7jFcyiH3Tt6umkaoEkV/Q+Pr5d3O71lW/Rx3B8+lvbYTK6rn8Z/KicwJWwVAjucQYUo0M8JW1uXR1E4yc6tO/lMxgfbaLjwRuoxybxH/rfIdP9cHTWmW9jXr9DbvL+vwTLoG9IZG29QfvgSdHs34KShJndHc9hhYQlB/+CpgWerW71CGjkDTezBKSjc0V9+Buvtn/zReL55Xp0EX/4tC9ccvoUMPNGMmoLRLQTPsCpTzrkLd+PnJa+wJcG1ZR/W0wP3h/tnXH8Ybp6BN6Izx5sfAHILr58b9oaoqit6I6dYn0XboibZTH/TnjcG9b4tve1U5rnVLMd05E531dLTdBmAcfR+ew7/VleHJSUPTqTea8Ji6RTGam6/xf6Dm55VojBbCxz2Dvl1ngs4ajXnIFVStWxQwvTYkEm1YDNqwGBRzMBUr5xMyciKGlN6oHhc1m78gdMyjGDoPQJ/QjfBxs3Bl7MF99DDOjD04U7cScftcDB36YLQOIXT0v6j8euEpbnXTyrb6+qPdtc9gjOtM+KDRhJ1+BcUbA/dH6S/LMbbrTtT5d2KM60K762bjLs2lOtX3N+KxV5K9+AGKvlmILrxdo/xV+78jfPAYzEl9MSf1JfzM66k+9HOjdC2lpjAVR1k2icMewBSZTOxpYzDHWinP+CVg+oKdnxJ7+g1E9RiBKTKF5OGTMATHUHLQd/c358cFtBtyG9G9R2GO7kzKJY/jrMjHXVNKVe4eKrK20uXquQS370NYhyEkX/Avcja1nuNDbwzBaImpWw5teY2w+H4k97vpuPkO/fISBrP/N/jlR/dQmruVvpfMJSyuD5GJQ+h61r9I3+Zrb2VxKgXp39D3krmExvQgOuVcOvQfT1nezmZr35+Vl/M9lRXpDDnnBULDOpPc8XI6dL6GosLtAdObzDF1i6p62f/bG/QfNI0gi+9O34F979Kr3wPExJ1BbPxg+g6YTKrtAwB0eotf/tQDS9DpLfTp//Apa+8fKa1IIzq8N0GmmLpFpws8vu9Je4/eHcfRLflqIkI6c26/WVRUH+FIwY8AOF2VrNvyADtTF2Ix+48dlTV55BT+xDn9ZhAV1oOY8D4M7T2NjNx1uN01zd7OE1VUnUZ8SG+CDTF1i14buD+8qps1B59i9YHHCDc3vui1u8tZ+dt9bDnyNiGGeL9tWo3Bbx+55TvJKtvMSOu/0SinZGLNCcur2c/WohXEGDs1mUZVVXQaI6MSn6R9UE8SgvpweuQY0it91xpHqndR7MzkmqQ5xJo60zH4DC6M/yc7S3zXViZtCCH6mLrl2/zXSAzqx5Do449Tp1KpJ5dhoTcxLPQmovVJXBB2OwZNEOmOHQHT57lSidC2J1KXQKgupm45dtc7z5VKvL6r3zaLNgKAak8Z6Y4dXBw2gVh9R/oGXUgP8zkcsLeec+0vzi9J1vZglHkCcdoUhhqvYKjxKn5yBr5e3un6jp76MxlguIB4bUeuMt9HjieVMm8hANmeVNppOxGuialbQjW+c1Caexf53kzuDJ5De21nuuvPYLT5n/zkaL5r82YNetTt36O58SE0t09rvO3ATpTuA+q+hVYUBaX7AFRb4JMUIeGo2zaiFuahOuyo36+CTv7fT6irFqMYTWjOv9pvvTL0UrR3PeFfnqI0uvvU3Dy7vsdw3UMYxzXuD8/BnWi7+feH1joA78HG/aEoCqa7ZtVNffMWZOPa9AW6XkN8Zdm2gsGEtvfQujz6YdcQ9Oh/felLC6CyFE27jie9jX+VuyALfUpvFK2+bp0+sTvOtMADT0NV6xf77tJcfLtvhaoScc8rGDo3mEpwbBqOy4mnMAslKAxdfP1gr0vsjresAHfhkZPSnr/LVZSFKdG/P4ztulOTEbg/ajJ2EtRpUN1njcGMMaEXNRm+48dVfARV9dLhwU/QRzY+kWuDwqnYvQZPdSmemnIq96zBlHC87/9OLZ0pDFAo2PERquql4sh27EVpWOID1zHxvAeJ7X9do/VetwOPo5KqnN1E9rikbr05qiP979+AzhyOvSQLrSkMc1T98REU1x1XZQGO0tZxfDRUmrudgrR1WM+Zetx05Uf3kGv7jG5nP+q3vrosC50xDEtEfXtDorvjqCqgpvwIxVk/ExzZ1W97p0ET6XXBMye3IX/D0byfiY0bjMEYXrfu9CEz6Nn3vuPk8tm761VCw7qQ3NF3F6CmOp+a6lxi4gbWpYmOPZ2a6jyqq3L98lZVZpO6/z36nf4oGo2e1qDaXoDDVUp48ImN7xXVWcRFnlb3WaczE2pJ4WjxjtrtvrHj6mGfEBrkP3YY9MFcMvhNwiwdGqxVUPHi8Tr/blNOikpnAXZ3KZHmE+sPp6ea4uo0bjxtOe1D+zfaXlqTiaJouGXAp4Sa2jdZjld1s/HwXAYm3BoweGpJXtXDJ1mPcXG7yZi14U2mUxSFq5NmkRjku9YocWazs/QLOof4rjViTJ24ueObdVPdanPhVhv/22dWbWdf2TpGtj/+OHWq9TCfw1WRvjHRo7r4qWIFbtVJB+NpAdPnOg8Rq2/6WMpzphLXxHa9YsKgmPml8hM8qot8Vxpp9m0kGXr//YacJIMNl3Kzxf96WUFpNJ3vmGBNOAfcW8n2pOJR3fzoXEm0JoFgxXdc5XhSidcG7o94bScmhbyJSfE/flw039jRrF89aCc8DYB3T4BvY0sKIOF3HREeBYcDz4nW/ONePLPvwXPnMNBoISIa7ZxlddvVvCy8Hy1A++xy1N/tT/ndftTSQtQfVqG57o9PiCeT6XZff7j3Nu4Pb2kBmvb+9dSEReFJP/4c8ZpXJuHe9AVKTAKG0b72ePMz0cQk4N70Bc6VC1Ad1egGj8D4j4dQdAa82amg1eFc8SLunRtRQiIwXDoe/bBrTlJL/zxtaBSujN1+6zxFOXgrS46bT3U5qVr7NiFX/hNF75sDqugMjZ4Fqlq/GI0lHF37LnhrKlHtlXjtlWhMwbX78j0f5K0sgejEk9Wsv0wXEoX9iH9/uEpz8FQF7g9PRQG60NhGZbjL8gEwte9O4i2BnkPwib38UY4svp+D030nM2NcVxJuee3vNOGkMoYnkHj+Q2RtmEfm+rmgekg4eyJhnRpPXQIISfQ/YZUe2oi9OJ3Q5EHYawMXd00Ze9+9EXtxOsFJA+hwyRMYQmLRW6LxOCrxOCrRGn3Hh6PMd3y4qkswhrf88dFQ2q8LiO18MSFR3ZpM4/W42LPuMbqdPQWDyf8ixxAUjcdZidtZic7ga6+9wtdeZ00J1eWZmEMTydjxDpm7fHc7EnteS4fT72w1z/RUVmQSZGnPnu3zSU9biV4fTLce4+nY9fjT72qqj3L40Cecdd6rdW2x1xQAYDbX/z2ZTNG16fMIstTf7bDtfYvwiB60Swg8/78llFSkoig6ft3/IllHN2IyRNCn03i6JQce383GKKpq8uo+q6qXKnsedqdvrIkK685FZwQeOwy6YJLj/Nu+J20xkSHdMBrCTlKL/p6iqlQ0io4fMl7kcPFGzPoIBiaMp3d84P4w6UIZ2++9JsuLD+nNlT1f+sP92gq+psKRz6DE2/5y3ZvLDwVvYdFF0D/yKrYUfXhCeZZnTGJX6ReEGxI4P853rWHRRdIlpP7LVa/q5ZfC9+lgOb1R/u/yF9Az7GLizE2PUy0pz3mIOTmj8OLhiohJAae2ge9OjkOt4j+5N1LgziDR0INrIqcSp+9Uu/0Qeo2Z2dmXY/dW0tN8LldG/guzJgS9xsh1UU+xomgGGys+wIuHQZYrGRrSOqYJA40ClDJvIb84V3GVKfD18kXGm9nr+pnHyi5DgxajYmZqyHt1U/qyPYcwYOKpsmso9RZg1Q/k+qApRGjiCNVE0kvjf/ysc7xPN13j4+dkabm3tzlqQPe7aV46A6qriQivMA/0RjRTXkU7ZylKUlc8z/+zLr33tcfRXHUHSrvk4+5WtVfjee4+iIhFGTH2uGlPKWcNSoD+wH38iNdw1QSCpi9DExlPzXN3onq9qPYqvEeP4Pz6fYy3P43ptum4f/kax5LnAfBmpwGgSemO+dGF6M8bg/2tJwNOpTtVTANG4MrcS9U376N6XDjTdlC96WNUt+u4+Wq2foUKmM+8uuk0276mcs1bhI5+BEWrx9CxH9qIeMo+mI7XXomnJJ+KL2pP6p7j7+9UCek7Anv2Xkp+9PVHTcYOyjZ/jNpE/bwBjh9Fa8D7B8fPMc7iLPRhcSTd8TbJdy8GrZ7cDx/944yniOp14yhOJ+a00fS+bTkdR84kd/M7FO9f84d5a4oOc+izR4nucxWWdr3wOioBSP9qOvGDb6Hbda/jsVdg+3ACquolOKEfxtB4Dn81HY+jEmd5Pkc2+o6Ppvq/pdRU5FCYsZGU/sefI3946xuYguNp1+3yRtvC4/thDIln37fTcTsrsVfmc+iX2vZ6XXicVZRkb6Yo6yf6XvICXc98mPTtb5G5891madNf4XZVkZH2GTU1BZx13qt07XEL2zbPIDtz3XHzHU79iODgJOLb1z9o63bbAdBo6/+ejv2/x1P/9+R2VZOR9hnderae5xMASit943tkaHdGDF6INXkM3+96krScwON754TL2JG6kKKy/Xi8TrbZXqHGUYxX/fPH+u5D73A4ZzVDereeb/OLanz9EWvpzujeC+kTP4Y1B5/EVtC857uducvoHX8NJn3rCP6OKXQc5oejb3FF4tN/Kt+wuAnc1WUZYfp4FqfdiVf1NkrzVc4ccmv2cVGD53gASp05HKjY2Kqe5fm9UG0Mk9t9xJjIJ/iy5CV2VH0dMF2+6xDV3jIuDb+PO2NfQ6cYeSlvHDXeChzeKko8uaiql5uin+X66GdIc2zjnYJJDfIfpqf5XB5ut4xbY+azr2Yj35S9c4pa+ec41GpeqryPcCWW802Br5fL1EKcqp07Lc/yZOiH9NdfwMuVD1DpLQUg13MIB9XcFPQ4E4PnU+LN54WKO/Go7kZlLa2eQ6Z7H9eaJzXadrKctDs93o8W4P34jbrP2icWovQc2HQGg7HxBb3biWI0NUqqqiqe/zyC5sYH0Qy+EADN5P/guXMY6pYNqJXlqFUVaK44/h+UWlXhe6lC/hG0s5Y06zMsjpULcH5W3x/mRxei636c/tAbUQP0B4bG/dGQNrErAKYH5lN13zA8+7eAVgc1lZjvfR5NnC8INN74CPbXHsF401T0F92AfuhlKMG+b3y1yd3x5mXgWrcU/ZBT8zBdxZcLqFxd3z+R9y8k/JY5lC2bSdmHs9DGJGMZPo6qde8ct5yaX7/CPOASNIbA/5Y1W1ZRsuhRLBfdStBZowFQ9AYiJrxMycKHyXtwEIo5mNCrJ1N2eCeKqWVe5lC4fgFFG+r7I+n2hbS7bg75K2eS/9ks9FHJRJwzjpKN7wTMrwQ4flSPE21Q01MXjvHYK8lbPpXE2/9LUEffNywJ414kbc6F1GTtDvjihOYipSyUAAAgAElEQVSW/cMCcn6s74/2Q++gImsbfe/5CkXRYGnXG2dFHke+e4nI7hc3WU710QPsX3Ib5qhOdLxshm+lxjfstTvzjrq8Xa5+gW3zz6Iyeychif3pOuZlUj99mF/nDkJrDCZ5+GQOZ++su/NzqqVtWcDhrfX9MWDUQiISBpJ/cDVBYcmExzd+mcMxlUUHydz5HkPGNn6LEvgu6E+79GV2ff0wG94chM4QTLehkynL34nWEIyi0eL1uuh7yQvoDMGExfXFXpFD1u6lpJw2/mQ39YTs272AfXvq+yMqui96QygDh8xE0WiJiOpNacl+Dh1YSkLyhU2Wk5XxFSmdrvK7Y6WtDXC8HmfdlDVvbbDT8LmYvJzvAZX2SU2XfypsP7CAHQfr+2LEkIXcdMmPmAy+v/2osO6UVWWwN30pndo3Ht/7d72HiupsPv3ualA0dGo/guS4c9E38eKDpuxKfZtf9v6boX2eICFm6B9naCY/Zy7g58z6/hjTZyETh/yIWe/rj9jg7pTUZLAjZynWmOY531U5C8kq28KwTv9qlvL/jG/zF7DxqK8/VFRc3houbT+VCMOfu2MdZ/Jda/wjZT7P7x1GetUWOgUP9pWrqnyZM4tfCpdyfYcX69Ies6d0NVHGZJIsTY9Tp8rXpQtYU1Z/fNwTt5AupoEEaUMJ0vYkydiTXOcBvit/n9MslzTK/2D8Erx4MGqCABgf/QJPHhnGrur1DA6+iueStmDSWNAoWgAs0c/yfO5oit05FLoy+aF8CTOTNmLUBJFi7IvTW8MnxXMYFnpzXZ5T6fOaBXxeU98fk0IWYtUPpNpbwfzKuynwHGFa6BKMSuBrrHeqnmKA4QLONvq+eL7DMptHy0aw0fExI823Mzd8PVr06BXfuHq/9mUeKD2bg+7tdNf7puSrqsoH1bPY4FjKfcEvkqjrGnBfJ8NJC3qUS8aiPavBABIZd/wMkXG+KW4NlRRCREzjtGXFUJCNklx/W1SxhEC7FMjPQt22ETIP4LmpNqjwuMHtwn19f7QvrUKJaY9aXozn6duhtBDtzMV/eEfo7zJcONYvgFD+oD80EXGopf794S0tRBOgP1SnHff2b9H1OxfFFFSXn6BQ1IoSNOGxoNXVBTyA7/kdlwO1ohhNWDQE+18MaxI64d7t/9aZ5mQZNhbzwPr+0YbHoXQdiPmMUXgrCtGExlD93RK0UQlNlqG6nDhtPxMxIfBbgqp+WEHZ+09iuXA8YaMf8dtmSO5F3Myv8ZQXogkKxX00ExQN2sim52g3p4gzxxLar74/dGFxBHUaSGj/UXgqC9GGxFD60xL0kYH7Qxcah7vC//hxVxRijPvjwcN5NA2voxpjfP3flyEyCY05DFdxVosEPXGnjyWqZ31/ZP+wAHNMF7+3SVna9SL3p7eaLKMyZze2pXdgjumGdewCNDrf9EdDiG/akjm6/hkVvSUKnTkMZ1kuJPbH0q4X/SZ+jauyEK05FHux7/gwhLXM8ZHUZyzxXev7wxjsG08KMzYS17npoA8gP/Vr3I4KNn1wGeA7wQD8+MHl9Bo+g3bWKwiN7cXZN3+No7oQvTGU6jJfe80h7TFaYjFZ4uqmvgEERXTEXpEbcH+nQuduY0lKqe+PfXsWABoUTf1FQ0hoR47m/tRkGdVVeZSXHiAx+SK/9eYgX9/aawoJ1ltq/9/3t2Uy14/HeTkbaZdwXl2Q1FJ6dBjrF8xYzHHotP5flkUEdyL7aODxXaczM/z0Fzin3wy8XjdGQxgrN44hISbw1NFAtu5/iW0HXuXM3o/Tq2Pg14SfKv3ajfULZoINceh/1x9RQZ1IL2m+893h4o2EGONpF9Lyb2w7I2osfcJ9/VHuyuetQzezLu8/rM97EQCX1052zW6OVO/klk7/9cvr8tqxlX9Lt5BzMWh91xqh+jhM2lCq3b7pj17Vy6dZ09hV+jn/SJlPj7DGXwIcqNhIz7Djj1OnytkhYxnQ4E1pDrWGNPs2OpnqnwGON3QhzbEtYH69xtjoc6QukTK3byp5kNb/Ve3x+s4AlLnzyXTuJkqfWBcwASQZe1GjVlDlLSVE2/g18c3tfONYzjDU90eEJo4KbzHPV9xOmbeQqaGLidM2fb182L2bEabxdZ+1io5kbXcKvFkAv3teB0I1UQQr4ZR4ff3lVb28VTWNn5yfMzF4PgMMzfsl0kmb3qaEhKO0S6lfAtyx8UvfrR+qbXvdCVhVVVTbdpRuAR4eCwkHvQE1o/75FtVhh6PZEJ+M5sG5aF9ahXbeSrTzVqL5x30QGYt23kqIjEV1OfHMmgDlJWif+QAloem3lZwsSnA4mviUukX5ozs2XfvhOeDfH54D29F0Cfwwnf2Vybh31Q/a3vwsqCpDk9AZbdfTwOPGk2mr3559CMwWlOBw7O8/S/Xzd/uV503fh7Z98/fLMRpLOLrYlLrFeXgnxW88gKLRoA2LRVEU7Ds3YLAObrIMV7YN1eXA0KXx/M+a7Wspe/8JgkfcRdgY/2la3qoyCp+/AU95EdrQaBSdAfuuDeiTe6Jpodd2a4PCMUSn1C01mTvJXuzrD12orz8qf9tAUOfA/WFO6Uf14fpB2uuswZG9F3NK4OOnoWPPAjly648Xd3kBXns5hqjm/XKgyTqZwzFFptQvEUlUHz3gl6am8BDGiMD1s5dkYVt6B0HxPbFe/yZaQ/3Aawhthz4kjqq8vXXrnJUFuGvKMIYn1D7rcwOuqiL0wdFotAZKD2zAEt8TXQvd6dGbwgkKT6lbtDoTqqpSlr+LiIRBx82b3O8mzrrpK84cu5Izx66k/+WvAzDgijeJ6Tgcl72MzR/dgKO6CGOQr70FaRsIjemJzhBMeHx/aipycNbUP09WVZyKObTpLySam8EYTnBoSt0SFdOfstIDeL31U7LKy1KxBDddx+LCHRhN0YSE+Y975qA4giztKSzYWreusGArJnOs3/M8RQU7iYk7ft+fCiZDOGHBKXXLr/v+w+pf/Mf3wrJ9hIcEHt9/2fs8+zNWoNdZMBrCqKzJo7BsH+2imh57G9qT9i7bDrzG2X1n0LvTzX+7PX+XWR9OhDmlbvkh/T98vMe/P45W7iMqqPnOdzkVO0gMO87MjlMoSBdOlDGFKGMKyZYBPNR9Dfd1+4x7u63k3m4raWfuwaCosVydNCtg/hWZkzlYUX+tUezIosZTRozJdzG/OudZdpV+zvUdXqZXeOPARlVVsqt30cHS8n8rABZtODH6lLplR9VXfFg03S9NluO3umd0GvKobh7POoetlavq1jm8VRS4M4jTdyLDsYvJGf3rAiCAI869aNASo08hTBvLUVc6Lm/9SwHyXGmYFAvBmsiT39gTEKwJJ06bUrdo0DC/YgIVagmPhX5AO+3x/07CNbFkeeqvHVRVJdeTRqwmmTJvIRNKTifVXf8CpmJvHpVqCe1ry11a/Sw/Oz/ngeCXGWho/sC4xZ7pUYaOgJpqvAtnomal4l00B6orUc7xvRNfddhRa+8EKVotyoXX4l3yIt5dP/l+i+eVxyAkAmXg+ShRcX4BF6GRoNH5Pmt1qJ+/A4d+Q3P/HDCZUUsKfEtFaUs1vxHdGSPAUY3jnZl4jqTieH8O1FSiP7O2P5x231vXAMVgQn/eaN9v8di24knbTc0rD6MbeCHaxK5o2nVAd/oF2N+YiidtD+79v+JYNhf9+dehaHXoTh+OZ8dGnKsX483PxLnmA1zfr0R/2e0t1/74jjh++57K9e/iLsyi/H8v4jy8s+53c1SvB09Zgd8ULnfOQbRRCWiMQX5leR3VlL3/BMY+52E5/yY8ZQV1i+p2orGEoTrtlH/0LO6CTGq2fkXlqtcIuWziKW3z8RhjOlJp+57i79/FWZxFwdcvUpO5k4iz6/vDXV7fH2GDRmPP3Enh+tdx5Kf6foA0vD1BXc78w33pw+Ox9DiP/JUzqcnciT1nPzlLJmHuOBBTYut4q0x0nytxVRaSsWY29uJMivevIWfTQuIH1/eHs7KgbhpS+uqn0eiD6Dhyhu+5nMoCnJUFeJxVKIpCuyG3kb3xFUoOfkt1QSpp/5uCpV1PLO37ojOH4XHZyVj7LPbiTIr2fkX2D6+RcE7rOT7A97IBj6uK4MjGd/O8HieOqgJUr6dRwGQO8d2tMoe0R2cIRm8Kw+O2c+CHZ6kuyyTv4Fcc2vIanQb52huZOITgqG7sXvMvKosOUnD4G9K3vUVSnxtOaXuPJ6nDSDQaHb/+9DgV5YfJSPuM9NRP6NzNV0evx4m9xtcfx5SVHiQsvEvA8jp3u57d2+dxNPcnCvI3s3v7PLr2GFe33et1U1F+mNCw5puG8VelxA/nSP5G9qQtprwqk98Of8DBIyvp29k3vnu8TqrtBXhVX19YTHFsO/Aq+cXbKSrbz7ot99Mh/gIiQ/+4bZXVOWzeO5eeHa4nJX441faCuuVY+S2tS9RwDhdvZGv2YkpqMtmW8wG/5a9kUGJ9f1Q6T259C6sOEh3U+o4NraKrC4COLTrFiFkbRqjed4fT5bVT4fJda+g1Jk6PHM3q3H+TUbWV7OrdLM98mB6hFxJn6kpW1Q42Fb7L8LgHSDD3psJVULccU+rKxuGtItbU+voDYEjwGArdmXxeMp+jrnS+LV/MtqpVXBzmC5TdqpNyt+/40Co6epjP5ovS+aTat5DjPMC7BZMJ08bQO+h8EgzdCdPG8UHRNHKdB0m1b2FJ0eMMCR5NsDaS3kEXYNaE8EHRY+S70thfs4nPip/nvNBbWs1LYb62v0O65zfusMzBqJgp9RZQ6i2oe0bHrTop9db/vZxvHMtq+ztsda4jz5POkuo5lKlFnG28ijBNNB20vXi/aibp7t847N7Nq5UP0lM3lBRdT1LdO1jjeJerzQ/QQde7bl+l3oLjVfFvabEXxytBwWgffwPPgqfwrFsBKVa0T7xZ9wOZ6o9f4n15KrpPfRGkZvyjeE1BvmCnuhKl5+lon16EEuA3b37Pu2k1eNx4nxrvv6H7AHRzlp7spv0lSlAw5n+9gf2tp3B9uwJNkhXzI/X94f7pS+xvTCVkia8/jDdPhaVzsf/nAVSnHd2gizE1eBW2aeK/sS+eRfWsW0CrQ3/OVRjH+h4O0/U4A9P9L+D85DUcS59HE5uE6b55x3/mqJlpw2KJuOtFyj96joqV89En9SDqwUVoI3y/g+ApzuXotAuIengxxtq7P57yQjSWxg+JOm2/4K0swbHrG/IfOdtvW9SDizD2GErEHfMo/eBJCmZcgSYijrCbZmDqd0HzN/QE6UJjSbj5RY5+8RwFX83HlNCDpLsWoQ/39YerNJe0OReQNGExls6DMUQmknDLyxz93xyK1i/AnNyPxPGv+f0w6fG0v34uR1f9myPv3AteNxbrOcRd2fjV6i3FGJ5Aj5veIXPdc+z+75UYgmNJOv8hYk8bA4CzPJcdr1xAj5sWY2nXi7JD3wOw81X/W+Xtz5pA0vkP0W7weFSPk8NfPoHHXkFohyF0u25B3Ymn6zXzOLzqSXYvvAJDSBwdR84golvrOT4AHNVFwLHXefsrzd3Or5+O45xb1mMO/eO5+31HzGPvN0+yackVmILj6DV8BrGdfO1VNFoGjFrAvm9n8PPya9EZgkk57VaS+rae39rQ64MZduEitm2ewZrPr8BkjmHAGU/SPsn3Y3qFBdv5bu04Rl69Hkuwrz/s9kIMTbxhzNrzdhz2YjZtfABF0dCh8zVYe9Z/KeR0lKKqbgzG1vWQOkC76DM4//QX2H7gNTbvfZ6QoCSGD5hHfJRvfM8v3s6qTeMYe+F6QoIS6dnxRiqrc1iz+R5UVaVj+0sY0uvEfhgwI38DHq+TvelL2Ju+xG/bdcPXEBacctLb92clhZ/B5T1e4KeM1/gu7XnCzUlc3mNe3Z2Y7PLtfLhrHHedsZ4w08l5M2OVswiTrvUdGydid+mXfJI1lWf6+a41Lm0/FW3uXJamP4DLa6dn2MVcluA7N+wp8z3svzbvBdbmveBXztN9f0Or6Kh0+capIG3r7I9ofRL3xP2XT4vn8E35IqJ0SdwW+xJJRt/PIRy2b+el/HFMT1hPlD6RMZFP8L+SF1hU8BB2byVW05ncE/ffureV3RO3kI+LZzE/93o0ipaBllFcGembXm/WBHN//Lt8XDybF3Kuw6wJZUjIaEaE3dNi7f+9zc7VeHDz74rxfuu76gbweOhSDrq382zFOOaGrSdGm8gIk+9Z+mXVz1HuLaKDrhdTQxYTUnvnamLwf1hSPZvnK27Dg5v++gu4Kch3/Gxx+o6fFTUvsKLG//h5O+I3vx91PVmUY9Opfs9qtXYADmvfWI8S27pe0dpSzK3nt9ZahZCKlq5B6xJa3tI1aF3Cylq6Bq2L9Ie/sNZzo71VCJfjw0+4HB9+ZPzwJ/3hT64/6hV4jjC57AKAjjabLb3htpZ7ZbUQQgghhBBCnAIS9AghhBBCCCHaNAl6hBBCCCGEEG2aBD1CCCGEEEKINk2CHiGEEEIIIUSbJkGPEEIIIYQQok2ToEcIIYQQQgjRpknQI4QQQgghhGjTJOgRQgghhBBCtGkS9AghhBBCCCHaNAl6hBBCCCGEEG2aBD1CCCGEEEKINk2CHiGEEEIIIUSbJkGPEEIIIYQQok2ToEcIIYQQQgjRpknQI4QQQgghhGjTJOgRQgghhBBCtGkS9AghhBBCCCHaNAl6hBBCCCGEEG2aBD1CCCGEEEKINk2CHiGEEEIIIUSbJkGPEEIIIYQQok2ToEcIIYQQQgjRpknQI4QQQgghhGjTJOgRQgghhBBCtGkS9AghhBBCCCHaNAl6hBBCCCGEEG2aBD1CCCGEEEKINk2CHiGEEEIIIUSbpvujBDVGwHwKavJ/gM7d0jVoXdzalq5B66IqLV2D1kVRW7oGrYvG29I1aF10npauQeuid7V0DVoXo6Ola9C6mKtbugatS0h5S9egdYkoaekatB7O41x7yJ0eIYQQQgghRJsmQY8QQgghhBCiTZOgRwghhBBCCNGmSdAjhBBCCCGEaNMk6BFCCCGEEEK0aRL0CCGEEEIIIdo0CXqEEEIIIYQQbZoEPUIIIYQQQog2TYIeIYQQQgghRJsmQY8QQgghhBCiTZOgRwghhBBCCNGmSdAjhBBCCCGEaNMk6BFCCCGEEEK0aRL0CCGEEEIIIdo0CXqEEEIIIYQQbZoEPUIIIYQQQog2TYIeIYQQQgghRJsmQY8QQgghhBCiTZOgRwghhBBCCNGmSdAjhBBCCCGEaNMk6BFCCCGEEEK0aRL0CCGEEEIIIdo0CXqEEEIIIYQQbZoEPUIIIYQQQog2TYIeIYQQQgghRJsmQY8QQgghhBCiTdOdkr3kZKCfMArXp9tA23iXys5f0M2biuvdDU2X4Xahff8VNBv+B5XlqN374b7ncUjq5NvusKNd+Bya71cD4D3rIjx3TQFTkH85Tgf6e6/Cfd901H6DT1YL/xRvbgbOSaMwvrcNpUF/eNP343rzKdSM/SgJndHfNR1Nl75NluNevwLPJwtQy4rR9Dgd/V0zUGLa+6VRXU6cj16DbvxjaPsOBcC1/GU8K15pXKCiYFq+/+Q08i9wZe6jculM3Jn70MamYBk9CWPvc5pM79i2lspP5+MtzkWXaCX4+mnoO/QBQPV6Kbj3NHA5/PJEv7QFTVAoAFWrFlDzzQeojmoMvc8l5KbpaCxhzdfAP8mevY+jK2diz96HITqFmMsmYbE23R/VqT+T/9ksXIWZmJL6En/dMxiiUwBwl+VzaOa5fuk1phC6PvOr3zqv20nG/GuIvfIxLN2GnvxG/Q3VRw9w+OsZVOX+hiEklsRz7iW69xVNps/dspj8Le/jrCwgKLYbKRc+SkjiAAA8zioyN7xAsW0tXreD0JQz6HjxExhC4/zK8Lqd7H77Gjpc9BhhHVtPf+xaP4Wc/Z82Wm8OTWTYzesbrfd63RzYNJecA5/jcVcTk3wuPc59AmNQNEXZv7Bl5biA+znj6vcpOvIzh7YEGC9QGHFvy40XDVVX5/Prr0+Tl7sJozGcnj3vpGu3GwOmVVUvK5afhsfjPzaMHrMFgyG0QTqVb7+5neTkS+nc5dq69V6vix3b53I4fSWokJw8ggGnT0OrNTRP4/6ib/c8wd6s5X7rzuo+lX4dxwdMn56/gZ9sc6moySY6tAfDej9NVIi1UbpfU19j35GPuPm8xufrsqoMlv0wijsv2oZGc2ouL/4sj9fJwj1X0yNyBMMS72+0vdRxhFd2XBAw7xWdnqNvzFXsKfyclYcm+23rFnEB13V7DYAKZz5fpT/N4bJNmHXhDG1/JwPjAh+PLWFv5TesKppHoSuDWH1HRkY/TA/LsCbT/1S2jA3FC6nylpBi6s/omCeJNvjOLWXufGYc9j+3mDQhzOr8K5vLP+HD/KkBy3y8wzdE6NsH3NbS9rp+YkX1XHI8aURoYrnUfAfDjNc2mX6N/V3W2t+jUi2ht/5sbg56klBNVKN0mxyf8WbVI7wTaWvO6p80OWoGDzCKD9mGVmn673mjuooPeZUCcunBAO7mSdorKXXb/6e+yxe8Rzkl9Ods7uZJwhVf/6iqyjJeZQ3LsVNDP87kbp4kQoluljY1/6hUkIv+ybtRnI6Am5W0/ehmPwhG83GL0S5dgGb9Z7gfmoUa0w7t0tfRP34HrjdWgcmMdvGLKHt+xT3zTVBVdM8/Aovm4bnn8fpCHHZ0cx5CyUo7mS38U9TCXFzP3t3oYly1V+OcfQfaoSPRTpyNZ+0ynHPuxvjKWhRzcKNyPJvX4X5rBvp7ZqN06ol70WycL07C+MzS+jKdDlwvTkLNOuiXVzfqNnQXjW2Qzo7zqZvQDh15klt74rwVxZTOHYex33BCbp6JK20HZa/dT8Qj79UFMg25sw9StnASITc+hb7bIGrWvkPpi3cTNWctGpMFT0EWuJ1EPbcBdPUXI4o5BIDqte9Q/fXbhN41F01YLBWLplKxZCZhd849ZW0+HndlMVkLxhHcczhxY2Ziz9hB9jv3kzzxPUxJjfvDVZrLkUX3EHXhRIJ7nE/RulfJXjSRDpM+R9FocOQfQhsSTYeHVtZnUvxv9HpdDnI/mIQz/yCtjdftxLZ8AhFdh9P58tmUZ2zm0OdTMUakEJLQr1H6gt2fceS7F+l02SwscT04uvMj9i+9g353f4UhNI70NbOpzNlJt9EvojUEk7H+39g+mkjvW1eg1PaL1+3g4MpJ1BS0vv7ocfY0rEMm1X121BTxyyc30KHfrQHTp25+maOH19N/xIvojGHs+/4Zdq39F4OuXEREfH/OH/+DX/o93z6Bs6aE8Pj+hEb3JLlX/Xjh8djZ/OlNxHdpufGiIVX1svG7ezAaI7hkxMeUlOzjl5+nEBzSgXbtzmqUvrIyC4/HyRVXbkCjqR8b9PoQvzK3bp1FXt6PJCdf6pd/+/Z/k31kPeee+xqg8NOmyfy251X69nuo2dr4VxRXpnKm9RGsCfVfDOh1jc8lAEfLdrN6+wOcaZ1MSuwwth56g6+2TuT6c1ej1egblHmIrYdeJ8gY06iMippcVm29G4838Lm+tfg+53UKa1Kb3B5qaMeD/f3/Hr7PfpVDZT/QLcIXDBXUpGKNuIhLOzxVl0anMQK+Y+dD2z0E6SO4vffH5FXt4/O0KUSaOtAprPHxeKrlOVJ5N+8BRkU/Sg/LMHZVrmFR7r08mvIVUfqkRun3V33P5wXPcUP8XOIMnVhVOI+3cyfySMoqAPKdhwjRRvNwcv25RamdRNQ/eCTdg+q/qFPx8nbOPUTqE1ttwJPnSWd+xd1cYZ7IBMOlHHLv5O2qaYQqUfQ3DG+U/lv7cj6qnsc4y3Q66fryWc2rvFBxJ0+FfoSmwTm23FvEkurZp7Ipf0uBmstM7sbJ8f+ed6ibmMdkxvMIAxnGapbxOON4Vf0Ss2Lha3U5i5nHPUynG31Zxqs8zZ28oPr652s+5Gs+ZBJzCSWC15nOyzzGk7zZLO1q1ultyqZ16O+7BlUf+BswzecfoHv4etTIxgNoo7RrP8Vz472oA86CpE54HpwFJYUoe7f79rVlI96R/0Dt1gfV2hfPyLEoO3+pr0v6AXQPXgf52SencX+BZ/M6HI9eAwH6w7PpS9Dq0Y2bgiaxM7rxj6EEheDZ9FXAstyfLEB7+W1ozxmFJqEzutseRy3OR60oBcCblYrzsetQ8zMb5VXMFpSImLrF8/USFJMF3Q0Pn9wG/wn2TStRTBZCbnkGXfvOmM8ejenMK6hesyhgeudvP6KL74j57NHoYpOxjH4YtaIIT47vZObJTUUT2R5tVALasJi6RVEUVK+X6tX/JXjMZIy9z0Wf1J3gax/h/7F339FR1fn/x593+iSZZNITEkghhiC9iQhiYVWUxYKuRsUuq7iuyurXujawrG2xrIqiPxVdCzZYFRuwCrqgAiEgSAmEdJJJnyQzmXZ/f4zOMGQA/S6kzPf9OOceztz7uZN7X9y5d973fu4dT+V2VJ+vO1f7gFrXLUFjjCbt/Acwpg4k7phziR1zJo1fh8+jZe1iTOkFJJ40C2NaHmnnP4SnuYaOkrUAuGpLMCTnootNDg6W4Jmozr0llD9zPu6GrttLb+CoL6GzpYrME27AFD+AlJHnEZUyiNay78K2t236kNQxF5E4eCqmhCwGnHQz+phkmnauxOd107DlY7Km+K/8RKXkM/D3D9Je8yPOhlIAOmwl/PjK+XQ29c489EYLxujkwLBr3XNYU0eQNXxm2Paq6qPg+LuI7zcWS+JRZI+4lMbqHwDQaA0h79Vi+5GGim8ZccpjaDQ6dIbokOnlm99Eq48m/9ie21/sq6Z6NXb7Ho6b+ARxcQPJzv49ubkzaKgvCtu+paWE6Oh+REdnYDYnBwZFUQD/VaOVKy6jqnIlen1syLwuVyslO99i3DHzSE4eQ3LyaJsMlWUAACAASURBVIYOu57Gxi1HfD1/q6a23aTEDSXKmBwY9NrwJxeLdr/EwLTTGJFzOdboHCYffTcAze2lgTaq6uPfm+8iJa7rSZfdtct57z8z0Gp619Wu/dV2bGNj3bskmnIP2EajaIkxJAeGNnc9RbZ3OTP3b5h0/sK43rGLlKhBIe1MOv+2sqtlNY3OPZyT9wRJ5oEMTfo9I5JnUGkPvz12t2ZPDZPiZjLJOpNEfX9Oir8KgxJFmWNj2PbbOr4mL2oCQ2OmkGzI4bTE66l1lWD31ANQ6yohxZBLrC45MFh0/mOLXmMKGb+57UuaPNX8IWVet63vb/W9axkDtIOZbr6WVG0WxxnPZKLxbNa4Pgrbfnnn65xiupRJxnPopx3IldEPUu+rZIv725B2b3TMo592YHeswn9trbqcvzADPYf+PH/EIiZyOmcrV5Cp5HIVd2Aiiq/x5/UxrzOdS5minEN/ZSA38CC1VLIRfz7r+JqJTGWYMp4sJZ8ZXM0m1h6xdTuiRY9m/Wq8l8/Be+1d4acXrcFz2+P4zrzkkO/lmfMgvmP3ueSs8R+gAldMYq1oVn8O9hawt6D5z5eoeUMCzZXNP6COm4zniTf/1+vz3/JtXI3uwjnoruiah7qjGM2g0Sga/3+Joigog0ajbu+6o1Qdbai7NqOdcFpgnKZfDqbnVqJYrP6/tW0dmhETMTz4zkGXSbVV4f30dXSX3Yai0x+07ZHkra9AnzU0ZBl0mQW4d4XfESsxVjw1u3HtWIfq8+H85gMUcwzalJ+7c1XvQpeWE/5v1ZTga63HOPrUwDjD4Akk3v9RIP+e5m6swJQ5FEUbzMPYrwBHWfg8HOXFmHPHBV5rDGaMGUNwlPm3n87aEgwp4fMAcJSuIyp/IgP+fPDtpafozHGAQt3G91BVH/bKIhwNu4lOGxK2ff8TbyJl1Pldxvu8nYBK/nn/wNJ/9D5T/PsTn8cFgL1iHXG5Exlyee/MY19Ne4uo272cgknhu5EADJpwMynZJwLQ2VFPxdZ3Scw8tks71edlx38eJ2v4pUTFDegy3dFaRdmm1ymYeBsabc/tL/ZVW7uW1NTxGI3WwLhxx8xl6LDrw7ZvbdmFxXLgz0JT01ZiLAOYOvV9DAZLyDSbbT1arYm0tGBXx9zcGZx40kv/5VocXh2dNjrdzVijD7ye+6pqWMvAtKmB13pdNDNPXEGiJT8wbtOeRei1JgZlnNNl/grbasbnz2HS4PDH+t7Ap3r5ePednNz/Fsw666Fn+NnKiscpiD+FAbFjA+PqHSUkmsJnu6dlLdmx40P+xhk5c5mcGX577G4F0cczPfk2ALyqm+9a3sWrusgyjwzbPkpjpdSxnr2dJXhVD+talxCvyyBK61+/2s4SkvWH3s6cvja+aPwHUxNuIErbe7qR7+8Yw+lcEn13yDgFBbca/opHnbeCPF0wO6NiJlWTRYkneKxe71pOpWcH00zXHJmFPsw2sJqZzGEWh/4876WCAoLrrygK2QxiGxvDTjcqZvqRFZhuwcoGVlGv7qVTdbKKTxhI+OP64XBEu7d5/3w/QMgVl3157vH3E1c+ffeQ76WOmhDyWrPsHVBV1EH+ri3eWbehe/BG9Of779NRs/PxXhfs2uab/nN/Wq/nt63EYaT/oz8P75aueajNNpR+oTsOxZqIuqdrn3m1ttL/b1sLnfdcjFq9B03BaPRX3Y0SnwIQ0n3tYDxLX0bJHox21IH783YHTWwi7tLNIeN8DdWobU1h25vGnYGreCXNj14MGi0oGuL+/ByaGP+O2FtTgs/ZTtMjF+OtK0PXfzAxhXegS8vFW1eOYorBU7aFtg+ewNdiwzD0eGIuuBNNmK6EPUEbk4izIjQPT1M13vbweXhabehiU0LG6SyJeFpqAXDV7kLRm9jz5Ay8rTbMuWNJmX47ujj/PSzWCb9ue+kpxrgM+p84h4p//53ylY+D6iVj0nVYc8N3F7FkhB7Am3etwtm4h9j+49BoDVgHht4btfeHRejMVszJeQCkju7deexr97oFpA48FUti/iHb7lg7n93rF6A3xjF+xltdptfu/pIOeyU5o68OO3/pxpeJTRpMclbP7i/21dZWTlR0PzYVz6e0dAk6fQwFBZczcGD4PvgtLSV4PO0s//Ji7PYy4uMHM3rMHcTG+s/+Z2ScREbGSeH/lr2c6OgMyso+ZsuWBXjcHQwYMJXhI+b0qnt6GttK0Cg6vt/5FOW2VZgM8YzIvpyCzBld2na67TjdzaiofLzuj9hafiTRUsDxR/+V+Bh/Ji0dFazftYBzJyymqrHr8euEof5jW1VD+GN9b7C25mXMuniGJ5/NhrpfdzKjum0zu1u+5ZphHwfGeX0umjor2Nn8b76ufBoVH0cnTGVy5g3oNAaaOsuJNfbj3xXz2VS/BKM2hvFplzMq5cD3hPSEWtcuHi+bjg8v0xJvDtu1DWCS9RJ2OtbyWPk0NGgxaMzMzng9cI9HrWsXOo2J+eUzaPXYyDWP5czk24nThd4fuablHXSKgfFxvSuH/aVpQ7+Htfjq+c71CWeZwhetcZpEGn17A699qo9G317aVP+xut3Xyhvtc7kuZv4hu4r1Ftcp/s/zZvXQn2cridSzN2RcHdXEEh+Y3kBoPvXspRV/PoX8iQeYzZWcgAYt8STxKG8frlXponec1v6NlB/XoX3pUbyF14I1wT9ubyVqcjqeh17B87fXQKNB9/c7e3hJf4NOR8i9JwDoDKhuV9e2jjYAPAvvQzftMgy3PQ8ddlwPX/ubumepzg68q5ai+334+wC6k3HMVDzlW+lY+Qaqx41710Yc376P6nGHbe/raMHXWk9M4Z3E3/UuUb+7hNaX/gdPnb87kqdmF2p7C9FnXk/cn55D0RtpfuxSfB12VGc7qseFffHfiJ7xF2L/+Hc8ZVtpffnW7lzlg7IMn4qzaitN37yB6nXjKNtIy/fvo3rD56G6HSj7bT+KzoD685ULV90uVFcHqWf/lfSZ8/G01FL50izUHjwJ8FuoPg/Oxj0kjzyXoVcsJueMedR8/yqN27445LyOhlJK/nUbScPOJjq96xmkhm2fU732ZQZMubXXXL34tRz2amzlqw54L8/+MgrOYcIf3iMhYzzrProSj6stZHrFlrfJGHQ2BlN8l3k97g6qty8le2TP7y/25Xa3s6d0KQ6HjeMnP8ugQZex7oe5VFYsD9u+tXUXLlcLQ4ddz+TJz6HVGlm54lJcLvuh/5annfb2SnZsf4Njxt3PuGPuo6LiczZufOxwr9Z/panNf99qoqWAaWMXMjjzPL768R5Karp2l3Z72gH4ZusD5KVNZdrYFzEb4vnX95cHpn31418ZlXs1cdFdr/71BQ2OUtbUvMwZOff/pvk21L3NwLhJJEflBcY1OsvwqR4MmijOO+ppfjfgVjY3fMSXZQ8D0OltZ3P9UtrcNs7Pf5Zj0i7jsz1z2d4YfnvsKbHaZG7s/x7nJN/NZ41Ps8n+edh2dm89bp+TwtS/cUP/dxgSPYVFe2+gw+vvSl/r3oXL18HZyX/lkvT5tHhqWVg1C68aPLaoqsralneYFDcTrdJ39rGdagfPtF2PVUnhJFP4E2HjDdP4xLmQcs82PKqLpY5/YFcb8eA/Vr/d8TCjDFM4Sj+mOxe92xzPND7nHX5Uv8erevhCfZddbAms//FM4z0WUqpuw626eJt/0EIwn3r2YsDInTzLI7zFAI7iEW7ErYb57nsYHLYrPZq3F6B9+4XAa88DC1GHjj3IHP87StEadHOvwzfxFHwXXecf2daK9u934nnkNdQC/5Ufz51PYrjqNJRdP6EOHHzYl+NQPB8swPNBMA/DXQvRDD5IHnojePb7T/a4UIymrm1/fuKb9qyr0Y73d9HS3/gEnbMmou4sRhk06lcto2/jakBFc8zvflX7w6n9kwV0LAvmE3fjQmKveBj7m/Noe+tBtCkDiJpyKR3LXw0//3uPo03LJep3lwGgzxqCu3Qzji9fxXLxPcTf9ib4vChG/9P7Yv/4BPX/cwKdG1f4u9C5O7EU3olhsP8KouWyeTQ9cB7e5jq01pSwf/NIalixgIYVwTwyr15I2gUPU/fhPOqWPog+cQDxx19K06pXw86v6IyBAucXqseFNsp/5Sv3zhWg1aP5uTDqd+kz7Jo7CceeIqIGjuvyfj2t6tsFVH0bzKPfhKuxV25gxLWfoigaYtKH4mrdS8Wqp0koOPWA79NRt4Of3roSc2IuuWfM7TK9fssn7PrXbaSPv4KUEecekXU5HHatW8Du9cE8xkxfSEK/sewt+YyouAFY07o+zCGcaGs2AMN/9yhfvXYCe3d9QeZg/9l/l6ORhqrvyBt/Y9h568tXo6oqqbndv7/Y15YtC9i6JZhFYuJwDIZYxh0zD41GS0LCUJqbtrFz51tk9u+6rL875U1U1YtO5983HDfxCZYuOYGqyhXk5J590L+tUXS43W1MOO4xLBZ/ATBy1K2sXXMro0ffEXgIRndbv2sB63cFM/n92IVcfvK3mAz+z39SbAEtHWVsKX+LvPTQBzNoNFoACjJnBK4EnTzsYV779/Hsqfs3bm8HLredETm9q9g9mG+qFvBt9S95qLh9Dk4ZcAdWY+avfg+f6mVb45dMzb4nZHxy1FH8ZfRaovT+EwOp0QWoqHxYcjOnZd+FRtFi0sYyLWceGkVLevRQ6jq2sb7uLQYldP9nZ3njAlY0BreNWRkLyTWPxayNJVN7NJmmo9nbuYNvWt5guOW0LvO/V3cvQ2OmMC7W363xgtSHeKRsKt+1vs9J8VdxV/YKtOjR/Xw/12Xpz3B/6ST2OIsYaPYfWyo7t9DgLmdM7FndsMa/zUeOBXzsCObzF8tCBunH0uGz82TbNdi8ldwV+yZGJfz9cNPNs6n3VXFv6zlo0DDOMJXh+smYlRh+dH/LFs8aHoz7OOy8vcFidQHvEVz/e1nIEOXXf3c/lT9QyS7u4Up8eBnBcZzM2bTjP4l0AbOxUcUczkFBw0SmMobJRBGDqqrM51ZmchPHKv7Pxq3qk1zJCXzPSiYy9WB/+n/lsBU9vmmF+CbvszNNTD1w4/8lZe1KdA/eiG/SqXhveRR+vvFUKS9B6XSgZh8VbJyRjRoVDTUV0ANFj/aUQjQTgnkoCQfPQ0lIRW22hYxTm+tRrF0f8vBLFzZNRvBmTCUuEaLjUOtr4NcWPUWr0Iw+EeUAD5o4kswnFGIcG8xHG5+Kkj8W4/jp+Frr0cQl4/jqTbSJGWHnd+/ZjPmEC0LG6bKG4K3xn+FU9MaQaYreiDYpE19zLfo8/70c2rRgftqf7//xNdb0SNFjnVCIZUQwD11cKlG5Y4kdNR1vWz1aSzLN/3kTXUL4PHRxqXjsoduPx16PIc3/mdAYo0PbWxLRRlnxtNYe5jU5PFJHF5I4OJhH1bcLMCflhXypjE4fQs3alw/4Hm3Vm9n29tWYk/MpuGABGl3oNlFX9C67P72H9GMuJ2tK77nKF07/oYWk5QXzMMX49yf15atIzT1w0Qf+G9DrSldiTRuJMcr/GFCt3ozZkoHbGewuWV++GmNUEtbU8H3768tWkZx9Ipoe7saVl1cY8kS1LVsWgKIJfHkHiI3NobZ2Tdj5tVpjl9fR0Zl0OA79WTCbU1AUXaDg+eVveb2dOJ2NmM1H5jGrhzKkfyF5acFMok2p6LShJ8zio3OpqP9m/1kx6ePRKHrio/fZH2oNWMwZ2B3VlNevpsG+g5e+9H8RUlUPXp+bF78YxYXHf4LF3PuewjUmtZCjE/152F21vP7TJXxV+SRfVT4FgMfnpLp9M9VtxVxYEP5+rMq2Ity+Do6ynthl2i8Fzy+STAPxqW7a3Y1YDCmoqg+NEtweE005lLaE3x6PtOPiChkZE9w2XKqDUscGcszBexpTjXmUOjeEnb/CuZkTrJcHXmsVHf0MBTS6KwAwakKPLRZdItFaKy2e4OdpW8cqBphGdOny1hucZCzkGEMwn3hNKnZfI4/br6LFV8/tsYtI0R74CqdRMXNtzBNcrs7Fq3qI1sRxf8t5DNFPZG3nx7T4bNzU5O9O7cMLwDWNowLFVU87nUImEVz/RH7b/5FG0XA1d3KpejMO2olTEnhEvZEU/N9VjIqZm3mC69S5ePEQo8Rxs3oeI5lIC43UUUUWwa7Z0YqFdDWLvVQcnhXcf3kP2ztZrNAvKziEu0LxX1C2bvAXPCf+Hu//PAba4A5FTfB/SVV27/Ps8/palI526Nczl+MVixVNelZgCHvFZt/2+SNQtxehqirgvxysbi9CyQ/zBSQpHRJS8ZVuDYxSm2zQ3oKSEv5LcTi+ncVoju6Zs/yaGCu61KzA4N5dTMvzN6BoNGitKSiKgmvjSgwF4X9LSWNNwVMZ+qx7b80utCkDUL0e6m85Huf3nwSm+Zzt/nt70nLRDRgMOgOesuATl7zVu0BR0CT2zAFcG2XFkJQVGJxlxVS95s9DF+vPo23rSqIGhs/DPGAEjtLgQcvnctBZtRVz1kg89np2/nVMyEMQ3M178XY0YUg58FOMepLObMWUkBUYjPH96bDtCGnjqN+FMT7859vZVMG2t68mOu1oCgpfRGsIPTA3bvuS3cvupt+EP5L1u9uO2HocLgaTlWhrVmDQ6kyoqkpz7SYS+h38M6woGn5aPY/qHcGnD7k77bS3lBEdH3yaUHNtMfHpYwNPMdtfc23xIf9WdzAarVgsWYEhKWkULc078PmCXT/9T2jrui/0+Tws+fB4yvYE9w1udzt2e1ngnp6DSUoaiap6aG4O7ntaWnah00WHPEihu5kMVuKiswLDdzue5JN1oTdN21p/whrddR01Gh0pcUOxtQaPJx5vJ62OSixRmfxuxONcePwnXDBxCRdMXMLYvOuJNqZwwcQlRBu7/wTRr2HWWUkwZZFgyqK/ZTTXjfiCWcOWMmvYEmYNW0Ja9GDGpBQyLffBA75HVVsxaVFHY9zvMd/bGr9g/vrj8PqCV9b3dmzFpI0lRp9MRswo6hw78O6zPdocJViNv/7YfDhFaa0kGbICQ7H9U96vuy+kTaVzCymG8Nt/rC6Fms7g9q6qKnXu3STqB2D31HPXrjEhT35rdu+l3dtEij74fmWOYnLNPb/vCCdGYyVVmxUYNGiYb78Wu9rEnbH/JF178P3C4o7H+LrzXUxKNNGaOBp9eyn3/sRg3XjOj7qFh+KWMTduCXPjlnB5tL+3wdy4JeTohnbH6h2SRbHST8kKDEblt313X6q+ymL1eQyKkTglgU7VwSbWMgz/d5VX1cf4Qn0XsxJNjBJHvbqX3fzEcMZjwYoeA3sI3rveqTqpo4p0jsx39957T4/bBY028PnA50P3xB2ouQV4L78Jmhv80xpt0OmEtEx8Y49H+9w8lO2bUHb9hO6RW/CNPBY1t6Cn1+RX0R47FdXZgeflefgqSvC89jCqow3tRP9vYaidTn9hg//pGLozr8Tz7j/wrv8KX0UJ7mdvR8k5GuUgP2a6L9XrQa0uRdP/qEM37gbatBxcP66mY/lreG0VtC15CvfuYsxT/N3XVJ8Xb4st0IXLfEIhzrX/wvHN+3jqymn/9EVc29ZiPukiFK0Ow5BJtH04H9eOH/BU7aD1pVvQxCVjGHESGlMM5hMLsb/9IK4d63CXbcH+xn0YR52CNu7Qj0/vDoaUHNq3r6Zp9Wu4Giqo/+wpnGXFxB8fzMPTGswj7phzcZYX07D8eTr3lrB38V3orP2IypuAzpKEKWMIdR/Ow1m5BWfFZqpfv4moo47DlHF0T67mr5Y87CzcbfXs+fIhnE3lNG77guo1C0k/JpiHq82Gz+vPo/Sz+9Hoo8g5fS7ezjZcbTZcbTa8rna8rg52f3o38UedSNq4mYFp+87fFzjsVXjd7cQkdP0M+7wuOtttqD7/mcUBwy5m9/oF2MpWYW/YwaYvbyHamk1yVvBHBe0NO4lJyOvyXuAvFtqbS8P+rZ6WlXUGGo2O7777K62tpZSWLmX37g846qiLAPB6XTgcNnw+LxqNjrT0SWzaNJ+6uh9obt7Bmv/cgtmcfMCHF+zLEptNRuYUvlt7B42NP1JXt47ijY8zMO/8XvVjnNkpJ1NuW8WmPYtoaS9nc9k/2V61hFE5VwH+m/E7Om34VP/2MTLnKn4sf5PtVUtpbi/lqx/vRq+NIjv5RGJMqSEFldmQgEajIy46q1et84FoFF2gAPpl0CpGTLo4Yg3+s9pun5M2V+iVclvHTpKiun4eBljGoaLySek9NDhK2dn0FSvKH+XY9KtQFIUhiWegUXR8XPpXGhylbK5fSrHtA8akXtQt63sox8SdR4O7nGX187G59rC6eRFFbZ8wJd5fJHtUF62e4LYxIa6Qr5tfZXPbcmyuPfyr/mHsngbGxp6NRZdEpnEIH9rmUencQoVzM4v23sRRUceRaQoeW/a6dpJmCL9v6W0+d75KmXcLV0c/jEEx0+yz0eyz0ebz38PkUV00+4L5xGtSWep4lhJ3ERWebfzD/mdG6aeQoTuKWE1iSEFl1fhPEqRqszD8xuKit/CqXppUW+CemzT68wEvUaR+Q6W6m0eZQyqZjMX/sJtEUnmbZ9mmFlGqbuNv/JnxTGGAchRaRcsp/IE3eIpidQ0V6i6e5k5iiWcch94f/2/02j2Wsnkd+juvwPX61yitTShVe1AAw8Whv/zr+cvD+E6dgee2J9C+9Ci6+2aDz4dv3GS81/SdBxkoUTEY7ngB94v34l35LsqAQRjueDHww6Te/yzD89wdmN71n3HRTbsc3C7cL9wNHXY0Q4/FcPuCA56l7cLe7H+SXUzveHSk1ppC7OynaFv8CG0fzEc/YDDWm19Bm5AG+LudNdw+BestizAUjMc0dipqp4OOz1/C99YDaNMHYv3LK+jS/WeuLRfdTdv7T9D6whx8jjYMR0/AetNLKD/fDxVz3q2g0dHy3J/A48Y46hRiLrr7gMvX3XSxKWRc+hR1Hz2Cbdl8TBmD6X/NK+it/jw8zTXsfmgK/a9dRFTeePQJmfS77Bls/3qYhhULMA8YQcYVzwUewZ1+yZPU/eshKl+8EtXnIWbIFFLO6r2Pl92fMS6DwRe/SvmKR9j00lkYYlLof+IcUkaeB0Bnaw0bn53C4JmLiEkbQsvu1QBsfC60D33GxGuJyRiJp6OJpp3/pumpSSHTB1/0CnE5x9EXuDoaANCbun6Gm/YW8cOSS5l8yQqiYjPJGXkVPq+bLV/djdvZQmL/iYye9nxId0GXox69KfzVCrezGdXnQW/sHfuLfen1MZx08ius+2Euny47E7M5mbHj7iEj0/9DgvX1RaxccSnTz1xBTEwmY8fezcaNT/DtN3Nwu9tIS5vAiSe99Ku/wE+Y8Cjr1z/IyhWXoSg6cnLOZuTImw89YzfKSDyGU0Y+wbqS51iz/TFizf05ZeTfSU/wd6fZ21TE0u8vZeYJK4iNyiQ37RQme+7lh53P0N5ZR6p1BNPHvYz+5/ueIt3WhmV8tPsO/jo+eEWj3V1PclTXIj9KH89FBS/zZdnDvPTjDEzaGEanFDKxn79oMGpjmFnwCp/umcuLm88kxpDM1Ox7yI/v+sOWPSFR359ZGS/xL9vDfN38Con6/lyW9jSZJv9DXvY4ini+6lLuyl5Bgj6TE6z+e7k+qn+ENm8DmcYhXJe5iBit/yFSl6Q9ydL6h3ih6kp8eBgSPYWzk0OPLXZvfeAR173dD67P8OLhUfvlIeOP0o3mrti32Okp4hH7pTwWt4JkbSZTjBdT76vmqbbZ+FAZZziNC6Nu75mF7wb11DCLKTzIIoYxnvHKFP6gXstT3IGTDkZzPPfwYuC76BlcTB3VPMBsVFSO4zSuIpjPldyGmSie5k46aGMIY5jHK+iVI9ONWvmlO9X+Bg0alA2Uul5dAWm//ua/SBZ76If7/J8S29LTS9C7xDf39BL0LvHhn679f5ZVto8Qsn2EkjxCJTT29BL0LvGSR4jEhp5egt4lQfYfAbVqJbOYApCzffv2PftO673d24QQQgghhBDiMJCiRwghhBBCCBHRpOgRQgghhBBCRDQpeoQQQgghhBARTYoeIYQQQgghRESTokcIIYQQQggR0aToEUIIIYQQQkQ0KXqEEEIIIYQQEU2KHiGEEEIIIUREk6JHCCGEEEIIEdGk6BFCCCGEEEJENCl6hBBCCCGEEBFNih4hhBBCCCFERJOiRwghhBBCCBHRpOgRQgghhBBCRDQpeoQQQgghhBARTYoeIYQQQgghRESTokcIIYQQQggR0aToEUIIIYQQQkQ0KXqEEEIIIYQQEU2KHiGEEEIIIUREk6JHCCGEEEIIEdGk6BFCCCGEEEJENCl6hBBCCCGEEBFNih4hhBBCCCFERJOiRwghhBBCCBHRpOgRQgghhBBCRDQpeoQQQgghhBARTYoeIYQQQgghRETTHapBuwV8sd2xKL2f0dXTS9C7qEpPL0Hvoqg9vQS9i9bT00vQu5icPb0EvUtUR08vQe9iae3pJehd4lp6egl6F2tzTy9B75LQ1NNL0Lsk2Xp6CXoPtwZICD9NrvQIIYQQQgghIpoUPUIIIYQQQoiIJkWPEEIIIYQQIqJJ0SOEEEIIIYSIaFL0CCGEEEIIISKaFD1CCCGEEEKIiCZFjxBCCCGEECKiSdEjhBBCCCGEiGhS9AghhBBCCCEimhQ9QgghhBBCiIgmRY8QQgghhBAioknRI4QQQgghhIhoUvQIIYQQQgghIpoUPUIIIYQQQoiIJkWPEEIIIYQQIqJJ0SOEEEIIIYSIaFL0CCGEEEIIISKaFD1CCCGEEEKIiCZFjxBCCCGEECKiSdEjhBBCCCGEiGhS9AghhBBCCCEimhQ9QgghhBBCiIgmRY8QQgghhBAioknRI4QQQgghhIhoUvQIIYQQQgghIpoUPUIIIYQQQoiIpuvpfCk6MQAAIABJREFUBQDQVJZhnTmdxuUbQBdcJMPyZZhfeQ5tTSXezAF0/PEm3JNOPuD7mN59HdMbC9G02+k8cSrtN98N5qjuWIXDSq0ugxumwzsbULRd/4vUzd/BU3egvLTy4O/z9cfwzyehqR5GTYTr56HEJhypxT5ivLVlNN47naRnQ/PwVGzDvuhePJXb0KUPJOaS+9DnDD/g+zhWvE7HpwtRO+wYxk7FcvHdKMa+t30AOKt+onbpPJxVP2FIyiL5jJuJGXT8Adu3l6ylbumDuBrKMfUfTvofHsCQlNWNS3xktdt2sPvLubTt3YLBkkL/4/5EypAzD9i+uWwtpSsexNlUTkz6cPJOfwBzfGTksX7V7VTs/LDL+ChLJqeevyLsPFW7l7F13XycHXUkZxzHqEkPYDQnHulF7Tbtjlr+U3w/1bb/YDRYGX7ULI7OvfiA7XdXLWPd1vl0OOvISD6OSaMewGyMnDw+K7mb4trFIeNOzrmDcf0uD9v+p/plrCqbT5urjmzrcUwd+ADRhsjJ4xce1cWTpecw3DKVU5P/fMB23zS+zleNC3H67AyzTOWc1LsxaPrmsSSc4s5/837736nzlpGmzeHc6L8wzHjCAdv/4FzGB+3zafbVcbThOC6zPECsJnK2j2J1Da/xOJXsJpEUzuFqTlX+cMD236jLWMR8GqljJMdxPQ9gVSInj19UasqYGT+d5Q0b0B2knFivX8uT0Q9SqS3naM9w7rA/QKavZ463PX6lR1NbQ+wt16C4OkPG6zauI2burTjPv5TmRUvp/P15WO74M9rtW8O+j+GrLzC/+CTtt9xLyzOL0P20mehn/tYNa3B4qbYamHcN7JdHYHrpNnj0pkO/z7aN8MydUHg9PPo22FvgyTsO9+Iecd7GGlqevgbcoXmonR20zL8a/cARxN/9AfqjxtDy1DX4HG1h36dz/Re0f/gkMTPvJe7WRXhKN9P2Tt/bPgA8bY2Uv3Ap+oT+ZN/wHvGTLqHqtT/jqNgctr27uYaqV2cTO/pMsm98H50licpXr0P1+bp5yY8Mn8fFT+9fS3RKASOvWErm+FmULLsDe3Vx2PadrTX89MFskoecyYjL3scQncRP71+HqkZGHsOPvYupF34TGE46eyk6fTR5Q68I277Jton1q24nf+RsJp/5Dh53G+u/vrWbl/rIUVUfX66djdfXyVknvs+4Ibfw3Y8PU1X3bdj2tqZNrFp/OyPzZ3Pm5Hdwe9r4en3k5AFQ31HCidm38qdx3wSGkakXhG1bY9/Esp23c1zmbC4Z/g4uTxuf7IysPH6xov55al0lB22z2f4Fn9c/yTmp93JN/0VUODbzUV3fPJaEU+0p4bnWGzjBfAHzEj7hWNOZ/KP1T9i8FWHbl7o38bL9dqZFz+bO+HdwqG283Bo520e1uod5XMOxnMKTLOEC/sQLzOV7NfxJ553qJp7kdi5gNo/xDg7amE/k5PGLWk0Nt8Reg0sJ/11133a3WWZzWueZ/L/m90nwJXFb7HX46JnjbY8WPfqvlxN3xQxUg6HLNOOnH+I68VQ6zzofX2YWzvMvxT16PMYVy8K+l+md13CeNxP38VPwDh5G+633YVz2IXS0H+nVOGzUtcvhLzNA3zUPAHXZP+G2CyE++dBv9vHrMOkMlJPPRskpgBsfhnVfoe4Nv+PqjTo3LKdp7gzQdc3D+f0y0OqJPv92dP0GEl14Jxqzhc4fPg37Xo4vX8N88kyMI6egzx6G5dL7cH77Iaqz72wfv2hZvwSNMZr0PzyAMXUg1nHnEjfmTBpXvRK2ffN3izGmF5B40iyMqXmkn/8QnuYaOkrWdvOSHxkdDSV0tlQxYNINmOMHkDr8PKKSB9FS/l3Y9nuLFxOdXEDm+FlEJeWRd8ZDuOw1tJRFRh56gwVTVHJg2L7xOeKTR5B79Myw7XdvfYN+2aeSlT+DuIQCRk9+lLqqb2hrLevmJT8yKmtX09q+h5PGPoHVMpCBmb8nf8AM6hqLwrbfuvsNsvudSn7WDBLiCpg8+lGq6r6htS0y8gBocOwmPWYoMYbkwKDXmsO2XV/zBvmJpzIsdQYp0QVMy3+U0uZvaHJETh4A1c5tfN/yLimG3IO2W934GhPjZzLEMoX+5mGcm3Yf61o+pNPX944l4TT6aphinskU80yStf2ZGnUVBiWKXe6NYduvcLzBGOOpTDLNoL+ugKstj/Kj+xtqvZGxfaxmGTkM5nzlWvopWZyonMlJnM3XfBS2/ce8wQROZYoygxylgJt4lCK+oVqNjDwAvjYs5wrrDAyE/666r3+ZFpPnLWCmYxY53jzusj9EraaG9fqeOd72aNFj+H41HdfMof2mu7pMc553CY4rrgsdqSjhr4B4veh+2oxn5LjAKM+Qkf7xO3463It95GxYDTPnwKyueQCwcQ3c/Dj8/pJDv9f2jTBkbOClktYfElNhe/iz372Ra8tqos+ZQ8yFXfPw7C5Gf9RoFI1/E1YUBV3eaDy7un6RUX1e3Hs2o88Pbh+63JHg8+Iu70Pbx8/cDRWYMoeiaPWBccb0Ahxl4Q9KjrJionKD664xmDFmDMFRFv5LX1+jM8UBCrWb3kNVfbRWFeFo3E1M6pCw7duqi4nrH8xDqzcTnToEe1Vk5LGvxtoiasqWM2z8ga/yNtYVk5QWzCMqJh1zTAaNtZGRR3X9WtKTxmM0WAPjJo6cy6iC68O2r2ssJi0pmEdMVDox5gxqD1Ak9TVtLhtOTzMJ5pxf1b7aXkz/2GAescZ0Yo0ZVNkjIw8An+rl3b13ckbyLURprQdtV+HcTE5UMI8B5pH4VC9Vzr53LAlnqOF4zo+5DQCP6ma14108qouB+pFh2+/2FJOvD+aRoE0nUZPBLndkbB+TOJ1ruDtknIKCi/BXOLZTzBCCeSQr6aSQwXYiIw+A7/WruaZ9Dje1H+C76j5+1BUz0h3Mw4SZQd4h/KjrmTx69J6e9v+5378QG7qekfUeVRDyWrt7J/r1a+g8u+sleKWtFcXViS8pJThSp0ONtaKp23t4F/oIUq7z56FuDn+GWrnzH/7pX7x76DdrskFCSug4axI09J08LJf483Bt65qHr8WGNjX0oK2JTcRTsa1LW7WjFdydaKzBPBStDiXGiq+p7+TxC50lEWdlaFc2d3M13vamsO29dhu62NBtQWdJxNNSe8SWsTuZ4jLImjyHsq//zp6vHgfVS+Zx12HNmRi2vavNhiEmNA99dCKd9sjIY1/bixfQL/tUYhPyD9im01GHKSo0D5M5EWdHZORhby8nxtyPdVvnU1KxBL0uhqEDL2dQdvg++Y7OOqJMoXmYTYl0OCMjj4aOEjSKjtVlT7G7eRVmXTzj+l3OsNQZYdu3u+qIMYTmEa1PxO6KjDwAvm58mShtPGPizmZt8zsHbOfwteJRO4nTBfPQKjqitFZaPH3vWHIwNZ5d3NM0HR9ezo2+mWRt/7Dtmn11WDWh20esJpEmX2RsHxlK6PeMJrWe1XxCIeFPmjRRRyKheVhJpJ7IyAPgf9r938026MN/V91Xg8ZGki80jwRfInWansmjx+/p+TWUxgYsd1yPZ8QYXJN/13W60wnQpZucajCguF3dsoy9iaqq/iti+3eT0xsgQvJQOx0o+62fojeAp+v6qS7/9rF/Hoqub+ZhGT4VZ9VWmr59A9XrxlG2kZbv30f1usO297kc/nXdh6I14AuTVV+k+jw4mvaQOvxcRly6mIGnzaN63as0bP8ibHufx4GiDc1DozWgeiMjj190tFVTW7mKgQe4l+cXHo8Tzf55aAx4IyQPt6edkoqlOJw2fjf+WYYMvIw1m+ayp3p52PYejxOtJnLzaHDsBiAluoA/HL2Q4ann8fmue9hWH75rsNvXNQ+txoDXFxl52FylfNX4Muem3n/Itm6f/1iiVULz0CkGPBGSxy/iNMn81foeF8XczdL2p1nX+XnYdi7ViS5cHmpk5QHgVDt4mOtJIIXTKQzbphMnuv26fekw4Cby8vg1nIoDvRqah1414FZ6Jo9uu9Jjfm0B5kUvBF63PrEQz8ixB5nDT1O3F8tNV6JqNNgffBo0Xes01WAEQHGFhqi4XKgm03+55EeGungBvBfMg3sXogw5dB6/hqIoqDp91y/0bhcYw/fb7mntnyyg45NgHnE3LcSQf+A8FL0Rdb/1U90uFEPX/29F798+9s9D9bjA2Du3j33Vr1hAw8pgNv2vWkj6+Q9Tu2QetUsfRJ84gPjjL6Vp1ath51f0Rv+67kP1utBGHbgbR29WsWYBlWuCeWSOv5rWqg2MvvpTFEVDTNpQXPa9lH/zNImDTu0yv6I1dilwfF4XenPfzGP7xgXsKA7mMeG0hSSljaWq9DNiYgeQkDLioPNrtUZ8++fhc6HT9f7PRjgbty+geEcwj+T44Rj0sUwcNQ+NoiXJOpTGlm1s2/MW2f26nkTTao1dvtD35TzWVCxgTWUwjz8cvZDrx32LWe/f3lOiC2hyllG09y0Kkk7vMr9O0zUPr8+FXtM381hRv4CVDf48VFTcqoPpKXeQYMg85Lw6xX8s8e73hd6jujD00Tw+aV/AJx3B7eOmuIXkG8YSpYklS3M0WfqjqfLsYKXjDcYaT+syvx5jlwLHo7owKH0zj8XqAt4jmMe9LGSIMpZ21c48rqGWSv7GmxiV8N+l9Bjx7FfgeHBhpG/m8Zp5AYuignk80bKQkZ5f/13VqBq7FDhuxUWsr2eOt91W9DjPKaRzSnCH6ktOPeQ8mqoKYm+4DNVkpvUfi1Dj4sO2U+OsqAYjmsZ6vAN/7sbh8aC0NuNLTAk7T487vRAm7XOASTx0Hr9JYio014eOa7L9uocg9ADzCYWYxgbz0MQfPA9NfCq+VlvIOF9rPZq4ruunRFtBb8TXWg/4tw/V60Fta0YT10u3j33ETygkdkQwG11cKlG5Y4kdNR1vWz1aSzLNa95En5ARdn5dbCoee2hWHns9xtSjjuhyHylpIwtJKgjmUfmfBUQl5qEowRMi0WlDqPr+5bDzGy2puNpD83C31xOd1DfzyBlcSEZuMA9zlP+zU1e5ivSsrkXf/kxRqTgdofsKZ0c9RnPv3FccyuCcQnIzgnls3LEARdGgUbSBcXExOVTb1oSdP8qUisMZmkeHsx6zsW/mMTKtMKSYiTGkoteGfgFLNOeyp+mbsPPHGFJpd4Xm0e6uJ9rQN/OYEF/IiFh/Hi2eWhaUX8Jntif53PYUAG7VSYVjM+XOYq7u/1LIvFFaKzrFSKunnjSj/1jiVT10eJux6Hr/sSScE8yFjDUFtw+X6qDEvYE8/ejAuH7aPHa6N4SdP16bSosvdPto8dUTp+mb28fpFDKJYB6JpNKqNnIPV9FMPQ+yiHRlwAHnTySVJkLzaKKeBPpmHuc4C5nSGcwj2ffbvqsm+VJp0IQebxs09eR6euZ4223d29RYK77MrMBwqDPsSmszsTdegRpjofXZ11ETkg7cWKPBM3gYuuL1gVG6HzeCVosnf/DhWoXDSrFYUfplBYfDfcVh0EjYGsxD3VsBjXUw6OBnfXuKJsaKNjUrMIS7YrMvXe4I3CVF/q58+Lv0eUqK/A8o2I+i0aDPHoZ7ZzAP966NoNGiH9A7t499aaOsGJKyAoOjvJiqRTegaDToYlNQFIW2LSuJGjg+7PzmrBF0lAYPWD6Xg86qrZizwt+Y2tvpzVbM8VmBwRTfnw7bjpA2joZdmKzhD0wx/UbQWhnMw+t20F67FUu/vpmHwWglJjYrMGh1JlRVpcm2iaT0cYecPyFlBA21wc9GR1sNjvZqElL6Zh5Gg5XYmKzAkJIwiqbWHfh8we6fzfYSLFHhTxKkJIygtiGYR1tHDe2OalIS+mYeZr2VeHNWYFhd/iTvbb0mpE1t+08kRIV/alk/ywgq7cE8WjtraO2spp+lb+YRpbWSZMgiyZBFtnk0t+V+wV9yljInZwlzcpaQYRrMsfGF/CHtwS7zahQN/U3D2NMRzKPMsRGNoiXD1PuPJeHEaKykarMCww+dn/K6/b6QNmWeLaRrw28fuboR7HQH82j01tDoq2agrm9uHxbFSj8lKzBo0DCXa2mliYf5J5nKwZ/uN4gRbCWYh02twUY1g+ibecSqVjJ9WYHht16xGuoZwSZ98HjrxMEO7VaGeHomj157T0/UC/NRWppou+tv4PWiNNj8Q5vd36DTidIQrB6dMy7C/Pb/w/DVF2h/2kz04/fTOe1ciIrumRXoZqrbhdpkC/72yukXwr+Xon7xrv+3fZ66A445yf8UtwhgHDsVtbODtjfn4akuof2dh/E52zAecwbgv4/H1xLcPkwnXYTj8/9H5/ovcO/ZTNsb92OadC6Kqe9tH8bkHNq2r6Zx9Wu4Giuwff4UjvJi4iddBvifVudptQW6tMWNOxdneTH1K56ns7aEmnfvQmftR1TehJ5cjcMmechZuNrr2b3iIRxN5TRs/4LKtQvpNy6Yh6vNFujClTr8XNpqiqn4z/N01JdQ8uldGGP7EZcdGXkAdLRV4XG3Y7F2PZvm87pwdthQfV4AcgoupHLXx+zZtpiWxu1sWHUbqZmTiYnL7ualPjJyM85Ao9GxuuivtLSVUlKxlJ3lHzA45yLA31Wrw2nDp/rzKMi5kF2VH7Ntz2IaW7azasNtZKZOJi4muwfX4vDJSziZ3U2rWFe9iCZHORtq/smWuiWMz7gK8OfR5grmMSrtQrbaPmbj3sXY2rfzyc7byI2fTII5uwfX4vDQKrpAAfTLoFOMRGniiNP7z2i7fU5aPcFjyXHxF7Gq6f+x2f4FFY7NfFh7P+PizsWo6XvHknCON51HnbecD9rnU+vZw/KORXzf+QnTovyFskd10eILbh8nmi/ku86P+dqxmErPdl6238Yww2RSddk9uBaHz794lV1s4UYexoSZJtVGk2rDrjYD4FZdNKk2vD/ncToXsoqP+VxdzB51O09yG2OYTD8lu+dWoht58dKg2AL3MP3eeS5bdMW8an6eUm0JD1nuItXXj7Hunjne9tqix7DyMzTtbVgvP5uE6ZMCQ/Tj/psNjcuXkTB9UqC965RpdFw2m+jH7iP2xivwFAyl/Ybbe2rxu9+WdXDZJP/VHPDfHzT7Pnj7Wf9v+1iscMPDPbuMh5HGHEPcjS/gKSmi6f5zcJdsIO7GF9GYYwDo/H4ZDX8Jbh+m8dOI+v1s7G/cR8vjV6DLHkrMBX1z+9DFppBxyVM0f7eY0sen01Gylv5/fAW9NQ3w/xhpybxJdPz8SGpDQiYZlz1D6/ql7HnqXLz2ejIvfy7wuO++zhSXwdDCV2nf+yMbXz2LPV8/QdYJc0gdfh4AnfYafnh2UuCR1Ka4TArOfgbblqUUv3Yu7vZ6CmY8F9I9rq/rdDQAYDDGdZnWUFfEZ29NoqO9BoCE1FGMmjSP7RufZ9VHhegNFkZPfqRbl/dIMuhjmHrcK3Q4a/lw5Zms/+kpJgy/hwHpJwNQ11DEW59Nor3Dn0dqwigmjZrHxu3P89GqQgx6C5NHR04eA+KOYfqgJyiuXczLRdPYUPNPpg/6O5mx/n76VfYinv1hEvZOfx4ZsaOYmjePNZXP8/qmQoxaC9OOipw8DmVj6zLmlQSPJSNjpzElcTYf7L2PFyuuINM0lOkpffNYEk6ytj9z4l5ii+sb7m06k6+d7zA79mmy9P6fAChxF/GXhkk0+vzbR55+FJdZ5vFxx/M81FSIWbFwlSVyto9v+QwvHu7mci5jUmB4gNkAbKOIy5hEPf48CpRR/Il5LOZ5bqWQaCzcROTkcSh1mhqmJ05is95/vE33ZfJw6zN8ZlzKldZzaVTqeaT1OTQ9VH4ov3QP2t+gQYOygdKm91fgSz/0DX7/FyTVH7rN/yVJtkO3+b8ksbGnl6B3SZTPS4hkySNEYkNPL0HvIvvTUEmyfYRIkDxCyP40lOw/gmo0lZybMAUgZ/v27Xv2nRY5pzaFEEIIIYQQIgwpeoQQQgghhBARTYoeIYQQQgghRESTokcIIYQQQggR0aToEUIIIYQQQkQ0KXqEEEIIIYQQEU2KHiGEEEIIIUREk6JHCCGEEEIIEdGk6BFCCCGEEEJENCl6hBBCCCGEEBFNih4hhBBCCCFERJOiRwghhBBCCBHRpOgRQgghhBBCRDQpeoQQQgghhBARTYoeIYQQQgghRESTokcIIYQQQggR0aToEUIIIYQQQkQ0KXqEEEIIIYQQEU2KHiGEEEIIIUREk6JHCCGEEEIIEdGk6BFCCCGEEEJENCl6hBBCCCGEEBFNih4hhBBCCCFERJOiRwghhBBCCBHRpOgRQgghhBBCRDQpeoQQQgghhBARTYoeIYQQQgghRESTokcIIYQQQggR0aToEUIIIYQQQkQ03aEaNFnBk9gdi9L71Sf19BIIIYQQQgghwnHogITw0+RKjxBCCCGEECKiSdEjhBBCCCGEiGhS9AghhBBCCCEimhQ9QgghhBBCiIgmRY8QQgghhBAioknRI4QQQgghhIhoUvQIIYQQQgghIpoUPUIIIYQQQoiIJkWPEEIIIYQQIqJJ0SOEEEIIIYSIaFL0CCGEEEIIISKaFD1CCCGEEEKIiCZFjxBCCCGEECKiSdEjhBBCCCGEiGhS9AghhBBCCCEimhQ9QgghhBBCiIgmRY8QQgghhBAioknRI4QQQgghhIhoUvQIIYQQQgghIpoUPUIIIYQQQoiIJkWPEEIIIYQQIqJJ0SOEEEIIIYSIaFL0CCGEEEIIISKaFD1CCCGEEEKIiCZFjxBCCCGEECKiSdEjhBBCCCGEiGi9oujRl5WRN3w4eDwh42Pff5/sU04hb/hw+hcWYtq06aDvY339dXImTyZv1ChS77gDpaPjSC72EeNSXNydcjfjBo5jYu5EFsYvPGDbbYZtXND/AkbkjWDGgBlsMh48o75I8ggleYSSPEJJHqEkj1CSRyjJI5TkEUryCNXX8+jxokdXU0PGNdeg6ewMGR/17bek3H8/9XPmUPbxxzhHjCBj1iyUtraw7xPzxRckPvkkdffeS8WiRZg2byb5b3/rjlU47B5NepQicxGvVL7C/bX383zC83xi+aRLuw6lg6szr2aEcwQflH/AGMcYrsm4hjYlfEZ9leQRSvIIJXmEkjxCSR6hJI9QkkcoySOU5BGqz+ehqmrYIT8/Pzs/P1/VVVSEb3AYhugvv1Rzjz1WzZo+Xc3Pz1dxuwPTLEuWqPEvvhh4rbHb1fz8fNW0fn3Y98q86CI18e9/D7w2/fCDmjd0qKq0tR225T1iQewztCvt6rC8Yeq3Ud8Gxj2b8Kxa2L+wS9t3Y99VT8w5UfXiVVVU1YdPPSX7FHVx7OJuWVbJQ/Lo6UHykDwkD8lD8pA8JA/J45ehQleh5ufnq/n5+dn7T+3RKz3Rq1fTMGcOdXfd1WWa/ayzaJo1CwDF6cT66qt4EhNx5ed3fSOvF9PmzTjGjQuMco4cieL1YvrppyO2/EfCNuM2XIqLMY4xgXFjHGPYbNyMh9Duf8WmYkY7RqP5+b9RQWG0YzRF5qJuXeYjSfIIJXmEkjxCSR6hJI9QkkcoySOU5BFK8ggVCXn0aNFTd//9tJx//kHbRK1eTd7IkST+4x/Y7rwTX0xMlzaa1lY0nZ14UlKCI3U6vFYrur17D/diH1E2nY04XxxG1RgYl+RNwq1x06ht7NI2xZMSMi7Rm0itrrZblrU7SB6hJI9QkkcoySOU5BFK8ggleYSSPEJJHqEiIQ9dj/71X6GzoIDyDz8kesUKUm+/HXdmJs6RI0PaaJxOAFSDIWS8ajCguFzdtqyHg0NxYFBD1+OX1y4ldF0cmvBt92/Xl0keoSSPUJJHKMkjlOQRSvIIJXmEkjxCSR6hIiGPbit6EhYsIOGFFwKvqxYuxDF27CHn8yYn401OpnPwYMxFRcS9/XaXokc1+qvO/QscxeXCZzIdhqXvPkbV2GWj+OW1WTWHtvWFb2tS+9Y6H4zkEUryCCV5hJI8QkkeoSSPUJJHKMkjlOQRKhLy6Laip7mwEPvppwdee1JTD9reVFSEz2zGVVAQGOfKy0O/Z0+Xtl6rFZ/RiK7+/7d3By9RpnEcwH86kzoYpeyqBKG7rhSSkdApYk9dwpPgLaH+i+gqHTrWtUOe6ug/IHjpFIRYiYeg3fUgrGCwroRZqz17cNd6tAx2dcYePh94D/M+78Bvvqf5MvO+z+uP9/xsbkZldTW2urv3XH+U9Wz2xFrzWryP99ES2y15pbISLR9a4uTWyT3XrlRXsnOvK6+ja7OrbvMeNnnk5JGTR04eOXnk5JGTR04eOXnkSsijbvf0fOjoiL/6+naO9JVfYDoePYrv793LzrUuLMT7/v69Fzc3x8b581Gbnd05VXv2LFKlEhuDgwcyf70MvhuMY+lYdrPXbG02zr07F9VdHfXCxoWYa5uLFCkiIlKkmKvNxfBG/kvYt0weOXnk5JGTR04eOXnk5JGTR04euRLyaPg+PV+yOj4e7Y8fR8fDh3FscTG+u3s32hYWYvXGjYjYfqJbZeVji/zz2rXonJyM49PT0To/H90TE7E2Nhapvb1RH+E/qaVajK6NxkT3RLxoexEz7TMx2TkZ1/+4HhHbrXqjafsepqtvrsZ683rc7r4dr1pexZ2uO/Gm+U2MrI008iMcKHnk5JGTR04eOXnk5JGTR04eOXnkisjjS0+6rsc+Pf8etSdP9uzTEyml49PTqW9kJA0MDaXesbFsj54TU1Pb7/nk+s7791P/pUvpp4sXU8+tW6np7dsDnfPQg/jnWG9aTzd7bqbhgeF0uf9yetD5YGftzJkzaerE1M7r563P02jvaBoaGEpjvWNpvnW+bnPKQx5H4ZCHPOQhD3nIQx7ySLH/Pj1NKaXPlqGzZ8/+EBG//TozE5unT9e1iB1VqanREwAAAJ+zVF2KK/1XIiIHbcolAAABLElEQVR+fPny5eKna0f2720AAAAHQekBAACKpvQAAABFU3oAAICiKT0AAEDRlB4AAKBoSg8AAFA0pQcAACia0gMAABRN6QEAAIqm9AAAAEVTegAAgKIpPQAAQNGUHgAAoGhKDwAAUDSlBwAAKJrSAwAAFE3pAQAAiqb0AAAARVN6AACAoik9AABA0ZQeAACgaEoPAABQNKUHAAAomtIDAAAUTekBAACKpvQAAABFU3oAAICiVfdZq0REVJeX6zTK0be0X1oAAEDDLFd3ektl99p+X+NPRUT0jo8fwkjfpiv9jZ4AAAD4ilMR8cunJ/YrPU8j4ueI+D0itg5xKAAAgP+rEtuF5+nuhaaUUv3HAQAAqBMPMgAAAIqm9AAAAEVTegAAgKIpPQAAQNH+Bnzb/cy76Dc3AAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# obtain the estimated optimal policy and corresponding action-value function\n", + "Q_sarsa = sarsa(env, 5000, .01)\n", + "\n", + "# print the estimated optimal policy\n", + "policy_sarsa = np.array([np.argmax(Q_sarsa[key]) if key in Q_sarsa else -1 for key in np.arange(48)]).reshape(4,12)\n", + "check_test.run_check('td_control_check', policy_sarsa)\n", + "print(\"\\nEstimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\")\n", + "print(policy_sarsa)\n", + "\n", + "# plot the estimated optimal state-value function\n", + "V_sarsa = ([np.max(Q_sarsa[key]) if key in Q_sarsa else 0 for key in np.arange(48)])\n", + "plot_values(V_sarsa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 2: TD Control: Q-learning\n", + "\n", + "In this section, you will write your own implementation of the Q-learning control algorithm.\n", + "\n", + "Your algorithm has four arguments:\n", + "- `env`: This is an instance of an OpenAI Gym environment.\n", + "- `num_episodes`: This is the number of episodes that are generated through agent-environment interaction.\n", + "- `alpha`: This is the step-size parameter for the update step.\n", + "- `gamma`: This is the discount rate. It must be a value between 0 and 1, inclusive (default value: `1`).\n", + "\n", + "The algorithm returns as output:\n", + "- `Q`: This is a dictionary (of one-dimensional arrays) where `Q[s][a]` is the estimated action value corresponding to state `s` and action `a`.\n", + "\n", + "Please complete the function in the code cell below.\n", + "\n", + "(_Feel free to define additional functions to help you to organize your code._)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def update_Q_sarsamax(alpha, gamma, Q, state, action, reward, next_state=None):\n", + " \"\"\"Returns updated Q-value for the most recent experience.\"\"\"\n", + " current = Q[state][action] # estimate in Q-table (for current state, action pair)\n", + " Qsa_next = np.max(Q[next_state]) if next_state is not None else 0 # value of next state \n", + " target = reward + (gamma * Qsa_next) # construct TD target\n", + " new_value = current + (alpha * (target - current)) # get updated value \n", + " return new_value" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def q_learning(env, num_episodes, alpha, gamma=1.0, plot_every=100):\n", + " \"\"\"Q-Learning - TD Control\n", + " \n", + " Params\n", + " ======\n", + " num_episodes (int): number of episodes to run the algorithm\n", + " alpha (float): learning rate\n", + " gamma (float): discount factor\n", + " plot_every (int): number of episodes to use when calculating average score\n", + " \"\"\"\n", + " nA = env.action_space.n # number of actions\n", + " Q = defaultdict(lambda: np.zeros(nA)) # initialize empty dictionary of arrays\n", + " \n", + " # monitor performance\n", + " tmp_scores = deque(maxlen=plot_every) # deque for keeping track of scores\n", + " avg_scores = deque(maxlen=num_episodes) # average scores over every plot_every episodes\n", + " \n", + " for i_episode in range(1, num_episodes+1):\n", + " # monitor progress\n", + " if i_episode % 100 == 0:\n", + " print(\"\\rEpisode {}/{}\".format(i_episode, num_episodes), end=\"\")\n", + " sys.stdout.flush()\n", + " score = 0 # initialize score\n", + " state = env.reset() # start episode\n", + " eps = 1.0 / i_episode # set value of epsilon\n", + " \n", + " while True:\n", + " action = epsilon_greedy(Q, state, nA, eps) # epsilon-greedy action selection\n", + " next_state, reward, done, info = env.step(action) # take action A, observe R, S'\n", + " score += reward # add reward to agent's score\n", + " Q[state][action] = update_Q_sarsamax(alpha, gamma, Q, \\\n", + " state, action, reward, next_state) \n", + " state = next_state # S <- S'\n", + " if done:\n", + " tmp_scores.append(score) # append score\n", + " break\n", + " if (i_episode % plot_every == 0):\n", + " avg_scores.append(np.mean(tmp_scores))\n", + " \n", + " # plot performance\n", + " plt.plot(np.linspace(0,num_episodes,len(avg_scores),endpoint=False), np.asarray(avg_scores))\n", + " plt.xlabel('Episode Number')\n", + " plt.ylabel('Average Reward (Over Next %d Episodes)' % plot_every)\n", + " plt.show()\n", + " # print best 100-episode performance\n", + " print(('Best Average Reward over %d Episodes: ' % plot_every), np.max(avg_scores))\n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the next code cell to visualize the **_estimated_** optimal policy and the corresponding state-value function. \n", + "\n", + "If the code cell returns **PASSED**, then you have implemented the function correctly! Feel free to change the `num_episodes` and `alpha` parameters that are supplied to the function. However, if you'd like to ensure the accuracy of the unit test, please do not change the value of `gamma` from the default." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Episode 5000/5000" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best Average Reward over 100 Episodes: -13.0\n" + ] + }, + { + "data": { + "text/markdown": [ + "**PASSED**" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Estimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\n", + "[[ 0 3 1 1 1 1 1 1 1 2 2 1]\n", + " [ 1 1 0 3 2 2 1 3 2 2 2 2]\n", + " [ 1 1 1 1 1 1 1 1 1 1 1 2]\n", + " [ 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0]]\n" + ] + }, + { + "data": { + "image/png": "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1PsbOjpisLEx+hYvHrrW19oaU44dG3bvQFNTDNbXR/n06T9+5qe/P2rPnImBlpZh91/N5vbPjbM1Z6Mv+qIuLq7kU7Wnom6wLmYMzBh276nyqeza6drTMad/TtXOO970yOmR0yOnR06PnB45PXJ65PTIFaFH1X6mZ7CpKS4sWDD0SH/xHZimd9+N2Tt2ZNfqjxyJvkWLht9cUxM9y5ZF48GDQ5cav/oqUm1t9CxZMibnr5YlvUtiSpqS/bDXwcaDcUvvLVG+YqOu6FkRHQ0dkSJFRESKFB2NHdHWk38nbDLTI6dHTo+cHjk9cnrk9MjpkdMjV4QeE/45PX/mzObNMfXzz6PpnXdiyrFj0fzii9Fw5EiceeSRiLj4G91qT/2xIn/dtClm7t4d0/bujfrOzmhpb4+zGzZEmjp1ot7C/6QxNcb6s+ujvaU9Djccjn1T98Xumbvj4V8ejoiLq7qndPFnmO45f0901XTFMy3PxLd138azc56N8zXnY93ZdRP5FsaUHjk9cnrk9MjpkdMjp0dOj5weuUL0+LPfdF2Nz+m59Gj84othn9MTKaVpe/emBevWpdalS9P8DRuyz+iZvmfPxT9z2f0zd+5Mi+64I920alWau317KnV3j+k5xz3E74+uUld6bO5jqa21La1ZtCa9PvP1odcqlUraM33P0PND9YfS+vnr09LWpWnD/A2ps76zaufUQ4+r4aGHHnrooYceeuiRYvTP6SmllEYcQzfffPPCiPjnP/bti/5586o6xK5WqTTRJwAAAEZyonwi7l50d0TEjd98882xy1+7av96GwAAwFgwegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIzegAAgEIrj/JabURE+eTJKh3l6nditFoAAMCEOVke2i21V7422v/GXxcRMX/z5nE40uR096KJPgEAAPAXrouIv19+YbTR82VE/C0ifoiIgXE8FAAAwP+rNi4Oni+vfKGUUqr+cQAAAKrELzIAAAAKzegBAAAKzegBAAAKzegBAAAK7T//SHhkIsjhfwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# obtain the estimated optimal policy and corresponding action-value function\n", + "Q_sarsamax = q_learning(env, 5000, .01)\n", + "\n", + "# print the estimated optimal policy\n", + "policy_sarsamax = np.array([np.argmax(Q_sarsamax[key]) if key in Q_sarsamax else -1 for key in np.arange(48)]).reshape((4,12))\n", + "check_test.run_check('td_control_check', policy_sarsamax)\n", + "print(\"\\nEstimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\")\n", + "print(policy_sarsamax)\n", + "\n", + "# plot the estimated optimal state-value function\n", + "plot_values([np.max(Q_sarsamax[key]) if key in Q_sarsamax else 0 for key in np.arange(48)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 3: TD Control: Expected Sarsa\n", + "\n", + "In this section, you will write your own implementation of the Expected Sarsa control algorithm.\n", + "\n", + "Your algorithm has four arguments:\n", + "- `env`: This is an instance of an OpenAI Gym environment.\n", + "- `num_episodes`: This is the number of episodes that are generated through agent-environment interaction.\n", + "- `alpha`: This is the step-size parameter for the update step.\n", + "- `gamma`: This is the discount rate. It must be a value between 0 and 1, inclusive (default value: `1`).\n", + "\n", + "The algorithm returns as output:\n", + "- `Q`: This is a dictionary (of one-dimensional arrays) where `Q[s][a]` is the estimated action value corresponding to state `s` and action `a`.\n", + "\n", + "Please complete the function in the code cell below.\n", + "\n", + "(_Feel free to define additional functions to help you to organize your code._)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def update_Q_expsarsa(alpha, gamma, nA, eps, Q, state, action, reward, next_state=None):\n", + " \"\"\"Returns updated Q-value for the most recent experience.\"\"\"\n", + " current = Q[state][action] # estimate in Q-table (for current state, action pair)\n", + " policy_s = np.ones(nA) * eps / nA # current policy (for next state S')\n", + " policy_s[np.argmax(Q[next_state])] = 1 - eps + (eps / nA) # greedy action\n", + " Qsa_next = np.dot(Q[next_state], policy_s) # get value of state at next time step\n", + " target = reward + (gamma * Qsa_next) # construct target\n", + " new_value = current + (alpha * (target - current)) # get updated value \n", + " return new_value" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def expected_sarsa(env, num_episodes, alpha, gamma=1.0, plot_every=100):\n", + " \"\"\"Expected SARSA - TD Control\n", + " \n", + " Params\n", + " ======\n", + " num_episodes (int): number of episodes to run the algorithm\n", + " alpha (float): step-size parameters for the update step\n", + " gamma (float): discount factor\n", + " plot_every (int): number of episodes to use when calculating average score\n", + " \"\"\"\n", + " nA = env.action_space.n # number of actions\n", + " Q = defaultdict(lambda: np.zeros(nA)) # initialize empty dictionary of arrays\n", + " \n", + " # monitor performance\n", + " tmp_scores = deque(maxlen=plot_every) # deque for keeping track of scores\n", + " avg_scores = deque(maxlen=num_episodes) # average scores over every plot_every episodes\n", + " \n", + " for i_episode in range(1, num_episodes+1):\n", + " # monitor progress\n", + " if i_episode % 100 == 0:\n", + " print(\"\\rEpisode {}/{}\".format(i_episode, num_episodes), end=\"\")\n", + " sys.stdout.flush()\n", + " \n", + " score = 0 # initialize score\n", + " state = env.reset() # start episode\n", + " eps = 0.005 # set value of epsilon\n", + " \n", + " while True:\n", + " action = epsilon_greedy(Q, state, nA, eps) # epsilon-greedy action selection\n", + " next_state, reward, done, info = env.step(action) # take action A, observe R, S'\n", + " score += reward # add reward to agent's score\n", + " # update Q\n", + " Q[state][action] = update_Q_expsarsa(alpha, gamma, nA, eps, Q, \\\n", + " state, action, reward, next_state) \n", + " state = next_state # S <- S'\n", + " if done:\n", + " tmp_scores.append(score) # append score\n", + " break\n", + " if (i_episode % plot_every == 0):\n", + " avg_scores.append(np.mean(tmp_scores))\n", + " \n", + " # plot performance\n", + " plt.plot(np.linspace(0,num_episodes,len(avg_scores),endpoint=False), np.asarray(avg_scores))\n", + " plt.xlabel('Episode Number')\n", + " plt.ylabel('Average Reward (Over Next %d Episodes)' % plot_every)\n", + " plt.show()\n", + " # print best 100-episode performance\n", + " print(('Best Average Reward over %d Episodes: ' % plot_every), np.max(avg_scores))\n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the next code cell to visualize the **_estimated_** optimal policy and the corresponding state-value function. \n", + "\n", + "If the code cell returns **PASSED**, then you have implemented the function correctly! Feel free to change the `num_episodes` and `alpha` parameters that are supplied to the function. However, if you'd like to ensure the accuracy of the unit test, please do not change the value of `gamma` from the default." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Episode 5000/5000" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best Average Reward over 100 Episodes: -13.02\n" + ] + }, + { + "data": { + "text/markdown": [ + "**PASSED**" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Estimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\n", + "[[ 1 1 1 2 1 1 1 2 1 3 1 3]\n", + " [ 1 1 1 1 1 1 1 1 1 1 1 2]\n", + " [ 1 1 1 1 1 1 1 1 1 1 1 2]\n", + " [ 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0]]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# obtain the estimated optimal policy and corresponding action-value function\n", + "Q_expsarsa = expected_sarsa(env, 5000, 1)\n", + "\n", + "# print the estimated optimal policy\n", + "policy_expsarsa = np.array([np.argmax(Q_expsarsa[key]) if key in Q_expsarsa else -1 for key in np.arange(48)]).reshape(4,12)\n", + "check_test.run_check('td_control_check', policy_expsarsa)\n", + "print(\"\\nEstimated Optimal Policy (UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, N/A = -1):\")\n", + "print(policy_expsarsa)\n", + "\n", + "# plot the estimated optimal state-value function\n", + "plot_values([np.max(Q_expsarsa[key]) if key in Q_expsarsa else 0 for key in np.arange(48)])" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/temporal-difference/check_test.py b/temporal-difference/check_test.py new file mode 100644 index 0000000..14dcc78 --- /dev/null +++ b/temporal-difference/check_test.py @@ -0,0 +1,48 @@ +import unittest +from IPython.display import Markdown, display +import numpy as np + +def printmd(string): + display(Markdown(string)) + +V_opt = np.zeros((4,12)) +V_opt[0:13][0] = -np.arange(3, 15)[::-1] +V_opt[0:13][1] = -np.arange(3, 15)[::-1] + 1 +V_opt[0:13][2] = -np.arange(3, 15)[::-1] + 2 +V_opt[3][0] = -13 + +pol_opt = np.hstack((np.ones(11), 2, 0)) + +V_true = np.zeros((4,12)) +for i in range(3): + V_true[0:13][i] = -np.arange(3, 15)[::-1] - i +V_true[1][11] = -2 +V_true[2][11] = -1 +V_true[3][0] = -17 + +def get_long_path(V): + return np.array(np.hstack((V[0:13][0], V[1][0], V[1][11], V[2][0], V[2][11], V[3][0], V[3][11]))) + +def get_optimal_path(policy): + return np.array(np.hstack((policy[2][:], policy[3][0]))) + +class Tests(unittest.TestCase): + + def td_prediction_check(self, V): + to_check = get_long_path(V) + soln = get_long_path(V_true) + np.testing.assert_array_almost_equal(soln, to_check) + + def td_control_check(self, policy): + to_check = get_optimal_path(policy) + np.testing.assert_equal(pol_opt, to_check) + +check = Tests() + +def run_check(check_name, func): + try: + getattr(check, check_name)(func) + except check.failureException as e: + printmd('**PLEASE TRY AGAIN**') + return + printmd('**PASSED**') \ No newline at end of file diff --git a/temporal-difference/plot_utils.py b/temporal-difference/plot_utils.py new file mode 100644 index 0000000..9a625e7 --- /dev/null +++ b/temporal-difference/plot_utils.py @@ -0,0 +1,17 @@ +import numpy as np +import matplotlib.pyplot as plt +import seaborn as sns +sns.set_style("white") + +def plot_values(V): + # reshape the state-value function + V = np.reshape(V, (4,12)) + # plot the state-value function + fig = plt.figure(figsize=(15,5)) + ax = fig.add_subplot(111) + im = ax.imshow(V, cmap='cool') + for (j,i),label in np.ndenumerate(V): + ax.text(i, j, np.round(label,3), ha='center', va='center', fontsize=14) + plt.tick_params(bottom='off', left='off', labelbottom='off', labelleft='off') + plt.title('State-Value Function') + plt.show() \ No newline at end of file