{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "75c86807402955e4c01ac1ce25306bd7", "grade": false, "grade_id": "cell-649fd0b1aa7ccb0f", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "# Assignment 2: Optimal Policies with Dynamic Programming\n", "\n", "Welcome to Assignment 2. This notebook will help you understand:\n", "- Policy Evaluation and Policy Improvement.\n", "- Value and Policy Iteration.\n", "- Bellman Equations.\n", "- Synchronous and Asynchronous Methods." ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "20729884a9ceb3804a03589ce5938a2d", "grade": false, "grade_id": "cell-9aafac39a58eeca4", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "## Gridworld City\n", "\n", "Gridworld City, a thriving metropolis with a booming technology industry, has recently experienced an influx of grid-loving software engineers. Unfortunately, the city's street parking system, which charges a fixed rate, is struggling to keep up with the increased demand. To address this, the city council has decided to modify the pricing scheme to better promote social welfare. In general, the city considers social welfare higher when more parking is being used, the exception being that the city prefers that at least one spot is left unoccupied (so that it is available in case someone really needs it). The city council has created a Markov decision process (MDP) to model the demand for parking with a reward function that reflects its preferences. Now the city has hired you — an expert in dynamic programming — to help determine an optimal policy." ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "77a7b97ee700b6ce77ed26bd22749e80", "grade": false, "grade_id": "cell-28ccff8d1e663850", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "## Preliminaries\n", "You'll need two imports to complete this assigment:\n", "- numpy: The fundamental package for scientific computing with Python.\n", "- tools: A module containing an environment and a plotting function.\n", "\n", "There are also some other lines in the cell below that are used for grading and plotting — you needn't worry about them.\n", "\n", "In this notebook, all cells are locked except those that you are explicitly asked to modify. It is up to you to decide how to implement your solution in these cells, **but please do not import other libraries** — doing so will break the autograder." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "f70cbdcd1e273dfc166b366836a4136f", "grade": false, "grade_id": "cell-c11ff54faaf3fd89", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "%%capture\n", "%matplotlib inline\n", "import numpy as np\n", "import pickle\n", "import tools" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "596fffc2a1391897952fcabe2a8db930", "grade": false, "grade_id": "cell-4c7c5c4373be59ff", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "In the city council's parking MDP, states are nonnegative integers indicating how many parking spaces are occupied, actions are nonnegative integers designating the price of street parking, the reward is a real value describing the city's preference for the situation, and time is discretized by hour. As might be expected, charging a high price is likely to decrease occupancy over the hour, while charging a low price is likely to increase it.\n", "\n", "For now, let's consider an environment with three parking spaces and three price points. Note that an environment with three parking spaces actually has four states — zero, one, two, or three spaces could be occupied." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "c2e5b06e5166bc03c5075db981280485", "grade": false, "grade_id": "cell-d25d06a8bafc4c26", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "num_spaces = 3\n", "num_prices = 3\n", "env = tools.ParkingWorld(num_spaces, num_prices)\n", "V = np.zeros(num_spaces + 1)\n", "pi = np.ones((num_spaces + 1, num_prices)) / num_prices" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "0813b0f481e1f2f90e12f38456781410", "grade": false, "grade_id": "cell-57212e031233c500", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "The value function is a one-dimensional array where the $i$-th entry gives the value of $i$ spaces being occupied." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "6e59c4a32939d9211dfc0f8fdd939780", "grade": false, "grade_id": "cell-c5f693a5ff49a888", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "text/plain": [ "array([0., 0., 0., 0.])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "V" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "559643d84ae07b1b499ec4c6b9af40bc", "grade": false, "grade_id": "cell-ac2f8ec29c0c9ab6", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "state = 0\n", "V[state]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "29380e07e1a4da60134db6949d7eb772", "grade": false, "grade_id": "cell-c829e4ece8bf9412", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "text/plain": [ "array([10., 0., 0., 0.])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "state = 0\n", "value = 10\n", "V[state] = value\n", "V" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "a296188c40952607943d9eddbd021f81", "grade": false, "grade_id": "cell-cb5bc5279787faad", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "State 0 has value 10.0\n", "State 1 has value 0.0\n", "State 2 has value 0.0\n", "State 3 has value 0.0\n" ] } ], "source": [ "for s, v in enumerate(V):\n", " print(f'State {s} has value {v}')" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "cb305ee8a8d6e293a48b96ace69bfb53", "grade": false, "grade_id": "cell-57154206afc97770", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "The policy is a two-dimensional array where the $(i, j)$-th entry gives the probability of taking action $j$ in state $i$." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "d732d93b6545408fa819526c2e52a0cf", "grade": false, "grade_id": "cell-85c017bb1e6fe4df", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "text/plain": [ "array([[0.33333333, 0.33333333, 0.33333333],\n", " [0.33333333, 0.33333333, 0.33333333],\n", " [0.33333333, 0.33333333, 0.33333333],\n", " [0.33333333, 0.33333333, 0.33333333]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pi" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "3b5bc8eebf9c09786a2a966cadcf0400", "grade": false, "grade_id": "cell-92a61a07d9f0bf04", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "text/plain": [ "array([0.33333333, 0.33333333, 0.33333333])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "state = 0\n", "pi[state]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "4780c63332dfc7f65a998403c2a4bf21", "grade": false, "grade_id": "cell-0e224545b27d80c7", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "text/plain": [ "0.3333333333333333" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "state = 0\n", "action = 1\n", "pi[state, action]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "ba7a14554c52279e4cfe7818982b914e", "grade": false, "grade_id": "cell-1f5e3fcf8d0384b9", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "text/plain": [ "array([[0.75 , 0.21 , 0.04 ],\n", " [0.33333333, 0.33333333, 0.33333333],\n", " [0.33333333, 0.33333333, 0.33333333],\n", " [0.33333333, 0.33333333, 0.33333333]])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pi[state] = np.array([0.75, 0.21, 0.04])\n", "pi" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "1cf19333d9690caba29729b2d8fed55c", "grade": false, "grade_id": "cell-d7d514ba81bc686c", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pi(A=0|S=0) = 0.75 pi(A=1|S=0) = 0.21 pi(A=2|S=0) = 0.04 \n", "pi(A=0|S=1) = 0.33 pi(A=1|S=1) = 0.33 pi(A=2|S=1) = 0.33 \n", "pi(A=0|S=2) = 0.33 pi(A=1|S=2) = 0.33 pi(A=2|S=2) = 0.33 \n", "pi(A=0|S=3) = 0.33 pi(A=1|S=3) = 0.33 pi(A=2|S=3) = 0.33 \n" ] } ], "source": [ "for s, pi_s in enumerate(pi):\n", " print(f''.join(f'pi(A={a}|S={s}) = {p.round(2)}' + 4 * ' ' for a, p in enumerate(pi_s)))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "cdff0c353f33f3cfd7413c141fa4d317", "grade": false, "grade_id": "cell-46b46b0dc80c68c7", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tools.plot(V, pi)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "4f450ea0212f959d952e9b0272e57cf3", "grade": false, "grade_id": "cell-ce3ac9318671059d", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "We can visualize a value function and policy with the `plot` function in the `tools` module. On the left, the value function is displayed as a barplot. State zero has an expected return of ten, while the other states have an expected return of zero. On the right, the policy is displayed on a two-dimensional grid. Each vertical strip gives the policy at the labeled state. In state zero, action zero is the darkest because the agent's policy makes this choice with the highest probability. In the other states the agent has the equiprobable policy, so the vertical strips are colored uniformly." ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "049e3d7344e203034323e1f86a503ee4", "grade": false, "grade_id": "cell-3975c91dbe24e9e8", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You can access the state space and the action set as attributes of the environment." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "4fafc756424773278069199ff876300e", "grade": false, "grade_id": "cell-94d868709c1a9eba", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "text/plain": [ "[0, 1, 2, 3]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "env.S" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "dc72712f4890361c35c0b19f0df5befd", "grade": false, "grade_id": "cell-6f16d9e8ebf01b60", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "text/plain": [ "[0, 1, 2]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "env.A" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "12e6b88d7cf8ec6d20c7e14e3d43b5e2", "grade": false, "grade_id": "cell-927e52efe516a816", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You will need to use the environment's `transitions` method to complete this assignment. The method takes a state and an action and returns a 2-dimensional array, where the entry at $(i, 0)$ is the reward for transitioning to state $i$ from the current state and the entry at $(i, 1)$ is the conditional probability of transitioning to state $i$ given the current state and action." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "4d32e329bafe53f2061e6b577751f291", "grade": false, "grade_id": "cell-4185982b1a21cd04", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "text/plain": [ "array([[1. , 0.12390437],\n", " [2. , 0.15133714],\n", " [3. , 0.1848436 ],\n", " [2. , 0.53991488]])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "state = 3\n", "action = 1\n", "transitions = env.transitions(state, action)\n", "transitions" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "768d9dfafd5bb70c8d3641fb6fb17ce3", "grade": false, "grade_id": "cell-379fdb797cae3afb", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p(S'=0, R=1.0 | S=3, A=1) = 0.12\n", "p(S'=1, R=2.0 | S=3, A=1) = 0.15\n", "p(S'=2, R=3.0 | S=3, A=1) = 0.18\n", "p(S'=3, R=2.0 | S=3, A=1) = 0.54\n" ] } ], "source": [ "for s_, (r, p) in enumerate(transitions):\n", " print(f'p(S\\'={s_}, R={r} | S={state}, A={action}) = {p.round(2)}')" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "0869f6736a9ab680b0c82dccf72ba11c", "grade": false, "grade_id": "cell-141d4e3806427283", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "## Section 1: Policy Evaluation\n", "\n", "You're now ready to begin the assignment! First, the city council would like you to evaluate the quality of the existing pricing scheme. Policy evaluation works by iteratively applying the Bellman equation for $v_{\\pi}$ to a working value function, as an update rule, as shown below.\n", "\n", "$$\\large v(s) \\leftarrow \\sum_a \\pi(a | s) \\sum_{s', r} p(s', r | s, a)[r + \\gamma v(s')]$$\n", "This update can either occur \"in-place\" (i.e. the update rule is sequentially applied to each state) or with \"two-arrays\" (i.e. the update rule is simultaneously applied to each state). Both versions converge to $v_{\\pi}$ but the in-place version usually converges faster. **In this assignment, we will be implementing all update rules in-place**, as is done in the pseudocode of chapter 4 of the textbook. \n", "\n", "We have written an outline of the policy evaluation algorithm described in chapter 4.1 of the textbook. It is left to you to fill in the `bellman_update` function to complete the algorithm." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "732aa9563f9fa2209380be4dcfc22c31", "grade": false, "grade_id": "cell-8d04cf6f6f397e17", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "def evaluate_policy(env, V, pi, gamma, theta):\n", " while True:\n", " delta = 0\n", " for s in env.S:\n", " v = V[s]\n", " bellman_update(env, V, pi, s, gamma)\n", " delta = max(delta, abs(v - V[s]))\n", " if delta < theta:\n", " break\n", " return V" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "deletable": false, "nbgrader": { "checksum": "c8aad24b28e1eaf3fd87481be87f89e1", "grade": false, "grade_id": "cell-4113388a5f8401b6", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "# [Graded]\n", "def bellman_update(env, V, pi, s, gamma):\n", " \"\"\"Mutate ``V`` according to the Bellman update equation.\"\"\"\n", " ### START CODE HERE ###\n", " v = 0\n", " for action in env.A:\n", " action_prob = pi[s][action]\n", " transitions = env.transitions(s, action)\n", " for next_state in env.S:\n", " reward = transitions[next_state, 0]\n", " prob = transitions[next_state, 1]\n", " v += action_prob * prob * (reward + gamma * V[next_state])\n", " V[s] = v \n", " ### END CODE HERE ###" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "4d9639225bc3d57f1079ceab1d57d411", "grade": false, "grade_id": "cell-5c1f3ff4b0e1b0bf", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "The cell below uses the policy evaluation algorithm to evaluate the city's policy, which charges a constant price of one." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "7cd01aaa12fdfc50a4764d069b7a95fe", "grade": false, "grade_id": "cell-4b69f06bc67962af", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "num_spaces = 10\n", "num_prices = 4\n", "env = tools.ParkingWorld(num_spaces, num_prices)\n", "V = np.zeros(num_spaces + 1)\n", "city_policy = np.zeros((num_spaces + 1, num_prices))\n", "city_policy[:, 1] = 1\n", "gamma = 0.9\n", "theta = 0.1\n", "V = evaluate_policy(env, V, city_policy, gamma, theta)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "0f19b2dc70097c6425bbc3bd25a2a500", "grade": false, "grade_id": "cell-b612ffe570dd7e29", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You can use the ``plot`` function to visualize the final value function and policy." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "1dd55a310f0d18634f95c4dd3dc19da3", "grade": false, "grade_id": "cell-fe5cf61a03a028fc", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tools.plot(V, city_policy)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "33d9d76d53c4cd379e8b7b0c6ecd5cc6", "grade": false, "grade_id": "cell-7dbb5974798259f7", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You can check the output (rounded to one decimal place) against the answer below:
\n", "State $\\quad\\quad$ Value
\n", "0 $\\quad\\quad\\quad\\;$ 80.0
\n", "1 $\\quad\\quad\\quad\\;$ 81.7
\n", "2 $\\quad\\quad\\quad\\;$ 83.4
\n", "3 $\\quad\\quad\\quad\\;$ 85.1
\n", "4 $\\quad\\quad\\quad\\;$ 86.9
\n", "5 $\\quad\\quad\\quad\\;$ 88.6
\n", "6 $\\quad\\quad\\quad\\;$ 90.1
\n", "7 $\\quad\\quad\\quad\\;$ 91.6
\n", "8 $\\quad\\quad\\quad\\;$ 92.8
\n", "9 $\\quad\\quad\\quad\\;$ 93.8
\n", "10 $\\quad\\quad\\;\\;\\,\\,$ 87.8
\n", "\n", "Observe that the value function qualitatively resembles the city council's preferences — it monotonically increases as more parking is used, until there is no parking left, in which case the value is lower. Because of the relatively simple reward function (more reward is accrued when many but not all parking spots are taken and less reward is accrued when few or all parking spots are taken) and the highly stochastic dynamics function (each state has positive probability of being reached each time step) the value functions of most policies will qualitatively resemble this graph. However, depending on the intelligence of the policy, the scale of the graph will differ. In other words, better policies will increase the expected return at every state rather than changing the relative desirability of the states. Intuitively, the value of a less desirable state can be increased by making it less likely to remain in a less desirable state. Similarly, the value of a more desirable state can be increased by making it more likely to remain in a more desirable state. That is to say, good policies are policies that spend more time in desirable states and less time in undesirable states. As we will see in this assignment, such a steady state distribution is achieved by setting the price to be low in low occupancy states (so that the occupancy will increase) and setting the price high when occupancy is high (so that full occupancy will be avoided)." ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "c954d5fee584058d6cff61e3274c2e8b", "grade": false, "grade_id": "cell-eb62290c37932db0", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "The cell below will check that your code passes the test case above. (Your code passed if the cell runs without error.) Your solution will also be checked against hidden test cases for your final grade. (So don't hard code parameters into your solution.)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "b096086d94a387a1b453e2592c687575", "grade": true, "grade_id": "cell-8ff996ea5428abf6", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "## Test Code for bellman_update() ## \n", "with open('section1', 'rb') as handle:\n", " V_correct = pickle.load(handle)\n", "np.testing.assert_array_almost_equal(V, V_correct)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "f0d6665789065c7bfa797664e0f43c8c", "grade": false, "grade_id": "cell-45d6a1c8f905e939", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "## Section 2: Policy Iteration\n", "Now the city council would like you to compute a more efficient policy using policy iteration. Policy iteration works by alternating between evaluating the existing policy and making the policy greedy with respect to the existing value function. We have written an outline of the policy iteration algorithm described in chapter 4.3 of the textbook. We will make use of the policy evaluation algorithm you completed in section 1. It is left to you to fill in the `q_greedify_policy` function, such that it modifies the policy at $s$ to be greedy with respect to the q-values at $s$, to complete the policy improvement algorithm." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "92679d89cf740af64cdc7d37193608cf", "grade": false, "grade_id": "cell-15ec36bbf7a6fdc6", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "def improve_policy(env, V, pi, gamma):\n", " policy_stable = True\n", " for s in env.S:\n", " old = pi[s].copy()\n", " q_greedify_policy(env, V, pi, s, gamma)\n", " if not np.array_equal(pi[s], old):\n", " policy_stable = False\n", " return pi, policy_stable\n", "\n", "def policy_iteration(env, gamma, theta):\n", " V = np.zeros(len(env.S))\n", " pi = np.ones((len(env.S), len(env.A))) / len(env.A)\n", " policy_stable = False\n", " while not policy_stable:\n", " V = evaluate_policy(env, V, pi, gamma, theta)\n", " pi, policy_stable = improve_policy(env, V, pi, gamma)\n", " return V, pi" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "deletable": false, "nbgrader": { "checksum": "54f69a62cbb1dfbccfb9fafd6c3cc77a", "grade": false, "grade_id": "cell-43cadb209544e857", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "# [Graded]\n", "def q_greedify_policy(env, V, pi, s, gamma):\n", " \"\"\"Mutate ``pi`` to be greedy with respect to the q-values induced by ``V``.\"\"\"\n", " ### START CODE HERE ###\n", " A = np.zeros(len(env.A))\n", " for action in env.A:\n", " transitions = env.transitions(s, action)\n", " for next_state in env.S:\n", " reward = transitions[next_state, 0]\n", " prob = transitions[next_state, 1]\n", " A[action] += prob * (reward + gamma * V[next_state])\n", " best_action = np.argmax(A)\n", " pi[s] = np.eye(len(env.A))[best_action]\n", " ### END CODE HERE ###" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "b70073346d140503e1572043f2be5c7e", "grade": false, "grade_id": "cell-d82e51ee8122647c", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "When you are ready to test the policy iteration algorithm, run the cell below." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "aeedaa745e6dc30ebbc6b822c670c9b3", "grade": false, "grade_id": "cell-6939985ef9ad58a3", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "env = tools.ParkingWorld(num_spaces=10, num_prices=4)\n", "gamma = 0.9\n", "theta = 0.1\n", "V, pi = policy_iteration(env, gamma, theta)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "dcd619f8fcc010b6933b2bba4ce9f9e7", "grade": false, "grade_id": "cell-acd7f476ed298570", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You can use the ``plot`` function to visualize the final value function and policy." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "da17cf77a51f4fabd0ce3a93e2803af8", "grade": false, "grade_id": "cell-73a1da64ca84a151", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tools.plot(V, pi)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "0943d42dc7e60e40739b606700125da1", "grade": false, "grade_id": "cell-92139bf490757a44", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You can check the value function (rounded to one decimal place) and policy against the answer below:
\n", "State $\\quad\\quad$ Value $\\quad\\quad$ Action
\n", "0 $\\quad\\quad\\quad\\;$ 81.6 $\\quad\\quad\\;$ 0
\n", "1 $\\quad\\quad\\quad\\;$ 83.3 $\\quad\\quad\\;$ 0
\n", "2 $\\quad\\quad\\quad\\;$ 85.0 $\\quad\\quad\\;$ 0
\n", "3 $\\quad\\quad\\quad\\;$ 86.8 $\\quad\\quad\\;$ 0
\n", "4 $\\quad\\quad\\quad\\;$ 88.5 $\\quad\\quad\\;$ 0
\n", "5 $\\quad\\quad\\quad\\;$ 90.2 $\\quad\\quad\\;$ 0
\n", "6 $\\quad\\quad\\quad\\;$ 91.7 $\\quad\\quad\\;$ 0
\n", "7 $\\quad\\quad\\quad\\;$ 93.1 $\\quad\\quad\\;$ 0
\n", "8 $\\quad\\quad\\quad\\;$ 94.3 $\\quad\\quad\\;$ 0
\n", "9 $\\quad\\quad\\quad\\;$ 95.3 $\\quad\\quad\\;$ 3
\n", "10 $\\quad\\quad\\;\\;\\,\\,$ 89.5 $\\quad\\quad\\;$ 3
" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "6baffe56fd26c8c0fb1db1409801a308", "grade": false, "grade_id": "cell-c3aed944e874ac92", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "The cell below will check that your code passes the test case above. (Your code passed if the cell runs without error.) Your solution will also be checked against hidden test cases for your final grade. (So don't hard code parameters into your solution.)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "8135eb9fffa77e2554bb0e5892525988", "grade": true, "grade_id": "cell-8b8cce6304cb8bfe", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "## Test Code for q_greedify_policy() ##\n", "with open('section2', 'rb') as handle:\n", " V_correct, pi_correct = pickle.load(handle)\n", "np.testing.assert_array_almost_equal(V, V_correct)\n", "np.testing.assert_array_almost_equal(pi, pi_correct)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "e59b175ca7605a8002c2040043f7b1af", "grade": false, "grade_id": "cell-e7628124eafb2fc2", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "## Section 3: Value Iteration\n", "The city has also heard about value iteration and would like you to implement it. Value iteration works by iteratively applying the Bellman optimality equation for $v_{\\ast}$ to a working value function, as an update rule, as shown below.\n", "\n", "$$\\large v(s) \\leftarrow \\max_a \\sum_{s', r} p(s', r | s, a)[r + \\gamma v(s')]$$\n", "We have written an outline of the value iteration algorithm described in chapter 4.4 of the textbook. It is left to you to fill in the `bellman_optimality_update` function to complete the value iteration algorithm." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "3743399285b929801497af405783d06e", "grade": false, "grade_id": "cell-75baf962376afa7c", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "def value_iteration(env, gamma, theta):\n", " V = np.zeros(len(env.S))\n", " while True:\n", " delta = 0\n", " for s in env.S:\n", " v = V[s]\n", " bellman_optimality_update(env, V, s, gamma)\n", " delta = max(delta, abs(v - V[s]))\n", " if delta < theta:\n", " break\n", " pi = np.ones((len(env.S), len(env.A))) / len(env.A)\n", " for s in env.S:\n", " q_greedify_policy(env, V, pi, s, gamma)\n", " return V, pi" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "deletable": false, "nbgrader": { "checksum": "53654ee726c72456f461afd5a44aa5dc", "grade": false, "grade_id": "cell-f2c6a183cc0923fb", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "# [Graded]\n", "def bellman_optimality_update(env, V, s, gamma):\n", " \"\"\"Mutate ``V`` according to the Bellman optimality update equation.\"\"\"\n", " ### START CODE HERE ###\n", " v = np.zeros(len(env.A))\n", " for action in env.A:\n", " transitions = env.transitions(s, action)\n", " for next_state in env.S:\n", " reward = transitions[next_state, 0]\n", " prob = transitions[next_state, 1]\n", " v[action] += prob * (reward + gamma * V[next_state])\n", " V[s] = np.max(v)\n", " ### END CODE HERE ###" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "c5020582c7de3757fa3ece73983b61d9", "grade": false, "grade_id": "cell-d472d58e936b371e", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "When you are ready to test the value iteration algorithm, run the cell below." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "cd8be31ddef5580d095a7e861e52a479", "grade": false, "grade_id": "cell-f609be2c58adc3e2", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "env = tools.ParkingWorld(num_spaces=10, num_prices=4)\n", "gamma = 0.9\n", "theta = 0.1\n", "V, pi = value_iteration(env, gamma, theta)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "8c88ac444253a80a377a7dce46e0c606", "grade": false, "grade_id": "cell-cba784b8d158758b", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You can use the ``plot`` function to visualize the final value function and policy." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "d18a2592a3bac43de72e18cb54357ac9", "grade": false, "grade_id": "cell-086e26bfb519a017", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+UAAAFsCAYAAACq4xizAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xe4pGV9//H3Z5VeFhBZFlGxBaxRXLGiS8SKvRdULCCaGPkJMUZFIZqERI0lViyxACpgQRQFCysiIiDYDUVdMYAUQfpS5Pv743kmOx5OmXN25sycM+/Xdc31nHme+76f7yyHM/Odu6WqkCRJkiRJ82/JsAOQJEmSJGlcmZRLkiRJkjQkJuWSJEmSJA2JSbkkSZIkSUNiUi5JkiRJ0pCYlEuSJEmSNCQm5VIPkjw+SSVZM+xYtO6S3Kf971lJth52PJK0GCRZ2fnbOptrkjTuTMo10pJ8tH0T/2OSDWZR77y23lcGGd9CkOTUrgR0usc3hh3rukqyfpKD2sd2w45Hkoal/Ts42d/6NUn+N8lXkjwnSYYdqySNu9sOOwBpBh8HXgFsBTwVOHKmCkkeBdytq74aNwJXTHP98vkKZIDWB97a/vxV4MIpyt0AnN3+fPOgg5KkIbu46+elwB3ax5OBvZI8vapuGHAM17H2764kqYtJuUZaVZ2a5JfAvYCX0kNS3paD5kPI1wYV2wJ0YlU9fthBjIKqOhfYadhxSNJ8qKptOz8nWQLcE3g38BjgCcDbgX8YcAyn4d9dSZqUw9e1EHR6ux+bZPvpCibZDHhW+/TTVWUvqCRJraq6pap+ATwFOK89/cokdtRI0pCYlGsh+AxwE83v60tmKPtcYJP25090X0iySZKnJ/lEkp8kuSzJDUkuSPLFJLvPJbgkh8w0J7uXheKSbJzkdUlObufQ35jkwnWJbV0kObqN+f3TlPm7tszPZ6qf5AVJvpfkT0muTXJGkn1nms+Y5C5J3p3kZ0muTHJdknPbf5cXJFmvcz/g6q6qp0+YR/nzrjZnXOgtyVZJ3tb+rlzd3vfsJO9Lcqcp6mza1e6KJFsk+fc23jVJLk3ypSQPmO41S9KgVdUa4Kj26WZM6MVO8oAkn07yu/bv1xVJTkmy32zWeOlqb8aF3tp1QV6R5BtJLm7foy9K8oMkb0lyl7bcbdp58ZXk9TPc9+VtuauTbDrbuCVpPpiUa+RV1aVAZ8G2vWYo3hm6/v2q+p8J114EfLEtcz9gI+DPwHbA04FvJnl7P2KerST3An4OvAt4OLAlcD2wvCu2dw8jtn5I8t/A4cBD21MbAw8EPgRMl/TvQzMHcT/gPsAGNF/Q3J3m3+Vw4M5t8SuAS7qq/5FmCkPncdks4t0Z+CXwZprfldvS/K78FfAa4JdJnjhDM3cGfgy8nmbu5i3A1sDTgFOS7NprPJI0IP/b9fPmnR+S7Af8iOZ9807AGpovvB9KM+z9tCTL+xlIm3D/CPgo8Djg9jTz0G8PPAQ4GHgtQFX9GfhYW/UVM3y5u3d7/GxVXdPPmCWpX0zKtVB0hrDfPckjJyuQZEfgYe3TT0xS5HKaJPBRwO2qapOq2hjYnmY+3c3Am5I8rq+Rz6DtqT0euAtwAk1SvmFVLaVZ4O71NB9M9kvyyvmMrU9eQDOC4W+BLapqC2AZTUIN8OokD55YKcmzgY8A6wHfofkwuFH777IlsBvwSdqF2qpqb9Yu8Afw+Kratuuxspdgk2wFHNvGuBp4LLBxVW0GPAg4i+bD6VHt79xUPkrzRcGubflNaf7b/hbYsH1tkjRMO3T9fDlAkifRJN4BjgHu2v7d3hR4Mc2IpPsBRye5TT+CSLI5zfvgfWj+bu4DbFlVW9J8gb4jsD/wu65qH6X5+38PYOUU7d4X6Ly/+DdX0sgyKddCcTxrv9F/2RRlOuevYZIF4arqyKp6dVWdVFWXd52/oKoOpPkWHpqe0Pn0VpovBr4BPLGqTqmqG9vYrqiqd9CsQA/wljSL9MzFbkn+MMXjp+v+Mqa0JfDiqvpgp5eiqi6h+XD3q7bM87orJNkQeF/79ATgcVV1alVVW/9PVbWqql5aVav7HO//oxk9cT3wmKr6Ztd9zwB2B/5A09t/8JStwLXAblV1cjVuqapTgBe21++Z5K/7HLsk9aRNhDt/jy4Hzml//vf2eDLwzKr6LUBV3VhVn+mq8zCaEUv98A80yfUNwKOr6qNVdWV735uq6pyq+s+q+r8RY1V1Ac0uG9Ak8ZPpnD+zqn7Up1glqe9MyrUgVNUtwKfap8+aOC+s/bb+Re3Tz89xiFpnpfZHzC3K2UuzsE5nnvw72iF5kzmSZvjgdsB953i79Wl6fyd7bDPHNntxdlUdPfFk+9+084HqfhMuPwHorBb82nlesO+57fGwqjpv4sX2C53/bJ8+fZq5lR+oqj9NUv8HwKXt04mvW5IGql3r4tE0I5C2a0+/t6puSXI/mt1OAN422XtSVR0LnNY+fX6fwup8qf6xqjprFvU+1B6fPnF9kPbL3T3bp/aSSxppJuVaSD4BFM1Q4OdOuPYEmvnXnXKTSrK8Xbzr1CSXJ7m5a+GZM9tiS+dxMZi/pllgB+BzU/VkAxfQJNWwdg71bB1fVZnise3M1efsh9Nc6+wjvtWE851pCOdNsjbAwCRZStNbA/CtaYp+sz2uz9SJ9VxetyT1XfeilzTDw79Fs64HwGHAv7Q/r2iPNwPfnabJzt/AFdOU6TW2O7P2y4FjZ1n9m8CvadYbefGEa88GtqAZPXfEusQoSYPm9hdaMKrqN0lW0cwlfhlr55nD2m/Z/6cdInwrSR5F84a/Wdfpq2mGKRdwG5qFuKBJ/OdjQZjtun6+fY91Nh5EIAN09TTXOj3g60043/mS4HfMr+7/BhdMU657caSpRhnM5XVL0iBc3PXzDTQLX54FHF5VJ3Zd6/w9u6yqbpimvc7fwH6Msur+UnhWf/OrqpIcSjPkfm/WjmKCtUPXj3CBN0mjzqRcC83HaZLyhyXZsarOboesPanr+q20Q4yPoEnIT6dZVfuU7jfqJPemWQEdmgVu5kP3IjlbdObQ6f9MuXXOCN17mDFK0ozmMBpqWH//5tLeJ4B/BnZK8siqOinJTqydinZo36KTpAFx+LoWmi8AnXm6ne3PXkTT43gzzZ7mk3kkTa/0TcCTquqESb45n+sQ7k6v54bTlFk6xfk/dP0817nig7Iur2tdXdQedxhQ+1O5tOvnO05Tbvsp6kjSQtbZVvL2M+xF3vkb2I+/fxd1/bzDbCtX1WU0nw1g7fZnneOPXOBN0kJgUq4FparWsHZu2IvbBd46yflXq+riyWv+X4J1Qbvy92R2n2NYV0y4x2RuteVX6yya7c5gwgrkI2BdXte66kxBuHuSe86i3i1dP896tEM7UuHc9umjpyna+V25ERjkyvWSNJ/OaI+3pdk+dCqdv4Gnr+sNq+p81g6Hf/Icm+ks+PasJNuydn65veSSFgSTci1EnSHqy4EDWdvDPOnQ9VZnWPj27T7UfyHJDsCr5hjPT9rjXZPcf5K2twP2mqxiO2fv0+3TvZPsMt2NJot9gDqva9ckt5rvnuQBwBMHdO+vs7b35D297oVbVdextod/izne+3Ptcc8kd5t4MckWNNumAXxxhnmXkrRgVNVPgV+2T9882d/eJE9k7Reyn+3TrTsLtL6ifW+Zlao6mWb62YbA52nWh3GBN0kLhkm5FpyqOhP4cfv0wPZ4EU0iN5Xv0mwpdlvgyE6yleQ2SfYAVrE2mZut77I2gTwsyQPSWJJk97bt6ebJvQU4n2Yl728l+fvurV3a7Wv2SHIY068I3m9folkQaCOaf7O7tvGsn+RZNPuqD2QOfJvo/n379LHA8UkenCRtDEuT7J7k8+0XKt1+0R5fPMPwy6m8h2Z19I2Ab7b36dx3Z5r/BtvRjHA4aA7tS9Io+8f2uCtwdJK7ACRZL8kLWZuInwJ8uU/3fCfNKKUNgG8n2bvdR71z379K8pYkB0zTRmfbs0e2Rxd4k7RgmJRroer0ind+hz81zR7fnTln/9Q+fTRwXpKrgGtp9sreEHj5XAKpqpuAfWmS+nvTbK12ddv2N2nmsb92mvqX0gwF/AXNQnTvBS5JckUb4xVtjC9kHlfrbqcCvL59uhL4dRvPNcBRbbz/NsD7H00zeuFmmv9mpwLXJ/kTzboC3wSew60XrPxwe9wTuCrJ75OsTnJ8j/e9nGYI5SXAXdr7XNO+9h/RbCN0HfDsqjp7HV6iJI2cqvoq8DqaL5OfBvwmyRU0f/sPAzYHfkbzN3DK991Z3vNq4PE0vfRb0gw7vyLJ5TQ7pJwNHMxfrucx0adp3nc7HLouacEwKddCdThNz3fHlHuTd1TVe2g+YHyP5o37tjQ91O+h2S98zglWVX2FJnE9jiaJ7rT9dmAXmu1npqt/LvAAmvnxx9FsX7NJ285vaBax2Yvp5/j1XVW9D3g6cBLNFw23BX4F7E/Tg71m6tp9uf+HgXsCH6D57/PnNoZzaf5Nns+ELXTaOq8AftDGdweavd3vMIv7ngnci2bv3p/RfDhdr73v+4F7VtVx6/DSJGlkVdW7afYgPwz4Pc1WnNfTfDn6OmCXqrqwz/f8Dc374KtpRphdAWxK8374A5qRce+epv5VwAntUxd4k7SgpMrdfPopyabAATSJ2INo5jUdXFUHTVJ2c+BfgWfRrGL9E+DAqvrmJGW3pRne9QSa4V2nAf/gm44kSRp37XSlC4DbAa+sKnvK9X9m8/l8mjaeQDNt7X400/eOBN7oNAn1gz3l/bc18Faa/2HPnKpQO0f1WJoh0x8H9msvHZfkURPKbgKcSLOo1n8Cb6BZ5OzEdi9OSZKkcfZ8moT8KlzgTbfW0+fzqSR5DM1Uwj/TfGb/b2Af4It9jFFjbOJcTK27i4A7VNWFSbanGfY1mWfQLEby0qr6JECST9GsHvoummFjHfsCOwF/U1UntmU/D5xDMzz6WQN4HZIkSSOvXbz1be3TD9tzqUn0+vl8Kv8JnAfs1tl1JcmvgY8meVK7FoM0Z/aU91lV3dDjPKvn0CxWdVhX3TU0veYPnLAV03OAX3QS8rbspTTDZp6UZOO+BC9JkrRAJDk5yQU0nRTb0+x3PrAFSLVwzeLz+a0kuSdwH+CjE7ZB/TTNAojP7UOIGnMm5cOzM3BWVU3chuu0ruskWUIz1OY0bu00mvnl9x5UkJIkSSNqe5otKq+g2cZzt6r603BD0iK0c3v8i8/iVXUjzRa9O9+qhjRLDl8fnuVMnmh39rverj1uRbNd10U9lJUkSRoLVbXDsGPQWFjeHqf6LH6feYxFi5RJ+fBsBNwwyfk1Xde7j72U/QtJ9qFZhIKNNtrogXe84x3nFqkkTeGcc865rKpuP+w4NPq22GKLuvvd7z6Qtq+99lo22WQT217gbS/EmAfd9oUXXshFF02WC6675cuXD6xtYE7vDUnmsi3UL/jLLVoP7fPq+zN9Fp/0c7g0Gyblw3M9zdDziTbsut597KXsX2j/IB0KsGLFijrjjDPmFqkkTSHJ72YuJcGyZcsY1PvQqlWrWLlypW0v8LYXYsyDbvtd73oXBxxwwEDa3n///QfWNjCf7w1rqmrFzMXmbKbP4pN+Dpdmwznlw3MRkw877wyR6SxGcTnNN3O9lJUkSZIWrCSzesyD6aaLLsfP4eoDk/LhORO4f5KJoxUe3B7PAqiqW4CfAA+apI0H0yTsvxxUkJIkSdJ8GcGkvLOv+V98Fk+yPnB/5rDvuTSRSfnwHA1sAezZOZFkQ+BlNKuynzeh7L2TrOwqe3vg2cBxVXXtvEQsSZIkDdAwk/IkGyfZKcnWnXNV9SuaDrC9k3QPYX8xsClwVF+D0FhyTvkAJPk7moR78/bUI5O8uf35M1X1O+ALwMnAh5LcHfg9sBewA/CYCU1+CNgb+GKSdwJXAn8LrAe8GUmSJGmBS8KSJbPrM/zzn//ca9u9fD7fBTgROBg4qKv6/sDXgO8k+RTN5/XXAd8Gjp1VwNIkTMoH4wDgzl3Pd2sf0CTiv6uqW5I8Cfg3moR7c+BnwB5VdWJ3Y1V1TdtL/s627Q1otlN7cVU5dF2SJEmLwgCHpM/4+XyqilX1jSRPpknW30fTQfYx4J+qai4rxkt/waR8AHrdN7OqrgRe3T5mKnsh8IJ1i0ySJEkaXYNKynv5fF5Vq4BJA6iq44Dj+huV1DAplyRJkjQS5mnxNmmkmJRLkiRJGgkm5RpHJuWSJEmShm4etzmTRopJuSRJkqSRMNvV16XFwKRckiRJ0kiwp1zjyKRckiRJ0kgwKdc4MimXJEmSNHTOKde4MimXJEmSNBJMyjWOTMolSZIkjQSTco0jk3JJkiRJI8HV1zWO/K2XJEmSJGlI7CmXJEmSNHQu9KZxZVIuSZIkaSSYlGscmZRLkiRJGgkm5RpHJuWSJEmSRoJJucaRSbkkSZKkkWBSrnFkUi5JkiRp6JK4JZrGkkm5JEmSpJFgT7nGkUm5JEmSpJFgUq5xZFIuSZIkaSSYlGscOWlDkiRNK8k9k3w+ya+TXJvkiiQ/TPKi+AlaUp8kmfVDWgzsKZckSTO5I7AFcBjwv8AGwGOBTwP3BV4/vNAkLSYm2hpHJuWSJGlaVXUCcMKE0+9Pcizw90kOrKobhhCapEXG1dc1jkzKJUnSXP2Optd8I8CkXNI6s6dc48ikXJIk9STJxsDGwGbAbsBLgdOr6k9DDUzSouA8cY0rk3JJktSrfwb273r+beDlQ4pF0iJkUq5xZFIuSZJ69RHgG8DtgccB2wObTlU4yT7APgDLli2bj/gkLXAm5RpHrqQgSZJ6UlXnVtW3quqzVbUXcBpwUpKtpyh/aFWtqKoVS5cunddYJUlaKEzKJUnSXH0O2Ap4+rADkbQ4LFmyZFYPaTFw+LokSZqrjdrjlkONQtKi4EJvGlcm5ZIkaVpJtqmqSya5tG97PH0+45G0eJmUaxyZlEuSpJl8JMlWwHeB84HbAU8BHgZ8sapOHGZwkhYPh6RrHJmUS5KkmXyOZk/yVwBbA2uAXwB/S7MiuyT1hT3lGkcm5ZIkaVpV9Xng88OOQ9LilsSeco0lk3JJkiRJI8Geco0jk3JJkiRJI8GkXOPIpFySJEnS0Dl8XePKpFySJEnSSLCnXOPIpFySJEnSSLCnXOPIpFySJEnSSLCnXOPIpFySJEnS0DmnXOPK33pJkiRJIyHJrB49trl+krclOT/JmiQ/TfL8HuveJsmrkvw4ydVJLknynSSPX6cXKnUxKZckSZI0EgaRlAMfB94IHAO8BrgAOCLJC3uo+x7gg8AvgQOAfweWAV9P8vTZvj5pMg5flyRJkjR0gxi+nuSBwJ7AwVV1UHvuY8BJwDuTHFlVN01Rd0NgH+CLVfWCrvP/DVwI7AV8qa8BayzZUy5JkiRpsXoOUMAHOieqqmh6v7cFHjlN3Q2B9YGLJpy/ArgeuK6vkWpsmZRLkiRJGgkDGL6+M7C6qi6dcP60ruuTqqo/AT8BXprkxUnulORewMeA9YB3z/4VSrfm8HVJkiRJI2EOw9e3TnJG1/NDq+rQrufLuXVPN13ntpuh/ecCnwU+1XXuD8BuVXX6bIOVJmNSLkmSJGkkzGGf8suqasU01zcCLpnk/Jqu69O5Bvg5sIpmHvo2wOuAryR5VFWdM7twpVszKZckSZI0dLNcUb1X1wMbTHJ+w67rU8WzKXAK8ImqOrjr/JeAc2hWYncFdq0zk3JJkiRJI6Hfq6/TDFO/+yTnl7fHC6ep+0zgTkxYYb2qLk3yPWDXvkSosedCb5IkSZJGwgAWejsTuHOSbSacf3DX9al05pvfZpJrt8UOTvWJSbkkSZKkoevsUz6bRw+OBgK8uus+AfYFLqaZJ06SjZPslGTrrrpnt8c9J8R5J5qt1H405xcrdfHbHUmSJEkjod9zyqvq9CSfBQ5MshXwU+AZNEPPX1JVN7VFdwFOBA4GDmrPHduWf12S7dvrt6dJ8DcE3t7XYDW2TMolSZIkjYQBLPQG8FLgt8CLgVfSLNK2Z1UdPl2lqropya7AP9Is6PZk4CaaPc7fXlXfHUSwGj8m5ZIkSZJGwgAWeqOqbgDe1D6mKrOKZpj7xPNXzVRXWlcm5ZIkSZKGbkBbokkjz6RckiRJ0kgYRE+5NOpMyiVJkiSNBHvKNY5MyiVJkiQNXWdLNGncmJRLkiRJGgn2lGscpaqGHcPYSnJX4F+BxwAbAz8H/qWqvtxVZi/gv6doYteqOrmXe61YsaLOOOOMdQtYkiZI8qOqWjHsODS6kjwZePLy5cv3PuKIIwZyj2uuuYZNN93Uthd42wsxZtue3G677Tan94Ytt9yy/uZv/mZWdb74xS/6PqQFz57yIUmyPfADmv8G7wUuB54DfCnJc6vqyAlV3kazp2K3swceqCRJ66CqjgWO3XHHHfdeuXLlQO6xatUqbHvht70QY7ZtSf1gUj48bwC2Bnauqp8AJPkgcCrwniRfqqqbusqf0GuvuKTRssMbvtaXdlYfskdf2pEkaVQ5fF3jyJUUhmdX4JedhBygqm4BjgSWA4+aWCHJZkn8IkWSJEmLTmef8tk8pMXApHx4NgCum+R859zEuTHHAVcB1yf5dpIHDjI4SZIkab6ZlGsc2es6PGcDj06yVVVd3nV+1/Z4h/Z4HfAZ4DvAFcB9gP2B7yXZtap+NF8BS5IkSYNkoq1xZFI+PB8AngIcneQfaRZ6ex7w9Pb6RgDtgm/di74dk+Qo4CfAO4Apl6hMsg+wD8CyZctYtWpVn1+CpF7sf9+b+9KO/w9LkhY7k3KNI5PyIamqE5LsS5NYn9aevgjYD/gQcPU0dc9JcgzwzCQbVNUNU5Q7FDgUmi3RXGFTGo69+rXQ2wtX9qUdSZJGlUm5xpFzyoeoqj4CLAMe0j52AH7bXp64/dlE59N8qbJ0UPFJkiRJ8yUJS5YsmdVDWgzsKR+yqroe+GHneZLHtj9+a4aqdwNuAv40oNAkSZKkeWVPucaRSfkISbIjzRzwY6rq3PbcNlV1yYRyO9PMR/9WVd04/5FKkiRJ/WdSrnFkUj4kSbYHvgwcA1wA3APYF7gEeFVX0VOS/Bg4g2YxuHsDewPX0qzCLkmSJC0KJuUaRyblw3MVzbzwVwFbA3+g2frs4Kr6Y1e5zwJ7AI8GNqVJ2o8E3lZVv57XiCVJkqQBce9xjSuT8iGpqquAZ/RQ7kDgwMFHJEmSJA2XSbnGkUm5JEmSpJFgUq5xZFIuSZIkaSSYlGscmZRLkiRJGgkm5RpHJuWSxt4Ob/ha39pafcgefWtLkqRx4kJvGlcm5ZIkSZJGgkm5xtGSYQcgSZIkSdK4sqdckiRJ0kiwp1zjyKRckiRJ0kgwKdc4MimXJEmSNBJMyjWOTMolSZIkDZ2rr2tcmZRLkiRJGgkm5RpHJuWSJEmSRoJJucaRSbkkSZKkkWBSrnFkUi5JkiRpJJiUaxwtGXYAkiRptCV5UJL3JflZkmuSXJjkq0lWDDs2SYtHZ6G32TykxcCkXJIkzeQfgecCJwH/D3gPcE/gh0meOMzAJC0uJuUaRw5flyRJM/lP4AVVdWPnRJKPA78E3g4cN6zAJC0uJtoaRyblkiRpWlV1yiTn/phkFfDU+Y9I0mJlUq5xZFIuSZLmajvgj8MOQtLiYVKucWRSLkmSZi3JrsDDgXcPOxZJi4PzxDWuTMolLQg7vOFrfWln9SF79KUdaZwlWQ58Fjgf+Odpyu0D7AOwbNmy+QlO0oJmUq5x5OrrkiSpZ0mW0izstinw5Kq6cqqyVXVoVa2oqhVLly6dtxglLVxLliyZ1aMXSdZP8rYk5ydZk+SnSZ7fa0xJNk7yz0nOaetfnOS4JDvM8WVKf8GeckmS1JMkGwNfBXYEHltVPxtySJLUi48DLwA+CPwUeAZwRJIlVXX4dBWTbAp8B7gH8FHgf4AtgV2ArYDVgwtb48KkXJIkzSjJ+sAXgYcAT6uqk4cckqRFqN/D15M8ENgTOLiqDmrPfQw4CXhnkiOr6qZpmvgX4K+AFVV1Xl+Dk1oOX5ckSdNKchvgCOAxwEuqqj+LPEhSl85Cb7N59OA5QAEf6JyoqqLpNd8WeOQ08WwO7A18tKrOS7Jeko3W6UVKkzAplyRJM3kn8Ezg28CSJHtOeGwy5PgkLRIDSMp3BlZX1aUTzp/WdX0quwIbAWcn+RxwHXBdkrOS7Dbb1yZNxeHrkiRpJg9oj49pHxPdBbh2/sKRtFgNYPX15cBFk5zvnNtumrr3aI//BvwOeCmwPvBG4PgkD62qH/UrUI0vk3JJkjStqlo57BgkjYc5JOVbJzmj6/mhVXVo1/ONgEsmqbem6/pUNu2EBexWVVe3MX4TOA94E82icdI6MSmXJEmSNBLmkJRfVlUrprl+PbDBJOc37Lo+XV2Ar3QScoCq+n2Sk4BHzCpSaQom5ZIkSZKGbhbzxGfjIuDuk5xf3h4vnKZu59rFk1y7mGZrNGmdjfxCb0ken6SSrJm5tCRJC0v7HldJVg47FkkatgEs9HYmcOck20w4/+Cu61PpzBfffpJr2wMTF4+T5mTapDzJR9sPCn9MMtmwj6nqndfW+8q6hyhJUv8k2TLJmq5k+B4z15rTffZLclCS+w+ifUlajAaQlB9NMyf81V33CLAvTW/3Se25jZPslGTrTrmqOocmaX9qd1KfZCeaoevH9+ElSzP2lH+8PW4FPLWXBpM8CrjbhPqSJI2KF/KX8wtfNqD77Ae8FZgpKT+7fVw3oDgkacHod1JeVacDnwUOTPK+JK8Avkaz3dnrq+qmtuguwK+Av5vQxH40889PSXJAkjcCq4ArgYP78ZqlaZPyqjoV+GX79KU9ttkpdzHNL7wkSaPk5e3xv9rjS5LcZljBVNVO7eO0mUtL0uKVhCVLlszq0aOXAocATwc+ANwR2LOqPj1Txar6HrA7zfzyg4F/BE4FHlZVq2f/KqVb62Wht48D7wIem2T7qvrfqQom2Qx4Vvv001V1cx9ilCSpL5LsTNNz/Sfg9cAewF2BJwBfHWJokiQGsk85VXUDzfZlb5qmzCqaYe6TXTsJeGS8CVPuAAAgAElEQVTfA5NavXy99BngprbsS2Yo+1xgk/bnT3ROJtkkydOTfCLJT5JcluSGJBck+WKS3ecSfJJD2vmA35imzIwLxbVzSF6X5OR2/vyNSS5cl9gkSSOp00v++apaQ/Me131+Sklul+QtSX6Y5PJ2XvrqJMcn2TfJ0rbcQUkKuHNb9b+75q9Xe6273WkXekuyYTs//ZQkV7T3/V2ST083X72NrZLslWT9JP/Qvgdfm+TKJN9J8viZXrckzacBzCmXRt6MSXlVXQp0Fmzba4binaHr36+q/+k6/yLgi+31+wEbAX8GtqMZRvLNJG/vPez+SXIv4Oc0owEeTrO1wfU02yR0Ynv3MGKTJPVPkg2BF7RPP911LOBJSZZNU/exwLk0Qxd3ATajea+4M/BY4EPAbm3xa2imcN3SPr+qfd796DXmOwCnA+8GHkrzxfca4E40760/SvKaGZrZlGYho/8A7tnGtXkb73FJBjWnXpJmzaRc46jXiRidBdvunmTSoRtJdgQe1j79xITLl9N8YHkUcLuq2qSqNqbZSuDtwM3Am5I8bjbBr6t2dcXjgbsAJ9Ak5RtW1VKaxe1eT7Pwzn5JXjmfsUmS+u6ZwBbAeVV1CkBV/QY4mWY614smq5TkAcAxNF/a/gJ4IrBxVW1JkyQ/iOaL3avbNt9ZVdsCv2+beG1Vbdv96CXYdp77F4D70CwotCewaVVtQbOg6ldp3sffl+QJ0zT1zzTvt08DNqmqzYCdaOZEBnhvp5dfkobNpFzjqNek/HigM5d8qm/UO+evAY7svlBVR1bVq6vqpKq6vOv8BVV1IGtXLpzp2/5+eyvNB5VvAE+sqlOq6sY2tiuq6h3AK9qyb0ky8vu6S5Km1BmiPnFhn09PuD7R+2hW3j0XeHhVfb2zWm9VXVdVZ1TVAVX17T7H+yzW7qP73Ko6vOs96jc0o7l+2F7/j2na2RjYvaqO6Yr7bOApNL3umwJP6nPskjRrs03ITcq1WPSUZFbVLcCn2qfPSrJp9/X22/xOD8Pnq+qaWcbRWaX9EbOsN2dJbsvaOfLvqKo/T1H0SJoPLdsB952P2CRJ/ZXkrsBKmqHqn5lw+Uiaoeg7JXnYhHr3YO170xur6soBh9rtue3xB1V1q71w28VUO19q3yfJVO9RR0+YUtapfynwg/bp/dY1WEmSNDez6fn9BM2HmU1Y+0Gh4wk0c7A75W4lyfIkb0tyartAzs1dC96c2RZbOjHhH6C/ppkTCPC5JH+Y7AFcAKzflrvzpC1Jkkbdy2iGan9v4hY2VXUV8OWuct06Sfqfga8PMsBJrGiP35qmzIk0sXWXn+iHU5yHZosfaKZsSdLQ2VOucdTLlmhAM1QuySqahWFextp55rD2Q8z/dObpdUvyKOBY1ibB0My9u54m0b8NsHV7fhOaIfCDtl3Xz7fvsc7GgwhEWgx2eMPXZi7Uo9WH7NG3tqR26lFnZNRUe9J+Cng+8Nwk+3WN+OrM/76sqq4dYJiT2aY9XjBVgapak+QyYFlX+YmunuYena1L15t9eJLUfybaGkeznSPdScQf1i7s1lks7UkTrv+fJBsAR9Ak5KcDjwM2q6rNq2pZu+DNyu4qs4xprm7T9fMWVZUeHp+bp9gkSf3zOJr1QwA+lgnbk7Ujtjpba24KPGeSNmqSc/Ol13sPM0ZJ6gt7yjWOZpuUfwH4U/tzZ/uzF9F8w34zt56nB/BIml7pm4AnVdUJk8w572kl2kl0vuHfcJoyU60o+4eun50rLkmL14x7kE/QPYT9ovZ4+ySb9CmeXl3SHu84VYF2m7fbtU8vHXhEkjRgJuUaR7NKyqtqDU2vN8CL2wXeOsn5V6tqsr1XOx8mLqiqSya5DrD7bOLocsWEe0zmwVOcP4tmuzOA583x/pKkEZbk9jSrjEOzmvlm0zx2acs9PMlO7c+dKVm3oVk/ZTY6+5TP9VPjGe3x0dOUWcnaqWinz/E+kjQSkrBkyZJZPaTFYC6/yZ0h6suBA1nby3yroeutzkq12ye51UIySXYAXjWHOAB+0h7vmuT+k7S9HbDXZBWr6gbWzi3cO8kuk5XrastFcCRp4emM5roSOLaqrpnmcTrQWaX8ZQBVdR5wUnvuX5NsPot7X9Uet5hj7J0pUw9N8tiJF9tdRN7SPv15Vf18jveRpJFhT7nG0ayT8qo6E/hx+/TA9ngRU69K+12aLcVuCxyZ5G7QbKOWZA9gFWuHoc/Wd1k7tPCwJA9IY0mS3du2p5tj9xbgfJrV1b+V5O/bOfK0MW6RZI8khzH96reSpNHUGYp+TGeP7xkc1R5f3Ca9AK+leR+7B/D9JI9Psh5Ako2TPDjJh9v3nW6dJPlZSbacQ+xfYO3K6UcmeUHXfe/SXn9oe/31c2hfkkaOSbnG0VzHfHR6xTv1PzXVPt9VdRnwT+3TRwPnJbkKuBb4Ks188NnO9+u0fROwL01Sf2+ardWubtv+Js089tdOU/9SmqHzv6AZuvhe4JIkV7QxXtHG+EJcmVaSFpQkD6F5b4C1yfZMOuWWAXsAVNWPgafS9Lbfh+ZL6GuTXE7zfnMq8EqaReK6HUrzxfDDgEuTXJhkdZLVvQTSvq8+k+Y9ailwOHBNkiuA39AMy78FeG1Vzfd2bZI0ECblGkdzTcoPp+k16Jh0b/KOqnoP8DTgezQfYG5L00P9Hpr9ws+eYxxU1Vdo5tQdR5NEd9p+O838wMtmqH8u8ACaufHHARfTbMt2W5oPPV+gGQL/qLnGKEkais4XvlcCJ/RSoap+BvxqQn2q6gSanvJ/oVmT5HpgI2A1cDxNUv6dCW2dRJPYf6uNYRlw5/bRk6q6gGb/8dfRJP/X02zP+XuaxVUfWFXv67U9SRpls03ITcq1WPS8T3m3qrqC5sPIbOocAxwzxeWLmWIhnKr6xlTXusp8n7ZHYxK91L8J+GT7kCQtAlW1N7D3HOrda4rzlwJvbh+9tvV1pp7e1Skz03vUGuDd7aNnVbVDD2X2Yoq1VyRpGEy0NY7mlJRLkiRJUr+ZlGscmZRLkiRJGgkm5RpHJuWSJEmSRoJJucaRSbkkSZKkoXPxNo0rk3JJkjQwSZ4MPHn58uWsWrVqIPe45pprbHsRtL0QY7bt/luyZK6bQ2muklT7425VtWqe772aZleSl1bVJ/tZf67XhsGkXJIkDUxVHQscu+OOO+69cuXKgdxj1apV2PbCb3shxmzb/bcYe8qTHAS8dZJLN9Bs33wmcBhwVFXVJOU0j9r/XgCfrKrV83FPk3JJkiRJmh8Xd/28FLhD+3gysFeSp1fVDUOJbGH6NbAGuLKP9TpfoKwCVs81sNkwKZckSZI0EhZjT3m3qtq283OSJcA9gXcDjwGeALwd+IfhRLfwVNWj57PeoDhpQ5IkSdLQdRZ6m81jIauqW6rqF8BTgPPa069MYsfpmDEplyRJkjQSlixZMqvHYlBVa4Cj2qebATsBJPlkkmqPSfKKJCcn+WN7fq/udpIsTfKWJGcmuSrJ9UnOTfKhJHftJZYk2yZ5f5LfJlmT5A9JDk+y0zR1dkzyD0m+leTX7X2vSnJWkrcn2brHe2+W5N+SnN22cVmSLyd58DR1Vk/2b9HDvW5Vr/Pv3VXsxLZM57G6LXdI+/wXM9xj8yTX9BLf4vhNXqCS3DXJ59r/sa5PcnqSp01SbvP2f44/tOVOTfKYYcQsSZIkDco49ZRP8L9dP28+4VqAI4GPAg9tn9/yFwWSewM/Bw4GHgCsB9wE3B3YF/hlkmfOEMNdgLOAvwWWtfWXAS8Azkry+CnqHQ/8B/Doto01wKbA/YE3AT9OsuMM994SOB14A7ADcCNwO+CpwClJXjZD/X64kr+c839F+7zzuLQ9/xGggHslecQ07b0A2KRt98jpbmxSPiRJtgd+QDN/5L00c0euB76U5Dld5QIcC7wc+DiwX3vpuCSPmtegJUmSpAEa46R8h66fL59w7RnA04ADgC2raiuaReKOh6aHmSZf2B64ANgD2KSqNqdJjE8FNgAOT/LX08Twbppk+LFt/c2ABwM/AzYEPt/mMBOdCryG5guADatqy7b87sBpNAvZHTHD638rsA3wnPbeS4F7Ad+lyVk/kmTnGdpYJ1X12u45/8AzqmrbrseD2nK/pf23B/aepsnOtc9U1XXT3dukfHjeAGwN/E1V/XNVvR9YSfMN0XuSrNeWewbwSOBVVfWmqvpIW+53wLvmPWpJkiRpAMZtTnlHks2BF7ZPLwfOmVBkU+B1VfWuqroKoKquqaqL2uuvpumhvgl4fFUdV1W3tOV+QpNkr6ZJzP9lmlA2aut/s7M1W1WdRpNcX07Tg/9PEytV1fOq6v1V9euqurE9d2NVfZum9/xiYOcZepWXAs+uqqOq6ua2jV/RLH53Ls0C5W+bpv58+3B7fHaSLSZebL9A6HyJcOhMjbmIwPDsCvyy/R8FaBZ7SHIk8A7gUcC3aL4t+hPN3oWdcmuSfBz41yR3q6pfz2/oWqh2eMPX+tLO6kP26Es7kiRJ3RZLot2LNpl7IPDvwHbt6fd2EuouV9AMmZ7Kc9vj0VX184kXq+rqJP8BfBB4QpKlVTXZVmBHtYnwxPqXJPkw8Mb2Xn873euaUPeaJN+lyWkeAZw8RdHvt0n8xPrXJ3kHTWL7+Glin29fBX4P3BF4EfBfE67v0x5/UFU/m6kxe8qHZwNgsmEMnXMr2uPOwFmdb4y6nNZ1XZIkSVrwFvtCb90Lh9Ek29+iScyh6YSbrCf79E4P9CTtrQ/cr336rWlu/c32uISp84fvTFO/c+12Se4ySRxPSvL5JL9Jcu2E19mZmjvZ0PfZ3Hu62OdVVf0Z+Fj79C+GsCfZBHh++3TGXnKwp3yYzgYenWSrquqeN7Jre7xDe1zO2gS8W2e4ynaTXJMkSZIWlMU0JH0a3QuJ3QBcRrO42uFVdeIUdS6Zpr2tgNu0P18wTbnuheS2maLMdPW7r20D/Bb+b6/1w1ibhALcTPOFQ+eLhKU0c8w36bH9me49Kj4GHAjcN8lDqurU9vzzaIb6/4kZFnjrMCkfng/Q7El4dJJ/pJmn8Tzg6e31jbqON0xSf82EcreSZB/aoRPLli1j1apV6x61FrT97ztxwMXcTPa71K+2B93+YotdkqTFZLEn5RMWEuvVn3ttvsdrU5Wbrv5UXk6TkP+Zppf/M8BvuofgJ/kMsCfNqvG9xNePuAauqi5M8hWaNcD2oVnwDtb2nB820wJvHSblQ1JVJyTZl2b+eKcn/CKa1dU/BFzdnrueZqj7RBt2XZ/qHofSDplYsWJFrVy5ct0D14K2V7/mlL9w5cDaHnT7iy12SZIWk8WelA/A5TQJ8W1o5jdPpfvapVOUmW54+R26fu7uuX9ee/xYVb11irq9fBEx3b27r003amAYPkyTlD83yX7AnWlWrIceh66Dc8qHql1JfRnwkPaxA+1QENauungRkw9RX94eLxxgiJIkSdK8WexzyvutnWv+0/bpo6cpunt7vAU4c4oyu01Tv3Pt8nZLsI5Osn/WZJWSbMraJHU6vdz7lqnu02ednvleviH6FnAesDHNCvqdXvKeFnjr8Dd5yKrq+qr6Yfvo7AsIaxdqOBO4f5KJoxo6v9zz8YspSZIkDdS4bonWB59rj89Kcp+JF9vE+PXt0+OmWb382Ul2nKT+1sAr26efn3C509ZU+58fCGw2VeBdHpFk5ST33hDYv316fFX9qYe21tVV7fFWW51N1G4d11kZ/9U0w/RhFr3kYFI+Utr/CfYBjqmqc9vTR9P8QuzZVW5D4GU0q7KfN++BSpIkSQNgUj4nH6IZbbse8PUkT2gXYCPJfYHjafYxvxF48zTtrAG+kWT3tP+4SR5E01m4Nc302kMm1PlGe9w7yT7tavAk2TbJu2m+DPhjD6/hSuALSZ7V6YxMshPwNWAnmiH6b+mhnX7obCv3wiQb91D+v2nWALsPsCXNAm8Tv7yYlnPKhyTJ9sCXgWNoVhS8B7AvzTyJV3UV/QLNfn4fSnJ3mv3w9qIZ6v6Y+YtYkiRJGiwT7dlr9yF/Ck2CvD1wHLAmyY00q4BDkzTuWVU/maap19Es1vZN4LoktwCbdtV/flWdP6HOu4Bn0STOH6HJWa6iWXE97bkNgZfM8DIOpumNPwq4Icmatg1ohpO/qqrOmKGNfvkw8HDgmcBTklxCs6L8/1bVIyYWrqo/JjmKtZ2oh1XVlOt+Tcae8uG5CjifJgH/MM0chM8Au1RVZ7sz2pULn0TzDczewHtoFnLYY5ptEyRJkqQFx57yuamqnwP3Bg4CfkyTRG4A/Jom17h3VR09QzO/AR5As0vUpcD6NB2GnwUeUFW3Wrm2HU7+MJocZTVNj/bNwCqaJH7fHl/CFcAuND3x57exXw4cCzy8qj7aYzvrrKoOA15E0zF6Hc1aXndm+sXojur6eVZD18Ge8qGpqqtoVurrpeyVNHMUXj3QoCRJkiT1VVUdRJMsz7beXjQjZHstfyVNj/PBs7zPxG83/q599Fr/CuD/tY/Jru/FFK+jqnaYcOqf2kev955Yf52vtdcPo9l/vVedEcyzWuCtw6RckhawHfq5ndshe/StLUmSZiuJK6prwUmyOfDi9umH5tKGv/WSJEmSRsIghq8nWT/J25Kcn2RNkp8mef4cYlsvya+SVJLpFkzTmEiyAfBemrn7v2eWC7x12FMuSZIkaSQMaJ74x4EXAB+k2dP7GcARSZZU1eGzaOd1rN2XW2MsyX7AfsA2wEbt6de1W1zPmj3lkiRJkkZCv3vKkzyQZlXst1XVa9oFw55Is4jXO5Os12Nc29Psuf2vc391WkS2oFn8LTQL6z23h4X0pmRSLkmSJGnoOnPKZ/PowXNottT6QOdEVRVNr/m2wCN7DO/dNMnXEbN7VVqMquqgqkpVbVRVD6iqI9elPYevS5IkSRoJAxi+vjOwuqounXD+tK7r354hpsfQDHlf0e/gJLCnXJIkSdKIGMBCb8uBiyY53zm33QzxrA/8F/CxqjprVi9G6pE95ZIkSZJGwhx6yrdOckbX80Or6tCu5xsBl0xSb03X9ensT7OY15tmG5jUK5NySZI0oySbAgcAuwAPArYGDq6qg4YZl6TFZQ5J+WVVNd2w8uuBDSY5v2HX9aliuSPwZuANVXXZbAOTemVSLkmSerE18FbgAuBM4LHDDUfSYtNZ6K3PLgLuPsn55e3xwmnq/gtwGfD1JDu057Zvj1u05/5QVWtuVVOaBeeUS5KkXlwE3KGqtgdePuxgJC1OA5hTfiZw5yTbTDj/4K7rU7lT+zgX+G37+F57bf/2+UN6fW3SVOwplyRJM6qqG5i+R0mS1tkAVl8/Gng98GrgoPYeAfYFLgZOas9tTJOAX9Y1VP3NNKOEum0DfIRma7SjgJ/3O2CNH5NySZIkSSOh30l5VZ2e5LPAgUm2An5Ks73ZrsBLquqmtuguwInAwbTJe1WdPEl8O7Q//qqqvtzXYDW2TMolSZIkDd2A5pQDvJRmqPmLgVcC5wB7VtXhg7iZNFsm5dII2eENX+tbW6sP2aNvbUnSXCTZB9gHYNmyZUOORtJCMIDh653pN29imm3NqmoVMOPNq2p1L+Wk2XChN0mSNBBVdWhVraiqFUuXLh12OJIkjSR7yiVJkiSNhEH0lEujzp5ySZIkSZKGxJ5ySZIkSSPBnnKNI5NySZLUkyR/B2wBbN6eemSSN7c/f6aqfjecyCQtBklMyjWWTMolSVKvDgDu3PV8t/YBcDJgUi5pnZiUaxyZlEuSpJ5U1Q7DjkHS4mZSrnFkUi5JkiRpJJiUaxyZlEuSJEkaCSblGkduiSZJkiRJ0pDYUy5JkiRp6Fx9XePKpFySJEnSSDAp1zgyKZckSZI0EkzKNY5MyiVJkiSNBJNyjSOTckmSJEkjwaRc48ikXJIkSdLQudCbxpVJuSRJkqSRYFKuceQ+5ZIkSZIkDYk95ZIkSZJGgj3lGkf2lEuSJEmSNCT2lEuSJEkaCfaUaxyZlEuSJEkaCSblGkcm5ZIkSZKGzi3RNK5MyiVJkiSNBJNyjSOTcmmWdnjD1/rSzupD9uhLO5IkSYuFSbnGkUm5JEmSpJFgUq5xZFIuSZIkaSSYlGscuU+5JEmSJElDYk+5JEmSpKFz9XWNK5NySZIkSSPBpFzjyKRckiRJ0kgwKdc4MimXJEmSNBJMyjWOTMolSZIkjQSTco0jk3JJkjQwSZ4MPHnZsmW8613vGsg9tt9+e9teBG0vxJgH3faOO+7IqlWrBtL2NddcM7C258qF3jSuTMolSdLAVNWxwLF3vOMd9z7ggAMGco93vvOd2PbCb3shxjzotk888URWrlw5kLZXrVo1sLYlzY5JuSRJkqSRYE+5xtGSYQcgSZIkSdK4sqdckiRJ0kiwp1zjyJ5ySZIkSZKGxJ5ySZIkSSPBnnKNI5NySZIkSSPBpFzjyOHrkiRJkoaus0/5bB49trt+krclOT/JmiQ/TfL8HuptlWT/JKuSXJzkqiRnJnlVktus8wuWWiblkiRJkhazjwNvBI4BXgNcAByR5IUz1HsYcAhwdXt8PfA74IPAYQOLVmPH4euSJEmSRkK/h68neSCwJ3BwVR3UnvsYcBLwziRHVtVNU1T/BXCPqlrdde7Dbf2XJ/m3qvppXwPWWLKnXJIkSdJIGMDw9ecABXygc6Kqiqa3e1vgkVNVrKrfTkjIO77QHu/V6+uSpmNSPkRJtktyaJLfJLm+PX4kyR27yuyVpKZ4PGKY8UuSJEkjbmdgdVVdOuH8aV3XZ2u79vjHOUcldXH4+pAkWQr8ENgI+BDN/JR7AvsCT0hy76q6uqvK24BzJjRz9nzEKkmSJM2HOQxf3zrJGV3PD62qQ7ueLwcumqRe59x2k1ybUpL1gdcBF9IMgZfWmUn58DwT2B54SlUd2zmZ5Nc0w2t2B77UVf6Eqjp5fkOUJEmS5s8ckvLLqmrFNNc3Ai6Z5Pyaruuz8SGaYetPr6obZllXmpRJ+fBs3h4nfnPXeX7dxApJNgOur6qbBxmYJEmSNN9ms83ZLFwPbDDJ+Q27rvckyVuBlwFvqaov9yE2CXBO+TB9l2bRif9K8rAkd0iyO/BvwKnAtyeUPw64Crg+ybfblSQlSZIkTe0iJh+ivrw9XthLI0leAxwEvL+q3taf0KSGPeVDUlVnJXkVzZ6H3++6dCzwvK7e8OuAzwDfAa4A7gPsD3wvya5V9aN5DHtB2OENX+tbW6sP2aNvbUmSJGl6A+gpPxN4dJJtqqp7GPuDu67PFNNewHuBw4G/73eAkkn5cF0EnAycAJwP7EKzcMSnkzy7GkcCR3bVOSbJUcBPgHcAfzNV40n2AfYBWLZsGatWrRrIixg1+9+3f6P7J/s361f7g2x70O0b+3DaH0bskiTNpwEk5UcDrwdeTdPTTZqb7AtcTLtYW5KNgTvRzFG/rCueZwIfA74G7NVupyb1lUn5kCR5KvB54L5VdW57+pgkvwU+CjwFOGayulV1TpJjgGcm2WCqRSbalScPBVixYkWtXLmyz69iNO3Vz57yF64cWPuDbHvQ7Rv7cNofRuySJM2nfiflVXV6ks8CBybZCvgp8AxgV+AlVXVTW3QX4ETgYNYm7w8CjgCupvlc/rwJ8f20qn7a14A1lkzKh2c/4JddCXnHF2mS8l2ZIilvnU/z328pk68oKUmSJAleCvwWeDHwSppthvesqsNnqHdvYP328dFJrh9Mk+RL68SkfHi2Y+1WDN1uO+E4lbsBNwF/6mdQkiRJ0mLSjip9U/uYqswqIBPOfRL45ABDkwBXXx+ms4F7J3nAhPN7tscfASTZZmLFJDvTDG//dlXdONAoJUmSpHnS2Rat14e0GNhTPjz/Djwe+E6SDwC/p5nLshfwS+CottwpSX4MnAFcTjOMZm/gWppV2CVJkqQFz0Rb48qkfEiq6vtJdgHeSjO/ZVuaueGHAm+uqs7Q9s8CewCPBjb9/+3dfZAsVXnH8e8P9HIREBBFQMjFiopGLRF8KyOoURSDmMIXEhQBRZFQ8bXKlxjRG0hV0ICxSNDyojGiYBRUCC/RqIkoviECQgKlggIqiMSKIHgvCD75o3vDMO7dmVl2t6d3v5+qrp453ef0s3tn7tNnT/fpdp9PAcdW1dVLHrgkSZIkacHYKe9QVV0KHDBin6OBo5cmIkmSJKk7jpRrJbJTLkmSJGkq2CnXSmSnXJIkSdJUsFOulcjZ1yVJ0khJViU5Nsl1STYkuSzJQV3HJUlS3zlSLkmSxvFh4KXA+4HLgBcCpyXZpKpO7TQyScuGI+VaiRwplyRJc0qyJ3AwzZM/XltVJwN/DFwAHJ/kvp0GKGlZmPQZ5XbgtVzYKZckSaMcCBRw0kxBVRXNqPkOwN4dxSVJUu/ZKZckSaPsAVxTVTcNlV84sF2S7jVHyrUSeU+5JEkaZUfghlnKZ8p2WsJYJC1jdrS1EjlSLkmSRtkcuH2W8g0D239HkiOSXJTkottuu23RgpMkqc/slEuSpFHWA5vNUr56YPvvqKp1VfWEqnrCFltssWjBSVo+vHxdK5GdckmSNMoNzH6J+o7t+voljEWSpGXFTrkkSRrlYmBNku2Hyp88sF2SJM2DnXJJkjTKGUCAo2YK0lw3eiRwI/CVjuKStIz4nHKtVM6+LkmS5lRV307yCeDoJA8ALgNeCOwFHFpVv+k0QEmSesxOuSRJGscrgB8BhwCvAb4PHFxVp3YalaRlxdFvrUR2yiVJ0khVdTvwV+0iSZIWiJ1ySZIkSVPBkXKtRHbK1Yld33bugrRzzXH7LUg7kiRJktQFO+WSJEmSpoIj5VqJfCSaJEmSJEkdcaRckiRJ0lRwpFwrkSPlkiRJkiR1xJFySZIkSZ1L4ki5ViRHyiVJkiRJ6oidckmSJEmSOuLl65IkSZKmgiOwz9cAAA+lSURBVJevayVypFySJEmSpI44Ui5JkiRpKjhSrpXIkXJJkiRJkjpip1ySJEmSpI54+bokSZKkqeDl61qJHCmXJEmSJKkjjpRLkiRJmgqOlGslcqRckiRJkqSOOFIuSZIkqXNJHCnXiuRIuSRJkiRJHbFTLkmSJGkqzIyWj7uM2eaqJMcmuS7JhiSXJTlogpiel+RbSdYn+VmSE5NsOe8fUhpip1ySJEnScvZh4O3AWcBrgZ8CpyV52aiKSfYBzgHuAt4AfAQ4AvjMokWrFcd7yiVJkiRNhYW+pzzJnsDBwF9X1dq27EPAV4Djk3yqqn4zRxPvBa4CnllVt7f1rwZOTvL8qjpnQQPWiuRIuSRJkqTl6kCggJNmCqqqgPcDOwB7b6xikkcBjwFOnumQt04BbgX+dDEC1spjp1ySJEnSVFiEe8r3AK6pqpuGyi8c2D5X3cF9AaiqO4BLR9SVxmanXJIkSdJytSNwwyzlM2U7jag7uO9w/bnqSmNLc/WGlrskNwHXLkLTDwT+ZxHaXQrG3o2+xt7XuGFxY19TVQ9apLa1DCTZH9gfeBlw5ZjVJv3Mbg3cPGFoi9G2cd87k7Y7SdzT8ruGlRH3vHJDks+1x5nEamDDwPt1VbVuoM2rgWur6o+GjrUJzeRtH6yqIzcSz9HAMTQ/z3VD204BDqyq1RPGK/0OJ3pbIRbrpDnJRVX1hMVoe7EZezf6Gntf44Z+x67+q6qzgbOTUFVHjFNn0s9sknXjtj2pSdo27ntn0nYniXtaftft/ss+7vmqqn0Xodn1wGazlK8e2D5XXeaoP1ddaWxevi5JkpbC2bZt2x21a9tL3/Y02dhl5jOXpl8/oi5z1J+rrjQ2O+WSJGnRtSPmtm3bS96ubS9921PmYmBNku2Hyp88sH2uugBPHCxMsgrYfURdaWx2ynVvrRu9y9Qy9m70Nfa+xg39jl0rU18/s8a9tIx7afU17jOAAEfNFKSZtv1I4Eaa55WT5H5JHpnk/+9pr6orgSuAVycZvIT9EGBL4PTFD18rgRO9SZIkSVq2kpxG80zxk4DLgBcCzwMOrapT2n2eAfwn8NdVtXag7r7AucA3gY8CuwJvAi4A9ik7U1oAjpRLkiRJWs5eARwHHEDTMd8FOHimQz6XqvoczRMkVgEnAocDHwIOsEOuheJIuSRJkiRJHXGkXBNJsirJsUmuS7IhyWVJDuo6rlGSPDHJiUkuT3JrkuuTnJOkl4+JSrJXkmqXnbuOZ5Qkj05yRpKbkqxP8oMk7+k6rlGS7JRkXZIftnH/MMkHk+zSdWwzkmyZZG2S89rfbyVZu5F975/kH5P8rP15vplknyUOWZpVH/PLcsotfcorfcsp5hJJo/icck3qw8BLgfdz9z05pyXZpKpO7TSyub0V2Itmso8TgW2B1wDfSrJ/VZ3XZXCTSHIfmkuvbgO26Dickdp7tM6jmSjl3cAvgd8Dfr/DsEZKsjXwLWBz4APAtcCjaCaGeV6SR1fVrzoMccYDgXcBP6WZBfY5s+3UTmpzNvAk4L3AdTSX852X5NlVdf7ShCttVB/zy7LILX3KK33LKeYSSWOpKheXsRZgT6CAtQNlAb5K8xzH+3Yd4xyxPxVYNVS2Hc2smxd3Hd+EP8sbgZ8D72v/PXbuOqY5Yt0S+Anwr8CmXcczYeyvbH+/+w+VH9WWH9B1jG08mwE7ta93Hv6ODuz3onbbYQNlq4GrgIu6/jlcVvbS1/yyXHJLX/JKH3OKucTFxWWcxcvXNYkDaf4jPmmmoKqKZlRjB2DvjuIaqaq+XlV3DJX9Avgy8AedBDUPSXYE1gJvpxkdmHYHAQ8B/rKq7kqyRZJNuw5qTPdv1zcMlc+8//USxrJRVXV7VV0/xq4H0nxmPj5QdwPN6OSeSaZylEkrRi/zy3LILT3LK33MKeYSSSPZKdck9gCuqaqbhsovHNjeNzsBv+g6iAkcD/wA+KeuAxnTc4BbgAcluQK4Fbg1yWlJtus2tJHOp+kk/EOSpyZ5SJJnA39L81iUL3Ua3eT2AC6pqjuHyvv8/dXysdzyS59yS5/ySh9zirlE0kh2yjWJHfndv/QyULbTEsZyryXZC/hD4F+6jmUcSZ5OM0rwuqr6bdfxjOnhNHNXnEszcvRC4ATgJcC/TfMIR1VdAvw58EjgazSXTH4B+D7wrFlOSKbdsvr+atlZNp/PPuWWHuaV3uUUc4mkcTjRmyaxOc09Z8M2DGzvhfZyvU/QTFByTMfhjDQwCc+pVfX1ruOZwJbA/YCTq+qotuyzSW6hmaBnP5p7A6fVDcAFwL/TfFaeBLwJOCXJS9rLa/tic+D2Wcp79/3VsrQs8kufcktP80pfc4q5RNKc7JRrEutpJgIZtnpg+9RrZ0I9jya571VVN3cc0jheD6xhI7OhTrGZz8THh8pPpTmBehrTeQJFkj8BPgk8tqp+0BafleRHwMnAC4CzuopvHpbF91fLVu8/nz3MLX3MK73LKeYSSePw8nVN4gZmvyxpx3Y9zgQhnUpyP+AcYDfg+VV1ecchjdSe6L2L5n6/VUl2TbIrsE27y85T/EzZmc/EjUPlM++3XcJYJvUG4IqBk6gZn2nXey1xPPdW77+/WtZ6/fnsW27pcV7pY04xl0gayU65JnExsCbJ9kPlTx7YPrWSrKJJgk8BXlJVF3Qc0ri2BbYCXgf8aGB5fbv9GzSXxU2j77Tr4ZO7mffDkzpNk52A2e5PvM/Qui8uBnZvL1kdNPP9vWSJ45EG9Ta/9DS39DWv9DGnmEskjWSnXJM4g+a5sTP3cZEkwJE0f6X+SkdxjdRO/nIasA9waFWd23FIk/g5cMAsyyfb7a8CjugmtJE+STPr7KuHymfef35pw5nI94BHJ3n8UPnB7fo79MsZNKNgM/GTZDXNM3QvqaqrugpMoqf5pce5pa95pY85xVwiaaS+/XVOHaqqbyf5BHB0kgcAl9HMfLoXzcnIbzoNcG7HAy+imfF0kyQHD23/bFXdtvRhjVZVvwbOHC5Psnv78vNV9ZOljWo8VfXdJOuA17SjSV8A9gQOp/mdn99pgHN7N7Av8B9JTgJ+TDM5z2HAFcDp3YV2T0n+guYkaeZ5uHsneUf7+mNVdS3waZqRrw8keRjNz3MYsCtNh0LqTI/zSy9zS1/zSk9zirlE0kjp14SP6lqSzYB3AocA29M80uO4qjq108BGSPJl4Olz7PLQqrpmaaJZGEnW0twTuMs0njzNaC9xezPNyMsuNPejfQw4pqru6DK2UdoT1HfRnPTtQDO6dDbwjqqammcQJ7mGZsKm2Tyzqr7c7rc1zbNxX0Rz0nU5cHRVTePoklaYPuaX5ZZb+pBX+phTzCWSRrFTLkmSJElSR7ynXJIkSZKkjtgplyRJkiSpI3bKJUmSJEnqiJ1ySZIkSZI6YqdckiRJkqSO2CmXJEmSJKkjdsolSZIkSeqInXJJkiRJkjpyn64DkLRxSQK8GHgpsAewPXAXcCNwA3Ah8FXgS1V1y0C9NwDbAGdW1aWLFNuiH0OStHDMKZI0nVJVXccgaRZJtgHOBJ4+UHwncAtwf+75R7VXVNU/D9S9BlgzXL7A8S36MSRJC8OcIknTy8vXpel1Cs3J013ACcAjgM2qajtgc+BxwFuB73YWoSSpL8wpkjSlvHxdmkJJHg7s3759R1UdN7i9qu4ELmuX9yTZfIlDlCT1hDlFkqabI+XSdNp94PVZo3auqvUASdYmKZpLAAE+kqQGl8F6SXZL8uYkX0xydZL1SW5JckmSv0nywOFjTXqMgXrPSPKJJNcl2ZDk5iQXJnlLki3G+J1IkubHnCJJU8yRcmn67QxcOea+t9JM2PMgmj+63QKsn2P/z3P3iVABNwNb05zA7Q4cluRZVfW9+R4jyX2ADwCvGmpjC+CJ7fLKJM+tqmvH+zElSfNkTpGkKeNIuTSdvk1zQgNwQpJHjFOpqo6vqh2AH7dFr6+qHQaXoSrfBF4LPAxYXVXbAquBZ9PMwvsQ4LR7eYzjaU6ebgSOArarqq1o7mF8JnAJsBvwmST+nyRJC8+cIklTzNnXpSmVZB3w6vZtAZcC3wC+Q3Ny89+1kS/wQsxim2RL4CrgwcBeVXXBpMdI8hiaexTXA0+pqstn2Wcr4Aqa0ZsDqurM+cQrSdo4c4okTS//gihNr6OAY4HbgACPb8s+DFwO/CzJe5M8eDEOXlW3Aue3b582z2YOp4n93NlOntrj/IrmMT0Az53ncSRJczOnSNKU8p5yaUq1s+G+M8kJNLPmPp3mXrlHAauA7YE3Ai9Psl9VXTif4yR5PvDytu0HA/ebZbed59M2d594PS/Jz+bYb8t2vWaOfSRJ82ROkaTpZadcmnJVdTPw8XYhyWqaE5PX0ZxYPRD4dJKHV9WGcdtt77X7OHDQQPGdwP8Cd7Tvt6a5H3C+M9nu1K635O6TpLnMdvImSVog5hRJmj5evi71TFVtqKovVtULgI+2xTsD+07Y1OE0J093AccADwc2q6oHDEyuc0a7b+YZ7qbt+m1VlTGWZ8zzOJKkeTCnSFL37JRL/bZu4PVuE9b9s3b9oap6V1VdVVW/HdpneNbbSc1cXvjYe9mOJGnxmVMkqQN2yqV+u3Xg9e0Dr2dOhOYajdilXV8y28Z2ptwnz1F/nGN8rV3v17YnSZpe5hRJ6oCdcmkKJXnomM+RPXTg9cUDr29p19vMUffmdv24jWw/GthqjvrjHONkmkfvbAP83Rz7keS+nmRJ0sIzp0jSdLNTLk2nRwNXJjk3ySFJdp3Z0J5oPD7JR4A3tcUXAoPPfP2vdv3iJNtu5Bifa9evTnJEklVt+zsk+XvgLcAv5ohx5DGq6lLgfe3bI5OcnmT3JGmPtWmSxyU5Grga2H2O40mS5secIklTLFXVdQyShiR5Lnef4My4g+bSwm255+V9FwP7V9X1A/X3Br7c7ncX8PO2PlW1a7vPNsA3gEe21X5LM1KxdVvvgzSz5B4KfLSqDhuKceQx2v02BY4H3jBQfQPNs3K35p5PgXhaVX0NSdKCMadI0nRzpFyaQlX1eZqZa18PnA5cSXN/3zbAr4EfAJ+imVjniYMnT239rwD7AV+kuaTwwTTPa10zsM8vgafSjDpcQ3MSdCfNSdFBVXXkiBhHHqPd766qeiOwB80kQt9rj7U1zaNyvgasBXb35EmSFp45RZKmmyPlkiRJkiR1xJFySZIkSZI6YqdckiRJkqSO2CmXJEmSJKkjdsolSZIkSeqInXJJkiRJkjpip1ySJEmSpI7YKZckSZIkqSN2yiVJkiRJ6oidckmSJEmSOmKnXJIkSZKkjtgplyRJkiSpI/8HALIeVHzXa4gAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tools.plot(V, pi)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "f7ee7bba538aa9300cd636c99403fd72", "grade": false, "grade_id": "cell-066f9bbdc057115b", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You can check your value function (rounded to one decimal place) and policy against the answer below:
\n", "State $\\quad\\quad$ Value $\\quad\\quad$ Action
\n", "0 $\\quad\\quad\\quad\\;$ 81.6 $\\quad\\quad\\;$ 0
\n", "1 $\\quad\\quad\\quad\\;$ 83.3 $\\quad\\quad\\;$ 0
\n", "2 $\\quad\\quad\\quad\\;$ 85.0 $\\quad\\quad\\;$ 0
\n", "3 $\\quad\\quad\\quad\\;$ 86.8 $\\quad\\quad\\;$ 0
\n", "4 $\\quad\\quad\\quad\\;$ 88.5 $\\quad\\quad\\;$ 0
\n", "5 $\\quad\\quad\\quad\\;$ 90.2 $\\quad\\quad\\;$ 0
\n", "6 $\\quad\\quad\\quad\\;$ 91.7 $\\quad\\quad\\;$ 0
\n", "7 $\\quad\\quad\\quad\\;$ 93.1 $\\quad\\quad\\;$ 0
\n", "8 $\\quad\\quad\\quad\\;$ 94.3 $\\quad\\quad\\;$ 0
\n", "9 $\\quad\\quad\\quad\\;$ 95.3 $\\quad\\quad\\;$ 3
\n", "10 $\\quad\\quad\\;\\;\\,\\,$ 89.5 $\\quad\\quad\\;$ 3
" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "3b65819e3413c5a6d4b8d9859f69e5b7", "grade": false, "grade_id": "cell-7408f0fb3e078296", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "The cell below will check that your code passes the test case above. (Your code passed if the cell runs without error.) Your solution will also be checked against hidden test cases for your final grade. (So don't hard code parameters into your solution.)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "8330fadde649c957ab85437d34d62829", "grade": true, "grade_id": "cell-2fa266149b9ff1b1", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "## Test Code for bellman_optimality_update() ## \n", "with open('section3', 'rb') as handle:\n", " V_correct, pi_correct = pickle.load(handle)\n", "np.testing.assert_array_almost_equal(V, V_correct)\n", "np.testing.assert_array_almost_equal(pi, pi_correct)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "167e35e35d0d33a6e9b26413281e4592", "grade": false, "grade_id": "cell-12976ff0ac11680d", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "In the value iteration algorithm above, a policy is not explicitly maintained until the value function has converged. Below, we have written an identically behaving value iteration algorithm that maintains an updated policy. Writing value iteration in this form makes its relationship to policy iteration more evident. Policy iteration alternates between doing complete greedifications and complete evaluations. On the other hand, value iteration alternates between doing local greedifications and local evaluations. " ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "335160bd36744265e1ac43bd4305766b", "grade": false, "grade_id": "cell-e7940cfb801649be", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "def value_iteration2(env, gamma, theta):\n", " V = np.zeros(len(env.S))\n", " pi = np.ones((len(env.S), len(env.A))) / len(env.A)\n", " while True:\n", " delta = 0\n", " for s in env.S:\n", " v = V[s]\n", " q_greedify_policy(env, V, pi, s, gamma)\n", " bellman_update(env, V, pi, s, gamma)\n", " delta = max(delta, abs(v - V[s]))\n", " if delta < theta:\n", " break\n", " return V, pi" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "795713d092ebf77dbe0f17c46d4286cd", "grade": false, "grade_id": "cell-de841fb4eb290d56", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You can try the second value iteration algorithm by running the cell below." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "09b1fda9c335946b52cae6c8a55e80fb", "grade": false, "grade_id": "cell-2ace3a0ae8ee2e72", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+UAAAFsCAYAAACq4xizAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xe4pGV9//H3Z5VeFhBZFlGxBaxRXLGiS8SKvRdULCCaGPkJMUZFIZqERI0lViyxACpgQRQFCysiIiDYDUVdMYAUQfpS5Pv743kmOx5OmXN25sycM+/Xdc31nHme+76f7yyHM/Odu6WqkCRJkiRJ82/JsAOQJEmSJGlcmZRLkiRJkjQkJuWSJEmSJA2JSbkkSZIkSUNiUi5JkiRJ0pCYlEuSJEmSNCQm5VIPkjw+SSVZM+xYtO6S3Kf971lJth52PJK0GCRZ2fnbOptrkjTuTMo10pJ8tH0T/2OSDWZR77y23lcGGd9CkOTUrgR0usc3hh3rukqyfpKD2sd2w45Hkoal/Ts42d/6NUn+N8lXkjwnSYYdqySNu9sOOwBpBh8HXgFsBTwVOHKmCkkeBdytq74aNwJXTHP98vkKZIDWB97a/vxV4MIpyt0AnN3+fPOgg5KkIbu46+elwB3ax5OBvZI8vapuGHAM17H2764kqYtJuUZaVZ2a5JfAvYCX0kNS3paD5kPI1wYV2wJ0YlU9fthBjIKqOhfYadhxSNJ8qKptOz8nWQLcE3g38BjgCcDbgX8YcAyn4d9dSZqUw9e1EHR6ux+bZPvpCibZDHhW+/TTVWUvqCRJraq6pap+ATwFOK89/cokdtRI0pCYlGsh+AxwE83v60tmKPtcYJP25090X0iySZKnJ/lEkp8kuSzJDUkuSPLFJLvPJbgkh8w0J7uXheKSbJzkdUlObufQ35jkwnWJbV0kObqN+f3TlPm7tszPZ6qf5AVJvpfkT0muTXJGkn1nms+Y5C5J3p3kZ0muTHJdknPbf5cXJFmvcz/g6q6qp0+YR/nzrjZnXOgtyVZJ3tb+rlzd3vfsJO9Lcqcp6mza1e6KJFsk+fc23jVJLk3ypSQPmO41S9KgVdUa4Kj26WZM6MVO8oAkn07yu/bv1xVJTkmy32zWeOlqb8aF3tp1QV6R5BtJLm7foy9K8oMkb0lyl7bcbdp58ZXk9TPc9+VtuauTbDrbuCVpPpiUa+RV1aVAZ8G2vWYo3hm6/v2q+p8J114EfLEtcz9gI+DPwHbA04FvJnl7P2KerST3An4OvAt4OLAlcD2wvCu2dw8jtn5I8t/A4cBD21MbAw8EPgRMl/TvQzMHcT/gPsAGNF/Q3J3m3+Vw4M5t8SuAS7qq/5FmCkPncdks4t0Z+CXwZprfldvS/K78FfAa4JdJnjhDM3cGfgy8nmbu5i3A1sDTgFOS7NprPJI0IP/b9fPmnR+S7Af8iOZ9807AGpovvB9KM+z9tCTL+xlIm3D/CPgo8Djg9jTz0G8PPAQ4GHgtQFX9GfhYW/UVM3y5u3d7/GxVXdPPmCWpX0zKtVB0hrDfPckjJyuQZEfgYe3TT0xS5HKaJPBRwO2qapOq2hjYnmY+3c3Am5I8rq+Rz6DtqT0euAtwAk1SvmFVLaVZ4O71NB9M9kvyyvmMrU9eQDOC4W+BLapqC2AZTUIN8OokD55YKcmzgY8A6wHfofkwuFH777IlsBvwSdqF2qpqb9Yu8Afw+Kratuuxspdgk2wFHNvGuBp4LLBxVW0GPAg4i+bD6VHt79xUPkrzRcGubflNaf7b/hbYsH1tkjRMO3T9fDlAkifRJN4BjgHu2v7d3hR4Mc2IpPsBRye5TT+CSLI5zfvgfWj+bu4DbFlVW9J8gb4jsD/wu65qH6X5+38PYOUU7d4X6Ly/+DdX0sgyKddCcTxrv9F/2RRlOuevYZIF4arqyKp6dVWdVFWXd52/oKoOpPkWHpqe0Pn0VpovBr4BPLGqTqmqG9vYrqiqd9CsQA/wljSL9MzFbkn+MMXjp+v+Mqa0JfDiqvpgp5eiqi6h+XD3q7bM87orJNkQeF/79ATgcVV1alVVW/9PVbWqql5aVav7HO//oxk9cT3wmKr6Ztd9zwB2B/5A09t/8JStwLXAblV1cjVuqapTgBe21++Z5K/7HLsk9aRNhDt/jy4Hzml//vf2eDLwzKr6LUBV3VhVn+mq8zCaEUv98A80yfUNwKOr6qNVdWV735uq6pyq+s+q+r8RY1V1Ac0uG9Ak8ZPpnD+zqn7Up1glqe9MyrUgVNUtwKfap8+aOC+s/bb+Re3Tz89xiFpnpfZHzC3K2UuzsE5nnvw72iF5kzmSZvjgdsB953i79Wl6fyd7bDPHNntxdlUdPfFk+9+084HqfhMuPwHorBb82nlesO+57fGwqjpv4sX2C53/bJ8+fZq5lR+oqj9NUv8HwKXt04mvW5IGql3r4tE0I5C2a0+/t6puSXI/mt1OAN422XtSVR0LnNY+fX6fwup8qf6xqjprFvU+1B6fPnF9kPbL3T3bp/aSSxppJuVaSD4BFM1Q4OdOuPYEmvnXnXKTSrK8Xbzr1CSXJ7m5a+GZM9tiS+dxMZi/pllgB+BzU/VkAxfQJNWwdg71bB1fVZnise3M1efsh9Nc6+wjvtWE851pCOdNsjbAwCRZStNbA/CtaYp+sz2uz9SJ9VxetyT1XfeilzTDw79Fs64HwGHAv7Q/r2iPNwPfnabJzt/AFdOU6TW2O7P2y4FjZ1n9m8CvadYbefGEa88GtqAZPXfEusQoSYPm9hdaMKrqN0lW0cwlfhlr55nD2m/Z/6cdInwrSR5F84a/Wdfpq2mGKRdwG5qFuKBJ/OdjQZjtun6+fY91Nh5EIAN09TTXOj3g60043/mS4HfMr+7/BhdMU657caSpRhnM5XVL0iBc3PXzDTQLX54FHF5VJ3Zd6/w9u6yqbpimvc7fwH6Msur+UnhWf/OrqpIcSjPkfm/WjmKCtUPXj3CBN0mjzqRcC83HaZLyhyXZsarOboesPanr+q20Q4yPoEnIT6dZVfuU7jfqJPemWQEdmgVu5kP3IjlbdObQ6f9MuXXOCN17mDFK0ozmMBpqWH//5tLeJ4B/BnZK8siqOinJTqydinZo36KTpAFx+LoWmi8AnXm6ne3PXkTT43gzzZ7mk3kkTa/0TcCTquqESb45n+sQ7k6v54bTlFk6xfk/dP0817nig7Iur2tdXdQedxhQ+1O5tOvnO05Tbvsp6kjSQtbZVvL2M+xF3vkb2I+/fxd1/bzDbCtX1WU0nw1g7fZnneOPXOBN0kJgUq4FparWsHZu2IvbBd46yflXq+riyWv+X4J1Qbvy92R2n2NYV0y4x2RuteVX6yya7c5gwgrkI2BdXte66kxBuHuSe86i3i1dP896tEM7UuHc9umjpyna+V25ERjkyvWSNJ/OaI+3pdk+dCqdv4Gnr+sNq+p81g6Hf/Icm+ks+PasJNuydn65veSSFgSTci1EnSHqy4EDWdvDPOnQ9VZnWPj27T7UfyHJDsCr5hjPT9rjXZPcf5K2twP2mqxiO2fv0+3TvZPsMt2NJot9gDqva9ckt5rvnuQBwBMHdO+vs7b35D297oVbVdextod/izne+3Ptcc8kd5t4MckWNNumAXxxhnmXkrRgVNVPgV+2T9882d/eJE9k7Reyn+3TrTsLtL6ifW+Zlao6mWb62YbA52nWh3GBN0kLhkm5FpyqOhP4cfv0wPZ4EU0iN5Xv0mwpdlvgyE6yleQ2SfYAVrE2mZut77I2gTwsyQPSWJJk97bt6ebJvQU4n2Yl728l+fvurV3a7Wv2SHIY068I3m9folkQaCOaf7O7tvGsn+RZNPuqD2QOfJvo/n379LHA8UkenCRtDEuT7J7k8+0XKt1+0R5fPMPwy6m8h2Z19I2Ab7b36dx3Z5r/BtvRjHA4aA7tS9Io+8f2uCtwdJK7ACRZL8kLWZuInwJ8uU/3fCfNKKUNgG8n2bvdR71z379K8pYkB0zTRmfbs0e2Rxd4k7RgmJRroer0ind+hz81zR7fnTln/9Q+fTRwXpKrgGtp9sreEHj5XAKpqpuAfWmS+nvTbK12ddv2N2nmsb92mvqX0gwF/AXNQnTvBS5JckUb4xVtjC9kHlfrbqcCvL59uhL4dRvPNcBRbbz/NsD7H00zeuFmmv9mpwLXJ/kTzboC3wSew60XrPxwe9wTuCrJ75OsTnJ8j/e9nGYI5SXAXdr7XNO+9h/RbCN0HfDsqjp7HV6iJI2cqvoq8DqaL5OfBvwmyRU0f/sPAzYHfkbzN3DK991Z3vNq4PE0vfRb0gw7vyLJ5TQ7pJwNHMxfrucx0adp3nc7HLouacEwKddCdThNz3fHlHuTd1TVe2g+YHyP5o37tjQ91O+h2S98zglWVX2FJnE9jiaJ7rT9dmAXmu1npqt/LvAAmvnxx9FsX7NJ285vaBax2Yvp5/j1XVW9D3g6cBLNFw23BX4F7E/Tg71m6tp9uf+HgXsCH6D57/PnNoZzaf5Nns+ELXTaOq8AftDGdweavd3vMIv7ngnci2bv3p/RfDhdr73v+4F7VtVx6/DSJGlkVdW7afYgPwz4Pc1WnNfTfDn6OmCXqrqwz/f8Dc374KtpRphdAWxK8374A5qRce+epv5VwAntUxd4k7SgpMrdfPopyabAATSJ2INo5jUdXFUHTVJ2c+BfgWfRrGL9E+DAqvrmJGW3pRne9QSa4V2nAf/gm44kSRp37XSlC4DbAa+sKnvK9X9m8/l8mjaeQDNt7X400/eOBN7oNAn1gz3l/bc18Faa/2HPnKpQO0f1WJoh0x8H9msvHZfkURPKbgKcSLOo1n8Cb6BZ5OzEdi9OSZKkcfZ8moT8KlzgTbfW0+fzqSR5DM1Uwj/TfGb/b2Af4It9jFFjbOJcTK27i4A7VNWFSbanGfY1mWfQLEby0qr6JECST9GsHvoummFjHfsCOwF/U1UntmU/D5xDMzz6WQN4HZIkSSOvXbz1be3TD9tzqUn0+vl8Kv8JnAfs1tl1JcmvgY8meVK7FoM0Z/aU91lV3dDjPKvn0CxWdVhX3TU0veYPnLAV03OAX3QS8rbspTTDZp6UZOO+BC9JkrRAJDk5yQU0nRTb0+x3PrAFSLVwzeLz+a0kuSdwH+CjE7ZB/TTNAojP7UOIGnMm5cOzM3BWVU3chuu0ruskWUIz1OY0bu00mvnl9x5UkJIkSSNqe5otKq+g2cZzt6r603BD0iK0c3v8i8/iVXUjzRa9O9+qhjRLDl8fnuVMnmh39rverj1uRbNd10U9lJUkSRoLVbXDsGPQWFjeHqf6LH6feYxFi5RJ+fBsBNwwyfk1Xde7j72U/QtJ9qFZhIKNNtrogXe84x3nFqkkTeGcc865rKpuP+w4NPq22GKLuvvd7z6Qtq+99lo22WQT217gbS/EmAfd9oUXXshFF02WC6675cuXD6xtYE7vDUnmsi3UL/jLLVoP7fPq+zN9Fp/0c7g0Gyblw3M9zdDziTbsut597KXsX2j/IB0KsGLFijrjjDPmFqkkTSHJ72YuJcGyZcsY1PvQqlWrWLlypW0v8LYXYsyDbvtd73oXBxxwwEDa3n///QfWNjCf7w1rqmrFzMXmbKbP4pN+Dpdmwznlw3MRkw877wyR6SxGcTnNN3O9lJUkSZIWrCSzesyD6aaLLsfP4eoDk/LhORO4f5KJoxUe3B7PAqiqW4CfAA+apI0H0yTsvxxUkJIkSdJ8GcGkvLOv+V98Fk+yPnB/5rDvuTSRSfnwHA1sAezZOZFkQ+BlNKuynzeh7L2TrOwqe3vg2cBxVXXtvEQsSZIkDdAwk/IkGyfZKcnWnXNV9SuaDrC9k3QPYX8xsClwVF+D0FhyTvkAJPk7moR78/bUI5O8uf35M1X1O+ALwMnAh5LcHfg9sBewA/CYCU1+CNgb+GKSdwJXAn8LrAe8GUmSJGmBS8KSJbPrM/zzn//ca9u9fD7fBTgROBg4qKv6/sDXgO8k+RTN5/XXAd8Gjp1VwNIkTMoH4wDgzl3Pd2sf0CTiv6uqW5I8Cfg3moR7c+BnwB5VdWJ3Y1V1TdtL/s627Q1otlN7cVU5dF2SJEmLwgCHpM/4+XyqilX1jSRPpknW30fTQfYx4J+qai4rxkt/waR8AHrdN7OqrgRe3T5mKnsh8IJ1i0ySJEkaXYNKynv5fF5Vq4BJA6iq44Dj+huV1DAplyRJkjQS5mnxNmmkmJRLkiRJGgkm5RpHJuWSJEmShm4etzmTRopJuSRJkqSRMNvV16XFwKRckiRJ0kiwp1zjyKRckiRJ0kgwKdc4MimXJEmSNHTOKde4MimXJEmSNBJMyjWOTMolSZIkjQSTco0jk3JJkiRJI8HV1zWO/K2XJEmSJGlI7CmXJEmSNHQu9KZxZVIuSZIkaSSYlGscmZRLkiRJGgkm5RpHJuWSJEmSRoJJucaRSbkkSZKkkWBSrnFkUi5JkiRp6JK4JZrGkkm5JEmSpJFgT7nGkUm5JEmSpJFgUq5xZFIuSZIkaSSYlGscOWlDkiRNK8k9k3w+ya+TXJvkiiQ/TPKi+AlaUp8kmfVDWgzsKZckSTO5I7AFcBjwv8AGwGOBTwP3BV4/vNAkLSYm2hpHJuWSJGlaVXUCcMKE0+9Pcizw90kOrKobhhCapEXG1dc1jkzKJUnSXP2Optd8I8CkXNI6s6dc48ikXJIk9STJxsDGwGbAbsBLgdOr6k9DDUzSouA8cY0rk3JJktSrfwb273r+beDlQ4pF0iJkUq5xZFIuSZJ69RHgG8DtgccB2wObTlU4yT7APgDLli2bj/gkLXAm5RpHrqQgSZJ6UlXnVtW3quqzVbUXcBpwUpKtpyh/aFWtqKoVS5cunddYJUlaKEzKJUnSXH0O2Ap4+rADkbQ4LFmyZFYPaTFw+LokSZqrjdrjlkONQtKi4EJvGlcm5ZIkaVpJtqmqSya5tG97PH0+45G0eJmUaxyZlEuSpJl8JMlWwHeB84HbAU8BHgZ8sapOHGZwkhYPh6RrHJmUS5KkmXyOZk/yVwBbA2uAXwB/S7MiuyT1hT3lGkcm5ZIkaVpV9Xng88OOQ9LilsSeco0lk3JJkiRJI8Geco0jk3JJkiRJI8GkXOPIpFySJEnS0Dl8XePKpFySJEnSSLCnXOPIpFySJEnSSLCnXOPIpFySJEnSSLCnXOPIpFySJEnS0DmnXOPK33pJkiRJIyHJrB49trl+krclOT/JmiQ/TfL8HuveJsmrkvw4ydVJLknynSSPX6cXKnUxKZckSZI0EgaRlAMfB94IHAO8BrgAOCLJC3uo+x7gg8AvgQOAfweWAV9P8vTZvj5pMg5flyRJkjR0gxi+nuSBwJ7AwVV1UHvuY8BJwDuTHFlVN01Rd0NgH+CLVfWCrvP/DVwI7AV8qa8BayzZUy5JkiRpsXoOUMAHOieqqmh6v7cFHjlN3Q2B9YGLJpy/ArgeuK6vkWpsmZRLkiRJGgkDGL6+M7C6qi6dcP60ruuTqqo/AT8BXprkxUnulORewMeA9YB3z/4VSrfm8HVJkiRJI2EOw9e3TnJG1/NDq+rQrufLuXVPN13ntpuh/ecCnwU+1XXuD8BuVXX6bIOVJmNSLkmSJGkkzGGf8suqasU01zcCLpnk/Jqu69O5Bvg5sIpmHvo2wOuAryR5VFWdM7twpVszKZckSZI0dLNcUb1X1wMbTHJ+w67rU8WzKXAK8ImqOrjr/JeAc2hWYncFdq0zk3JJkiRJI6Hfq6/TDFO/+yTnl7fHC6ep+0zgTkxYYb2qLk3yPWDXvkSosedCb5IkSZJGwgAWejsTuHOSbSacf3DX9al05pvfZpJrt8UOTvWJSbkkSZKkoevsUz6bRw+OBgK8uus+AfYFLqaZJ06SjZPslGTrrrpnt8c9J8R5J5qt1H405xcrdfHbHUmSJEkjod9zyqvq9CSfBQ5MshXwU+AZNEPPX1JVN7VFdwFOBA4GDmrPHduWf12S7dvrt6dJ8DcE3t7XYDW2TMolSZIkjYQBLPQG8FLgt8CLgVfSLNK2Z1UdPl2lqropya7AP9Is6PZk4CaaPc7fXlXfHUSwGj8m5ZIkSZJGwgAWeqOqbgDe1D6mKrOKZpj7xPNXzVRXWlcm5ZIkSZKGbkBbokkjz6RckiRJ0kgYRE+5NOpMyiVJkiSNBHvKNY5MyiVJkiQNXWdLNGncmJRLkiRJGgn2lGscpaqGHcPYSnJX4F+BxwAbAz8H/qWqvtxVZi/gv6doYteqOrmXe61YsaLOOOOMdQtYkiZI8qOqWjHsODS6kjwZePLy5cv3PuKIIwZyj2uuuYZNN93Uthd42wsxZtue3G677Tan94Ytt9yy/uZv/mZWdb74xS/6PqQFz57yIUmyPfADmv8G7wUuB54DfCnJc6vqyAlV3kazp2K3swceqCRJ66CqjgWO3XHHHfdeuXLlQO6xatUqbHvht70QY7ZtSf1gUj48bwC2Bnauqp8AJPkgcCrwniRfqqqbusqf0GuvuKTRssMbvtaXdlYfskdf2pEkaVQ5fF3jyJUUhmdX4JedhBygqm4BjgSWA4+aWCHJZkn8IkWSJEmLTmef8tk8pMXApHx4NgCum+R859zEuTHHAVcB1yf5dpIHDjI4SZIkab6ZlGsc2es6PGcDj06yVVVd3nV+1/Z4h/Z4HfAZ4DvAFcB9gP2B7yXZtap+NF8BS5IkSYNkoq1xZFI+PB8AngIcneQfaRZ6ex7w9Pb6RgDtgm/di74dk+Qo4CfAO4Apl6hMsg+wD8CyZctYtWpVn1+CpF7sf9+b+9KO/w9LkhY7k3KNI5PyIamqE5LsS5NYn9aevgjYD/gQcPU0dc9JcgzwzCQbVNUNU5Q7FDgUmi3RXGFTGo69+rXQ2wtX9qUdSZJGlUm5xpFzyoeoqj4CLAMe0j52AH7bXp64/dlE59N8qbJ0UPFJkiRJ8yUJS5YsmdVDWgzsKR+yqroe+GHneZLHtj9+a4aqdwNuAv40oNAkSZKkeWVPucaRSfkISbIjzRzwY6rq3PbcNlV1yYRyO9PMR/9WVd04/5FKkiRJ/WdSrnFkUj4kSbYHvgwcA1wA3APYF7gEeFVX0VOS/Bg4g2YxuHsDewPX0qzCLkmSJC0KJuUaRyblw3MVzbzwVwFbA3+g2frs4Kr6Y1e5zwJ7AI8GNqVJ2o8E3lZVv57XiCVJkqQBce9xjSuT8iGpqquAZ/RQ7kDgwMFHJEmSJA2XSbnGkUm5JEmSpJFgUq5xZFIuSZIkaSSYlGscmZRLkiRJGgkm5RpHJuWSxt4Ob/ha39pafcgefWtLkqRx4kJvGlcm5ZIkSZJGgkm5xtGSYQcgSZIkSdK4sqdckiRJ0kiwp1zjyKRckiRJ0kgwKdc4MimXJEmSNBJMyjWOTMolSZIkDZ2rr2tcmZRLkiRJGgkm5RpHJuWSJEmSRoJJucaRSbkkSZKkkWBSrnFkUi5JkiRpJJiUaxwtGXYAkiRptCV5UJL3JflZkmuSXJjkq0lWDDs2SYtHZ6G32TykxcCkXJIkzeQfgecCJwH/D3gPcE/gh0meOMzAJC0uJuUaRw5flyRJM/lP4AVVdWPnRJKPA78E3g4cN6zAJC0uJtoaRyblkiRpWlV1yiTn/phkFfDU+Y9I0mJlUq5xZFIuSZLmajvgj8MOQtLiYVKucWRSLkmSZi3JrsDDgXcPOxZJi4PzxDWuTMolLQg7vOFrfWln9SF79KUdaZwlWQ58Fjgf+Odpyu0D7AOwbNmy+QlO0oJmUq5x5OrrkiSpZ0mW0izstinw5Kq6cqqyVXVoVa2oqhVLly6dtxglLVxLliyZ1aMXSdZP8rYk5ydZk+SnSZ7fa0xJNk7yz0nOaetfnOS4JDvM8WVKf8GeckmS1JMkGwNfBXYEHltVPxtySJLUi48DLwA+CPwUeAZwRJIlVXX4dBWTbAp8B7gH8FHgf4AtgV2ArYDVgwtb48KkXJIkzSjJ+sAXgYcAT6uqk4cckqRFqN/D15M8ENgTOLiqDmrPfQw4CXhnkiOr6qZpmvgX4K+AFVV1Xl+Dk1oOX5ckSdNKchvgCOAxwEuqqj+LPEhSl85Cb7N59OA5QAEf6JyoqqLpNd8WeOQ08WwO7A18tKrOS7Jeko3W6UVKkzAplyRJM3kn8Ezg28CSJHtOeGwy5PgkLRIDSMp3BlZX1aUTzp/WdX0quwIbAWcn+RxwHXBdkrOS7Dbb1yZNxeHrkiRpJg9oj49pHxPdBbh2/sKRtFgNYPX15cBFk5zvnNtumrr3aI//BvwOeCmwPvBG4PgkD62qH/UrUI0vk3JJkjStqlo57BgkjYc5JOVbJzmj6/mhVXVo1/ONgEsmqbem6/pUNu2EBexWVVe3MX4TOA94E82icdI6MSmXJEmSNBLmkJRfVlUrprl+PbDBJOc37Lo+XV2Ar3QScoCq+n2Sk4BHzCpSaQom5ZIkSZKGbhbzxGfjIuDuk5xf3h4vnKZu59rFk1y7mGZrNGmdjfxCb0ken6SSrJm5tCRJC0v7HldJVg47FkkatgEs9HYmcOck20w4/+Cu61PpzBfffpJr2wMTF4+T5mTapDzJR9sPCn9MMtmwj6nqndfW+8q6hyhJUv8k2TLJmq5k+B4z15rTffZLclCS+w+ifUlajAaQlB9NMyf81V33CLAvTW/3Se25jZPslGTrTrmqOocmaX9qd1KfZCeaoevH9+ElSzP2lH+8PW4FPLWXBpM8CrjbhPqSJI2KF/KX8wtfNqD77Ae8FZgpKT+7fVw3oDgkacHod1JeVacDnwUOTPK+JK8Avkaz3dnrq+qmtuguwK+Av5vQxH40889PSXJAkjcCq4ArgYP78ZqlaZPyqjoV+GX79KU9ttkpdzHNL7wkSaPk5e3xv9rjS5LcZljBVNVO7eO0mUtL0uKVhCVLlszq0aOXAocATwc+ANwR2LOqPj1Txar6HrA7zfzyg4F/BE4FHlZVq2f/KqVb62Wht48D7wIem2T7qvrfqQom2Qx4Vvv001V1cx9ilCSpL5LsTNNz/Sfg9cAewF2BJwBfHWJokiQGsk85VXUDzfZlb5qmzCqaYe6TXTsJeGS8CVPuAAAgAElEQVTfA5NavXy99BngprbsS2Yo+1xgk/bnT3ROJtkkydOTfCLJT5JcluSGJBck+WKS3ecSfJJD2vmA35imzIwLxbVzSF6X5OR2/vyNSS5cl9gkSSOp00v++apaQ/Me131+Sklul+QtSX6Y5PJ2XvrqJMcn2TfJ0rbcQUkKuHNb9b+75q9Xe6273WkXekuyYTs//ZQkV7T3/V2ST083X72NrZLslWT9JP/Qvgdfm+TKJN9J8viZXrckzacBzCmXRt6MSXlVXQp0Fmzba4binaHr36+q/+k6/yLgi+31+wEbAX8GtqMZRvLNJG/vPez+SXIv4Oc0owEeTrO1wfU02yR0Ynv3MGKTJPVPkg2BF7RPP911LOBJSZZNU/exwLk0Qxd3ATajea+4M/BY4EPAbm3xa2imcN3SPr+qfd796DXmOwCnA+8GHkrzxfca4E40760/SvKaGZrZlGYho/8A7tnGtXkb73FJBjWnXpJmzaRc46jXiRidBdvunmTSoRtJdgQe1j79xITLl9N8YHkUcLuq2qSqNqbZSuDtwM3Am5I8bjbBr6t2dcXjgbsAJ9Ak5RtW1VKaxe1eT7Pwzn5JXjmfsUmS+u6ZwBbAeVV1CkBV/QY4mWY614smq5TkAcAxNF/a/gJ4IrBxVW1JkyQ/iOaL3avbNt9ZVdsCv2+beG1Vbdv96CXYdp77F4D70CwotCewaVVtQbOg6ldp3sffl+QJ0zT1zzTvt08DNqmqzYCdaOZEBnhvp5dfkobNpFzjqNek/HigM5d8qm/UO+evAY7svlBVR1bVq6vqpKq6vOv8BVV1IGtXLpzp2/5+eyvNB5VvAE+sqlOq6sY2tiuq6h3AK9qyb0ky8vu6S5Km1BmiPnFhn09PuD7R+2hW3j0XeHhVfb2zWm9VXVdVZ1TVAVX17T7H+yzW7qP73Ko6vOs96jc0o7l+2F7/j2na2RjYvaqO6Yr7bOApNL3umwJP6nPskjRrs03ITcq1WPSUZFbVLcCn2qfPSrJp9/X22/xOD8Pnq+qaWcbRWaX9EbOsN2dJbsvaOfLvqKo/T1H0SJoPLdsB952P2CRJ/ZXkrsBKmqHqn5lw+Uiaoeg7JXnYhHr3YO170xur6soBh9rtue3xB1V1q71w28VUO19q3yfJVO9RR0+YUtapfynwg/bp/dY1WEmSNDez6fn9BM2HmU1Y+0Gh4wk0c7A75W4lyfIkb0tyartAzs1dC96c2RZbOjHhH6C/ppkTCPC5JH+Y7AFcAKzflrvzpC1Jkkbdy2iGan9v4hY2VXUV8OWuct06Sfqfga8PMsBJrGiP35qmzIk0sXWXn+iHU5yHZosfaKZsSdLQ2VOucdTLlmhAM1QuySqahWFextp55rD2Q8z/dObpdUvyKOBY1ibB0My9u54m0b8NsHV7fhOaIfCDtl3Xz7fvsc7GgwhEWgx2eMPXZi7Uo9WH7NG3tqR26lFnZNRUe9J+Cng+8Nwk+3WN+OrM/76sqq4dYJiT2aY9XjBVgapak+QyYFlX+YmunuYena1L15t9eJLUfybaGkeznSPdScQf1i7s1lks7UkTrv+fJBsAR9Ak5KcDjwM2q6rNq2pZu+DNyu4qs4xprm7T9fMWVZUeHp+bp9gkSf3zOJr1QwA+lgnbk7Ujtjpba24KPGeSNmqSc/Ol13sPM0ZJ6gt7yjWOZpuUfwH4U/tzZ/uzF9F8w34zt56nB/BIml7pm4AnVdUJk8w572kl2kl0vuHfcJoyU60o+4eun50rLkmL14x7kE/QPYT9ovZ4+ySb9CmeXl3SHu84VYF2m7fbtU8vHXhEkjRgJuUaR7NKyqtqDU2vN8CL2wXeOsn5V6tqsr1XOx8mLqiqSya5DrD7bOLocsWEe0zmwVOcP4tmuzOA583x/pKkEZbk9jSrjEOzmvlm0zx2acs9PMlO7c+dKVm3oVk/ZTY6+5TP9VPjGe3x0dOUWcnaqWinz/E+kjQSkrBkyZJZPaTFYC6/yZ0h6suBA1nby3yroeutzkq12ye51UIySXYAXjWHOAB+0h7vmuT+k7S9HbDXZBWr6gbWzi3cO8kuk5XrastFcCRp4emM5roSOLaqrpnmcTrQWaX8ZQBVdR5wUnvuX5NsPot7X9Uet5hj7J0pUw9N8tiJF9tdRN7SPv15Vf18jveRpJFhT7nG0ayT8qo6E/hx+/TA9ngRU69K+12aLcVuCxyZ5G7QbKOWZA9gFWuHoc/Wd1k7tPCwJA9IY0mS3du2p5tj9xbgfJrV1b+V5O/bOfK0MW6RZI8khzH96reSpNHUGYp+TGeP7xkc1R5f3Ca9AK+leR+7B/D9JI9Psh5Ako2TPDjJh9v3nW6dJPlZSbacQ+xfYO3K6UcmeUHXfe/SXn9oe/31c2hfkkaOSbnG0VzHfHR6xTv1PzXVPt9VdRnwT+3TRwPnJbkKuBb4Ks188NnO9+u0fROwL01Sf2+ardWubtv+Js089tdOU/9SmqHzv6AZuvhe4JIkV7QxXtHG+EJcmVaSFpQkD6F5b4C1yfZMOuWWAXsAVNWPgafS9Lbfh+ZL6GuTXE7zfnMq8EqaReK6HUrzxfDDgEuTXJhkdZLVvQTSvq8+k+Y9ailwOHBNkiuA39AMy78FeG1Vzfd2bZI0ECblGkdzTcoPp+k16Jh0b/KOqnoP8DTgezQfYG5L00P9Hpr9ws+eYxxU1Vdo5tQdR5NEd9p+O838wMtmqH8u8ACaufHHARfTbMt2W5oPPV+gGQL/qLnGKEkais4XvlcCJ/RSoap+BvxqQn2q6gSanvJ/oVmT5HpgI2A1cDxNUv6dCW2dRJPYf6uNYRlw5/bRk6q6gGb/8dfRJP/X02zP+XuaxVUfWFXv67U9SRpls03ITcq1WPS8T3m3qrqC5sPIbOocAxwzxeWLmWIhnKr6xlTXusp8n7ZHYxK91L8J+GT7kCQtAlW1N7D3HOrda4rzlwJvbh+9tvV1pp7e1Skz03vUGuDd7aNnVbVDD2X2Yoq1VyRpGEy0NY7mlJRLkiRJUr+ZlGscmZRLkiRJGgkm5RpHJuWSJEmSRoJJucaRSbkkSZKkoXPxNo0rk3JJkjQwSZ4MPHn58uWsWrVqIPe45pprbHsRtL0QY7bt/luyZK6bQ2muklT7425VtWqe772aZleSl1bVJ/tZf67XhsGkXJIkDUxVHQscu+OOO+69cuXKgdxj1apV2PbCb3shxmzb/bcYe8qTHAS8dZJLN9Bs33wmcBhwVFXVJOU0j9r/XgCfrKrV83FPk3JJkiRJmh8Xd/28FLhD+3gysFeSp1fVDUOJbGH6NbAGuLKP9TpfoKwCVs81sNkwKZckSZI0EhZjT3m3qtq283OSJcA9gXcDjwGeALwd+IfhRLfwVNWj57PeoDhpQ5IkSdLQdRZ6m81jIauqW6rqF8BTgPPa069MYsfpmDEplyRJkjQSlixZMqvHYlBVa4Cj2qebATsBJPlkkmqPSfKKJCcn+WN7fq/udpIsTfKWJGcmuSrJ9UnOTfKhJHftJZYk2yZ5f5LfJlmT5A9JDk+y0zR1dkzyD0m+leTX7X2vSnJWkrcn2brHe2+W5N+SnN22cVmSLyd58DR1Vk/2b9HDvW5Vr/Pv3VXsxLZM57G6LXdI+/wXM9xj8yTX9BLf4vhNXqCS3DXJ59r/sa5PcnqSp01SbvP2f44/tOVOTfKYYcQsSZIkDco49ZRP8L9dP28+4VqAI4GPAg9tn9/yFwWSewM/Bw4GHgCsB9wE3B3YF/hlkmfOEMNdgLOAvwWWtfWXAS8Azkry+CnqHQ/8B/Doto01wKbA/YE3AT9OsuMM994SOB14A7ADcCNwO+CpwClJXjZD/X64kr+c839F+7zzuLQ9/xGggHslecQ07b0A2KRt98jpbmxSPiRJtgd+QDN/5L00c0euB76U5Dld5QIcC7wc+DiwX3vpuCSPmtegJUmSpAEa46R8h66fL59w7RnA04ADgC2raiuaReKOh6aHmSZf2B64ANgD2KSqNqdJjE8FNgAOT/LX08Twbppk+LFt/c2ABwM/AzYEPt/mMBOdCryG5guADatqy7b87sBpNAvZHTHD638rsA3wnPbeS4F7Ad+lyVk/kmTnGdpYJ1X12u45/8AzqmrbrseD2nK/pf23B/aepsnOtc9U1XXT3dukfHjeAGwN/E1V/XNVvR9YSfMN0XuSrNeWewbwSOBVVfWmqvpIW+53wLvmPWpJkiRpAMZtTnlHks2BF7ZPLwfOmVBkU+B1VfWuqroKoKquqaqL2uuvpumhvgl4fFUdV1W3tOV+QpNkr6ZJzP9lmlA2aut/s7M1W1WdRpNcX07Tg/9PEytV1fOq6v1V9euqurE9d2NVfZum9/xiYOcZepWXAs+uqqOq6ua2jV/RLH53Ls0C5W+bpv58+3B7fHaSLSZebL9A6HyJcOhMjbmIwPDsCvyy/R8FaBZ7SHIk8A7gUcC3aL4t+hPN3oWdcmuSfBz41yR3q6pfz2/oWqh2eMPX+tLO6kP26Es7kiRJ3RZLot2LNpl7IPDvwHbt6fd2EuouV9AMmZ7Kc9vj0VX184kXq+rqJP8BfBB4QpKlVTXZVmBHtYnwxPqXJPkw8Mb2Xn873euaUPeaJN+lyWkeAZw8RdHvt0n8xPrXJ3kHTWL7+Glin29fBX4P3BF4EfBfE67v0x5/UFU/m6kxe8qHZwNgsmEMnXMr2uPOwFmdb4y6nNZ1XZIkSVrwFvtCb90Lh9Ek29+iScyh6YSbrCf79E4P9CTtrQ/cr336rWlu/c32uISp84fvTFO/c+12Se4ySRxPSvL5JL9Jcu2E19mZmjvZ0PfZ3Hu62OdVVf0Z+Fj79C+GsCfZBHh++3TGXnKwp3yYzgYenWSrquqeN7Jre7xDe1zO2gS8W2e4ynaTXJMkSZIWlMU0JH0a3QuJ3QBcRrO42uFVdeIUdS6Zpr2tgNu0P18wTbnuheS2maLMdPW7r20D/Bb+b6/1w1ibhALcTPOFQ+eLhKU0c8w36bH9me49Kj4GHAjcN8lDqurU9vzzaIb6/4kZFnjrMCkfng/Q7El4dJJ/pJmn8Tzg6e31jbqON0xSf82EcreSZB/aoRPLli1j1apV6x61FrT97ztxwMXcTPa71K+2B93+YotdkqTFZLEn5RMWEuvVn3ttvsdrU5Wbrv5UXk6TkP+Zppf/M8BvuofgJ/kMsCfNqvG9xNePuAauqi5M8hWaNcD2oVnwDtb2nB820wJvHSblQ1JVJyTZl2b+eKcn/CKa1dU/BFzdnrueZqj7RBt2XZ/qHofSDplYsWJFrVy5ct0D14K2V7/mlL9w5cDaHnT7iy12SZIWk8WelA/A5TQJ8W1o5jdPpfvapVOUmW54+R26fu7uuX9ee/xYVb11irq9fBEx3b27r003amAYPkyTlD83yX7AnWlWrIceh66Dc8qHql1JfRnwkPaxA+1QENauungRkw9RX94eLxxgiJIkSdK8WexzyvutnWv+0/bpo6cpunt7vAU4c4oyu01Tv3Pt8nZLsI5Osn/WZJWSbMraJHU6vdz7lqnu02ednvleviH6FnAesDHNCvqdXvKeFnjr8Dd5yKrq+qr6Yfvo7AsIaxdqOBO4f5KJoxo6v9zz8YspSZIkDdS4bonWB59rj89Kcp+JF9vE+PXt0+OmWb382Ul2nKT+1sAr26efn3C509ZU+58fCGw2VeBdHpFk5ST33hDYv316fFX9qYe21tVV7fFWW51N1G4d11kZ/9U0w/RhFr3kYFI+Utr/CfYBjqmqc9vTR9P8QuzZVW5D4GU0q7KfN++BSpIkSQNgUj4nH6IZbbse8PUkT2gXYCPJfYHjafYxvxF48zTtrAG+kWT3tP+4SR5E01m4Nc302kMm1PlGe9w7yT7tavAk2TbJu2m+DPhjD6/hSuALSZ7V6YxMshPwNWAnmiH6b+mhnX7obCv3wiQb91D+v2nWALsPsCXNAm8Tv7yYlnPKhyTJ9sCXgWNoVhS8B7AvzTyJV3UV/QLNfn4fSnJ3mv3w9qIZ6v6Y+YtYkiRJGiwT7dlr9yF/Ck2CvD1wHLAmyY00q4BDkzTuWVU/maap19Es1vZN4LoktwCbdtV/flWdP6HOu4Bn0STOH6HJWa6iWXE97bkNgZfM8DIOpumNPwq4Icmatg1ohpO/qqrOmKGNfvkw8HDgmcBTklxCs6L8/1bVIyYWrqo/JjmKtZ2oh1XVlOt+Tcae8uG5CjifJgH/MM0chM8Au1RVZ7sz2pULn0TzDczewHtoFnLYY5ptEyRJkqQFx57yuamqnwP3Bg4CfkyTRG4A/Jom17h3VR09QzO/AR5As0vUpcD6NB2GnwUeUFW3Wrm2HU7+MJocZTVNj/bNwCqaJH7fHl/CFcAuND3x57exXw4cCzy8qj7aYzvrrKoOA15E0zF6Hc1aXndm+sXojur6eVZD18Ge8qGpqqtoVurrpeyVNHMUXj3QoCRJkiT1VVUdRJMsz7beXjQjZHstfyVNj/PBs7zPxG83/q599Fr/CuD/tY/Jru/FFK+jqnaYcOqf2kev955Yf52vtdcPo9l/vVedEcyzWuCtw6RckhawHfq5ndshe/StLUmSZiuJK6prwUmyOfDi9umH5tKGv/WSJEmSRsIghq8nWT/J25Kcn2RNkp8mef4cYlsvya+SVJLpFkzTmEiyAfBemrn7v2eWC7x12FMuSZIkaSQMaJ74x4EXAB+k2dP7GcARSZZU1eGzaOd1rN2XW2MsyX7AfsA2wEbt6de1W1zPmj3lkiRJkkZCv3vKkzyQZlXst1XVa9oFw55Is4jXO5Os12Nc29Psuf2vc391WkS2oFn8LTQL6z23h4X0pmRSLkmSJGnoOnPKZ/PowXNottT6QOdEVRVNr/m2wCN7DO/dNMnXEbN7VVqMquqgqkpVbVRVD6iqI9elPYevS5IkSRoJAxi+vjOwuqounXD+tK7r354hpsfQDHlf0e/gJLCnXJIkSdKIGMBCb8uBiyY53zm33QzxrA/8F/CxqjprVi9G6pE95ZIkSZJGwhx6yrdOckbX80Or6tCu5xsBl0xSb03X9ensT7OY15tmG5jUK5NySZI0oySbAgcAuwAPArYGDq6qg4YZl6TFZQ5J+WVVNd2w8uuBDSY5v2HX9aliuSPwZuANVXXZbAOTemVSLkmSerE18FbgAuBM4LHDDUfSYtNZ6K3PLgLuPsn55e3xwmnq/gtwGfD1JDu057Zvj1u05/5QVWtuVVOaBeeUS5KkXlwE3KGqtgdePuxgJC1OA5hTfiZw5yTbTDj/4K7rU7lT+zgX+G37+F57bf/2+UN6fW3SVOwplyRJM6qqG5i+R0mS1tkAVl8/Gng98GrgoPYeAfYFLgZOas9tTJOAX9Y1VP3NNKOEum0DfIRma7SjgJ/3O2CNH5NySZIkSSOh30l5VZ2e5LPAgUm2An5Ks73ZrsBLquqmtuguwInAwbTJe1WdPEl8O7Q//qqqvtzXYDW2TMolSZIkDd2A5pQDvJRmqPmLgVcC5wB7VtXhg7iZNFsm5dII2eENX+tbW6sP2aNvbUnSXCTZB9gHYNmyZUOORtJCMIDh653pN29imm3NqmoVMOPNq2p1L+Wk2XChN0mSNBBVdWhVraiqFUuXLh12OJIkjSR7yiVJkiSNhEH0lEujzp5ySZIkSZKGxJ5ySZIkSSPBnnKNI5NySZLUkyR/B2wBbN6eemSSN7c/f6aqfjecyCQtBklMyjWWTMolSVKvDgDu3PV8t/YBcDJgUi5pnZiUaxyZlEuSpJ5U1Q7DjkHS4mZSrnFkUi5JkiRpJJiUaxyZlEuSJEkaCSblGkduiSZJkiRJ0pDYUy5JkiRp6Fx9XePKpFySJEnSSDAp1zgyKZckSZI0EkzKNY5MyiVJkiSNBJNyjSOTckmSJEkjwaRc48ikXJIkSdLQudCbxpVJuSRJkqSRYFKuceQ+5ZIkSZIkDYk95ZIkSZJGgj3lGkf2lEuSJEmSNCT2lEuSJEkaCfaUaxyZlEuSJEkaCSblGkcm5ZIkSZKGzi3RNK5MyiVJkiSNBJNyjSOTcmmWdnjD1/rSzupD9uhLO5IkSYuFSbnGkUm5JEmSpJFgUq5xZFIuSZIkaSSYlGscuU+5JEmSJElDYk+5JEmSpKFz9XWNK5NySZIkSSPBpFzjyKRckiRJ0kgwKdc4MimXJEmSNBJMyjWOTMolSZIkjQSTco0jk3JJkjQwSZ4MPHnZsmW8613vGsg9tt9+e9teBG0vxJgH3faOO+7IqlWrBtL2NddcM7C258qF3jSuTMolSdLAVNWxwLF3vOMd9z7ggAMGco93vvOd2PbCb3shxjzotk888URWrlw5kLZXrVo1sLYlzY5JuSRJkqSRYE+5xtGSYQcgSZIkSdK4sqdckiRJ0kiwp1zjyJ5ySZIkSZKGxJ5ySZIkSSPBnnKNI5NySZIkSSPBpFzjyOHrkiRJkoaus0/5bB49trt+krclOT/JmiQ/TfL8HuptlWT/JKuSXJzkqiRnJnlVktus8wuWWiblkiRJkhazjwNvBI4BXgNcAByR5IUz1HsYcAhwdXt8PfA74IPAYQOLVmPH4euSJEmSRkK/h68neSCwJ3BwVR3UnvsYcBLwziRHVtVNU1T/BXCPqlrdde7Dbf2XJ/m3qvppXwPWWLKnXJIkSdJIGMDw9ecABXygc6Kqiqa3e1vgkVNVrKrfTkjIO77QHu/V6+uSpmNSPkRJtktyaJLfJLm+PX4kyR27yuyVpKZ4PGKY8UuSJEkjbmdgdVVdOuH8aV3XZ2u79vjHOUcldXH4+pAkWQr8ENgI+BDN/JR7AvsCT0hy76q6uqvK24BzJjRz9nzEKkmSJM2HOQxf3zrJGV3PD62qQ7ueLwcumqRe59x2k1ybUpL1gdcBF9IMgZfWmUn58DwT2B54SlUd2zmZ5Nc0w2t2B77UVf6Eqjp5fkOUJEmS5s8ckvLLqmrFNNc3Ai6Z5Pyaruuz8SGaYetPr6obZllXmpRJ+fBs3h4nfnPXeX7dxApJNgOur6qbBxmYJEmSNN9ms83ZLFwPbDDJ+Q27rvckyVuBlwFvqaov9yE2CXBO+TB9l2bRif9K8rAkd0iyO/BvwKnAtyeUPw64Crg+ybfblSQlSZIkTe0iJh+ivrw9XthLI0leAxwEvL+q3taf0KSGPeVDUlVnJXkVzZ6H3++6dCzwvK7e8OuAzwDfAa4A7gPsD3wvya5V9aN5DHtB2OENX+tbW6sP2aNvbUmSJGl6A+gpPxN4dJJtqqp7GPuDu67PFNNewHuBw4G/73eAkkn5cF0EnAycAJwP7EKzcMSnkzy7GkcCR3bVOSbJUcBPgHcAfzNV40n2AfYBWLZsGatWrRrIixg1+9+3f6P7J/s361f7g2x70O0b+3DaH0bskiTNpwEk5UcDrwdeTdPTTZqb7AtcTLtYW5KNgTvRzFG/rCueZwIfA74G7NVupyb1lUn5kCR5KvB54L5VdW57+pgkvwU+CjwFOGayulV1TpJjgGcm2WCqRSbalScPBVixYkWtXLmyz69iNO3Vz57yF64cWPuDbHvQ7Rv7cNofRuySJM2nfiflVXV6ks8CBybZCvgp8AxgV+AlVXVTW3QX4ETgYNYm7w8CjgCupvlc/rwJ8f20qn7a14A1lkzKh2c/4JddCXnHF2mS8l2ZIilvnU/z328pk68oKUmSJAleCvwWeDHwSppthvesqsNnqHdvYP328dFJrh9Mk+RL68SkfHi2Y+1WDN1uO+E4lbsBNwF/6mdQkiRJ0mLSjip9U/uYqswqIBPOfRL45ABDkwBXXx+ms4F7J3nAhPN7tscfASTZZmLFJDvTDG//dlXdONAoJUmSpHnS2Rat14e0GNhTPjz/Djwe+E6SDwC/p5nLshfwS+CottwpSX4MnAFcTjOMZm/gWppV2CVJkqQFz0Rb48qkfEiq6vtJdgHeSjO/ZVuaueGHAm+uqs7Q9s8CewCPBjb9/+3dfZAsVXnH8e8P9HIREBBFQMjFiopGLRF8KyOoURSDmMIXEhQBRZFQ8bXKlxjRG0hV0ICxSNDyojGiYBRUCC/RqIkoviECQgKlggIqiMSKIHgvCD75o3vDMO7dmVl2t6d3v5+qrp453ef0s3tn7tNnT/fpdp9PAcdW1dVLHrgkSZIkacHYKe9QVV0KHDBin6OBo5cmIkmSJKk7jpRrJbJTLkmSJGkq2CnXSmSnXJIkSdJUsFOulcjZ1yVJ0khJViU5Nsl1STYkuSzJQV3HJUlS3zlSLkmSxvFh4KXA+4HLgBcCpyXZpKpO7TQyScuGI+VaiRwplyRJc0qyJ3AwzZM/XltVJwN/DFwAHJ/kvp0GKGlZmPQZ5XbgtVzYKZckSaMcCBRw0kxBVRXNqPkOwN4dxSVJUu/ZKZckSaPsAVxTVTcNlV84sF2S7jVHyrUSeU+5JEkaZUfghlnKZ8p2WsJYJC1jdrS1EjlSLkmSRtkcuH2W8g0D239HkiOSXJTkottuu23RgpMkqc/slEuSpFHWA5vNUr56YPvvqKp1VfWEqnrCFltssWjBSVo+vHxdK5GdckmSNMoNzH6J+o7t+voljEWSpGXFTrkkSRrlYmBNku2Hyp88sF2SJM2DnXJJkjTKGUCAo2YK0lw3eiRwI/CVjuKStIz4nHKtVM6+LkmS5lRV307yCeDoJA8ALgNeCOwFHFpVv+k0QEmSesxOuSRJGscrgB8BhwCvAb4PHFxVp3YalaRlxdFvrUR2yiVJ0khVdTvwV+0iSZIWiJ1ySZIkSVPBkXKtRHbK1Yld33bugrRzzXH7LUg7kiRJktQFO+WSJEmSpoIj5VqJfCSaJEmSJEkdcaRckiRJ0lRwpFwrkSPlkiRJkiR1xJFySZIkSZ1L4ki5ViRHyiVJkiRJ6oidckmSJEmSOuLl65IkSZKmgiOwz9cAAA+lSURBVJevayVypFySJEmSpI44Ui5JkiRpKjhSrpXIkXJJkiRJkjpip1ySJEmSpI54+bokSZKkqeDl61qJHCmXJEmSJKkjjpRLkiRJmgqOlGslcqRckiRJkqSOOFIuSZIkqXNJHCnXiuRIuSRJkiRJHbFTLkmSJGkqzIyWj7uM2eaqJMcmuS7JhiSXJTlogpiel+RbSdYn+VmSE5NsOe8fUhpip1ySJEnScvZh4O3AWcBrgZ8CpyV52aiKSfYBzgHuAt4AfAQ4AvjMokWrFcd7yiVJkiRNhYW+pzzJnsDBwF9X1dq27EPAV4Djk3yqqn4zRxPvBa4CnllVt7f1rwZOTvL8qjpnQQPWiuRIuSRJkqTl6kCggJNmCqqqgPcDOwB7b6xikkcBjwFOnumQt04BbgX+dDEC1spjp1ySJEnSVFiEe8r3AK6pqpuGyi8c2D5X3cF9AaiqO4BLR9SVxmanXJIkSdJytSNwwyzlM2U7jag7uO9w/bnqSmNLc/WGlrskNwHXLkLTDwT+ZxHaXQrG3o2+xt7XuGFxY19TVQ9apLa1DCTZH9gfeBlw5ZjVJv3Mbg3cPGFoi9G2cd87k7Y7SdzT8ruGlRH3vHJDks+1x5nEamDDwPt1VbVuoM2rgWur6o+GjrUJzeRtH6yqIzcSz9HAMTQ/z3VD204BDqyq1RPGK/0OJ3pbIRbrpDnJRVX1hMVoe7EZezf6Gntf44Z+x67+q6qzgbOTUFVHjFNn0s9sknXjtj2pSdo27ntn0nYniXtaftft/ss+7vmqqn0Xodn1wGazlK8e2D5XXeaoP1ddaWxevi5JkpbC2bZt2x21a9tL3/Y02dhl5jOXpl8/oi5z1J+rrjQ2O+WSJGnRtSPmtm3bS96ubS9921PmYmBNku2Hyp88sH2uugBPHCxMsgrYfURdaWx2ynVvrRu9y9Qy9m70Nfa+xg39jl0rU18/s8a9tIx7afU17jOAAEfNFKSZtv1I4Eaa55WT5H5JHpnk/+9pr6orgSuAVycZvIT9EGBL4PTFD18rgRO9SZIkSVq2kpxG80zxk4DLgBcCzwMOrapT2n2eAfwn8NdVtXag7r7AucA3gY8CuwJvAi4A9ik7U1oAjpRLkiRJWs5eARwHHEDTMd8FOHimQz6XqvoczRMkVgEnAocDHwIOsEOuheJIuSRJkiRJHXGkXBNJsirJsUmuS7IhyWVJDuo6rlGSPDHJiUkuT3JrkuuTnJOkl4+JSrJXkmqXnbuOZ5Qkj05yRpKbkqxP8oMk7+k6rlGS7JRkXZIftnH/MMkHk+zSdWwzkmyZZG2S89rfbyVZu5F975/kH5P8rP15vplknyUOWZpVH/PLcsotfcorfcsp5hJJo/icck3qw8BLgfdz9z05pyXZpKpO7TSyub0V2Itmso8TgW2B1wDfSrJ/VZ3XZXCTSHIfmkuvbgO26Dickdp7tM6jmSjl3cAvgd8Dfr/DsEZKsjXwLWBz4APAtcCjaCaGeV6SR1fVrzoMccYDgXcBP6WZBfY5s+3UTmpzNvAk4L3AdTSX852X5NlVdf7ShCttVB/zy7LILX3KK33LKeYSSWOpKheXsRZgT6CAtQNlAb5K8xzH+3Yd4xyxPxVYNVS2Hc2smxd3Hd+EP8sbgZ8D72v/PXbuOqY5Yt0S+Anwr8CmXcczYeyvbH+/+w+VH9WWH9B1jG08mwE7ta93Hv6ODuz3onbbYQNlq4GrgIu6/jlcVvbS1/yyXHJLX/JKH3OKucTFxWWcxcvXNYkDaf4jPmmmoKqKZlRjB2DvjuIaqaq+XlV3DJX9Avgy8AedBDUPSXYE1gJvpxkdmHYHAQ8B/rKq7kqyRZJNuw5qTPdv1zcMlc+8//USxrJRVXV7VV0/xq4H0nxmPj5QdwPN6OSeSaZylEkrRi/zy3LILT3LK33MKeYSSSPZKdck9gCuqaqbhsovHNjeNzsBv+g6iAkcD/wA+KeuAxnTc4BbgAcluQK4Fbg1yWlJtus2tJHOp+kk/EOSpyZ5SJJnA39L81iUL3Ua3eT2AC6pqjuHyvv8/dXysdzyS59yS5/ySh9zirlE0kh2yjWJHfndv/QyULbTEsZyryXZC/hD4F+6jmUcSZ5OM0rwuqr6bdfxjOnhNHNXnEszcvRC4ATgJcC/TfMIR1VdAvw58EjgazSXTH4B+D7wrFlOSKbdsvr+atlZNp/PPuWWHuaV3uUUc4mkcTjRmyaxOc09Z8M2DGzvhfZyvU/QTFByTMfhjDQwCc+pVfX1ruOZwJbA/YCTq+qotuyzSW6hmaBnP5p7A6fVDcAFwL/TfFaeBLwJOCXJS9rLa/tic+D2Wcp79/3VsrQs8kufcktP80pfc4q5RNKc7JRrEutpJgIZtnpg+9RrZ0I9jya571VVN3cc0jheD6xhI7OhTrGZz8THh8pPpTmBehrTeQJFkj8BPgk8tqp+0BafleRHwMnAC4CzuopvHpbF91fLVu8/nz3MLX3MK73LKeYSSePw8nVN4gZmvyxpx3Y9zgQhnUpyP+AcYDfg+VV1ecchjdSe6L2L5n6/VUl2TbIrsE27y85T/EzZmc/EjUPlM++3XcJYJvUG4IqBk6gZn2nXey1xPPdW77+/WtZ6/fnsW27pcV7pY04xl0gayU65JnExsCbJ9kPlTx7YPrWSrKJJgk8BXlJVF3Qc0ri2BbYCXgf8aGB5fbv9GzSXxU2j77Tr4ZO7mffDkzpNk52A2e5PvM/Qui8uBnZvL1kdNPP9vWSJ45EG9Ta/9DS39DWv9DGnmEskjWSnXJM4g+a5sTP3cZEkwJE0f6X+SkdxjdRO/nIasA9waFWd23FIk/g5cMAsyyfb7a8CjugmtJE+STPr7KuHymfef35pw5nI94BHJ3n8UPnB7fo79MsZNKNgM/GTZDXNM3QvqaqrugpMoqf5pce5pa95pY85xVwiaaS+/XVOHaqqbyf5BHB0kgcAl9HMfLoXzcnIbzoNcG7HAy+imfF0kyQHD23/bFXdtvRhjVZVvwbOHC5Psnv78vNV9ZOljWo8VfXdJOuA17SjSV8A9gQOp/mdn99pgHN7N7Av8B9JTgJ+TDM5z2HAFcDp3YV2T0n+guYkaeZ5uHsneUf7+mNVdS3waZqRrw8keRjNz3MYsCtNh0LqTI/zSy9zS1/zSk9zirlE0kjp14SP6lqSzYB3AocA29M80uO4qjq108BGSPJl4Olz7PLQqrpmaaJZGEnW0twTuMs0njzNaC9xezPNyMsuNPejfQw4pqru6DK2UdoT1HfRnPTtQDO6dDbwjqqammcQJ7mGZsKm2Tyzqr7c7rc1zbNxX0Rz0nU5cHRVTePoklaYPuaX5ZZb+pBX+phTzCWSRrFTLkmSJElSR7ynXJIkSZKkjtgplyRJkiSpI3bKJUmSJEnqiJ1ySZIkSZI6YqdckiRJkqSO2CmXJEmSJKkjdsolSZIkSeqInXJJkiRJkjpyn64DkLRxSQK8GHgpsAewPXAXcCNwA3Ah8FXgS1V1y0C9NwDbAGdW1aWLFNuiH0OStHDMKZI0nVJVXccgaRZJtgHOBJ4+UHwncAtwf+75R7VXVNU/D9S9BlgzXL7A8S36MSRJC8OcIknTy8vXpel1Cs3J013ACcAjgM2qajtgc+BxwFuB73YWoSSpL8wpkjSlvHxdmkJJHg7s3759R1UdN7i9qu4ELmuX9yTZfIlDlCT1hDlFkqabI+XSdNp94PVZo3auqvUASdYmKZpLAAE+kqQGl8F6SXZL8uYkX0xydZL1SW5JckmSv0nywOFjTXqMgXrPSPKJJNcl2ZDk5iQXJnlLki3G+J1IkubHnCJJU8yRcmn67QxcOea+t9JM2PMgmj+63QKsn2P/z3P3iVABNwNb05zA7Q4cluRZVfW9+R4jyX2ADwCvGmpjC+CJ7fLKJM+tqmvH+zElSfNkTpGkKeNIuTSdvk1zQgNwQpJHjFOpqo6vqh2AH7dFr6+qHQaXoSrfBF4LPAxYXVXbAquBZ9PMwvsQ4LR7eYzjaU6ebgSOArarqq1o7mF8JnAJsBvwmST+nyRJC8+cIklTzNnXpSmVZB3w6vZtAZcC3wC+Q3Ny89+1kS/wQsxim2RL4CrgwcBeVXXBpMdI8hiaexTXA0+pqstn2Wcr4Aqa0ZsDqurM+cQrSdo4c4okTS//gihNr6OAY4HbgACPb8s+DFwO/CzJe5M8eDEOXlW3Aue3b582z2YOp4n93NlOntrj/IrmMT0Az53ncSRJczOnSNKU8p5yaUq1s+G+M8kJNLPmPp3mXrlHAauA7YE3Ai9Psl9VXTif4yR5PvDytu0HA/ebZbed59M2d594PS/Jz+bYb8t2vWaOfSRJ82ROkaTpZadcmnJVdTPw8XYhyWqaE5PX0ZxYPRD4dJKHV9WGcdtt77X7OHDQQPGdwP8Cd7Tvt6a5H3C+M9nu1K635O6TpLnMdvImSVog5hRJmj5evi71TFVtqKovVtULgI+2xTsD+07Y1OE0J093AccADwc2q6oHDEyuc0a7b+YZ7qbt+m1VlTGWZ8zzOJKkeTCnSFL37JRL/bZu4PVuE9b9s3b9oap6V1VdVVW/HdpneNbbSc1cXvjYe9mOJGnxmVMkqQN2yqV+u3Xg9e0Dr2dOhOYajdilXV8y28Z2ptwnz1F/nGN8rV3v17YnSZpe5hRJ6oCdcmkKJXnomM+RPXTg9cUDr29p19vMUffmdv24jWw/GthqjvrjHONkmkfvbAP83Rz7keS+nmRJ0sIzp0jSdLNTLk2nRwNXJjk3ySFJdp3Z0J5oPD7JR4A3tcUXAoPPfP2vdv3iJNtu5Bifa9evTnJEklVt+zsk+XvgLcAv5ohx5DGq6lLgfe3bI5OcnmT3JGmPtWmSxyU5Grga2H2O40mS5secIklTLFXVdQyShiR5Lnef4My4g+bSwm255+V9FwP7V9X1A/X3Br7c7ncX8PO2PlW1a7vPNsA3gEe21X5LM1KxdVvvgzSz5B4KfLSqDhuKceQx2v02BY4H3jBQfQPNs3K35p5PgXhaVX0NSdKCMadI0nRzpFyaQlX1eZqZa18PnA5cSXN/3zbAr4EfAJ+imVjniYMnT239rwD7AV+kuaTwwTTPa10zsM8vgafSjDpcQ3MSdCfNSdFBVXXkiBhHHqPd766qeiOwB80kQt9rj7U1zaNyvgasBXb35EmSFp45RZKmmyPlkiRJkiR1xJFySZIkSZI6YqdckiRJkqSO2CmXJEmSJKkjdsolSZIkSeqInXJJkiRJkjpip1ySJEmSpI7YKZckSZIkqSN2yiVJkiRJ6oidckmSJEmSOmKnXJIkSZKkjtgplyRJkiSpI/8HALIeVHzXa4gAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "env = tools.ParkingWorld(num_spaces=10, num_prices=4)\n", "gamma = 0.9\n", "theta = 0.1\n", "V, pi = value_iteration2(env, gamma, theta)\n", "tools.plot(V, pi)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "a946352618aa97fbc96962a39c135080", "grade": false, "grade_id": "cell-6bee5739d8d8ffb4", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "## Section 4: Asynchronous Methods\n", "So far in this assignment we've been working with synchronous algorithms, which update states in systematic sweeps. In contrast, asynchronous algorithms are free to update states in any order. Asynchronous algorithms can offer significant advantages in large MDPs, where even one synchronous sweep over the state space may be prohibitively expensive. One important type of asynchronous value iteration is known as real-time dynamic programming. Like sychronous value iteration, real-time dynamic programming updates a state by doing a local greedification followed by a local evaluation; unlike synchronous value iteration, real-time dynamic programming determines which state to update using the stream of experience generated by its policy. An outline of the algorithm is written below. Complete it by filling in the helper function. Remember that you are free to reuse functions that you have already written!" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "137229f2262baebc95bb69bc7efc148b", "grade": false, "grade_id": "cell-7713cc5a92c248ea", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "def real_time_dynamic_programming(env, gamma, horizon):\n", " V = np.zeros(len(env.S))\n", " pi = np.ones((len(env.S), len(env.A))) / len(env.A)\n", " s = env.random_state()\n", " for t in range(horizon):\n", " real_time_dynamic_programming_helper(env, V, pi, s, gamma)\n", " a = np.random.choice(env.A, p=pi[s])\n", " s = env.step(s, a)\n", " return V, pi" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "deletable": false, "nbgrader": { "checksum": "627d471847b27241a1f5b66b701b1c53", "grade": false, "grade_id": "cell-6e4cd97c16c01c1e", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "# [Graded]\n", "def real_time_dynamic_programming_helper(env, V, pi, s, gamma):\n", " \"\"\"Mutate ``pi`` and ``V`` appropriately.\"\"\"\n", " ### START CODE HERE ###\n", " q_greedify_policy(env, V, pi, s, gamma)\n", " bellman_optimality_update(env, V, s, gamma)\n", " ### END CODE HERE ###" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "5f7a90c3de0d99582546873bd9d67cdd", "grade": false, "grade_id": "cell-743c978fb8c173a8", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "When you are ready to test the real-time dynamic programming algorithm, run the cell below." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "9c979297385bcf9ce4fdfbaf3ea1e45a", "grade": false, "grade_id": "cell-1e094e30adc885a5", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "env = tools.ParkingWorld(num_spaces=10, num_prices=4)\n", "gamma = 0.9\n", "horizon = 500\n", "np.random.seed(101)\n", "V, pi = real_time_dynamic_programming(env, gamma, horizon)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "aec75705d27771e9ffeff3c51846f2bc", "grade": false, "grade_id": "cell-7db6a9982ded6e40", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You can use the ``plot`` function to visualize the final value function and policy." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "4673d5ded4f273d15c37366620b6c33b", "grade": false, "grade_id": "cell-bf8edaf9a039f267", "locked": true, "schema_version": 1, "solution": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tools.plot(V, pi)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "15822b15b22c9c530798a4ab561c7739", "grade": false, "grade_id": "cell-9be12918d67720d8", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "You can check your value function (rounded to one decimal place) and policy against the answer below:
\n", "State $\\quad\\quad$ Value $\\quad\\quad$ Action
\n", "0 $\\quad\\quad\\quad\\;$ 79.7 $\\quad\\quad\\;$ 0
\n", "1 $\\quad\\quad\\quad\\;$ 81.3 $\\quad\\quad\\;$ 0
\n", "2 $\\quad\\quad\\quad\\;$ 83.2 $\\quad\\quad\\;$ 0
\n", "3 $\\quad\\quad\\quad\\;$ 84.7 $\\quad\\quad\\;$ 0
\n", "4 $\\quad\\quad\\quad\\;$ 86.5 $\\quad\\quad\\;$ 0
\n", "5 $\\quad\\quad\\quad\\;$ 87.4 $\\quad\\quad\\;$ 0
\n", "6 $\\quad\\quad\\quad\\;$ 89.8 $\\quad\\quad\\;$ 0
\n", "7 $\\quad\\quad\\quad\\;$ 91.3 $\\quad\\quad\\;$ 0
\n", "8 $\\quad\\quad\\quad\\;$ 91.9 $\\quad\\quad\\;$ 0
\n", "9 $\\quad\\quad\\quad\\;$ 93.0 $\\quad\\quad\\;$ 3
\n", "10 $\\quad\\quad\\;\\;\\,\\,$ 87.6 $\\quad\\quad\\;$ 3
\n", "\n", "Notice that these values differ from those of the synchronous methods we ran to convergence, indicating that the real-time dynamic programming algorithm needs more than 500 steps to converge. One takeaway from this result is that, while asychronous methods scale better to larger MDPs, they are not always the right choice — in small MDPs in which all states are visited frequently, such as the Gridworld City parking MDP, synchronous methods may offer better performance." ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "58adf9da7fb4a9543b0790162648eb7f", "grade": false, "grade_id": "cell-e02c91090dc88cfb", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "The cell below will check that your code passes the test case above. (Your code passed if the cell runs without error.) Your solution will also be checked against hidden test cases for your final grade. (So don't hard code parameters into your solution.)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "2549d8bea6de373349fd36d057303260", "grade": true, "grade_id": "cell-37df874cf4ed9492", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "## Test Code for real_time_dynamic_programming_helper() ## \n", "with open('section4', 'rb') as handle:\n", " V_correct, pi_correct = pickle.load(handle)\n", "np.testing.assert_array_almost_equal(V, V_correct)\n", "np.testing.assert_array_almost_equal(pi, pi_correct)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "checksum": "71b40821df7749eb1fecf4f83af1388c", "grade": false, "grade_id": "cell-6025f917f706302b", "locked": true, "schema_version": 1, "solution": false } }, "source": [ "## Wrapping Up\n", "Congratulations, you've completed assignment 2! In this assignment, we investigated policy evaluation and policy improvement, policy iteration and value iteration, Bellman operators, and synchronous methods and asynchronous methods. Gridworld City thanks you for your service!" ] } ], "metadata": { "coursera": { "course_slug": "fundamentals-of-reinforcement-learning", "graded_item_id": "1NtiD", "launcher_item_id": "5z8bz" }, "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": 1 }