{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Dynamic programming" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The goal of this exercise is to find the optimal policy for the recycling robot.\n", " \n", "In this problem, a recycling robot has to search for empty cans to collect (each can defines a \"reward\" given to the robot). It can also decide to stay where it is to save its battery and wait that somebody brings it a can (which gives less cans in average than actively searching for them). \n", "\n", "The robot has two battery levels, *high* and *low*. \n", "\n", "* In the *high* level, the robot can either search or wait. \n", "\n", "* In the *low* state, three actions are possible: search, wait and recharge. \n", "\n", "State-action transitions are probabilistic, i.e. they bring the robot in different states based on different probabilities $\\alpha$ and $\\beta$.\n", "\n", "This problem defines a finite MDP, with two states *high* and *low* corresponding to the battery level. The actions *search* and *wait* are possible in the *high* and *low* states, while the action *recharge* is only possible in the *low* state.\n", "\n", "\n", "\\begin{aligned}\n", " \\mathcal{S} &=& \\{ \\text{high}, \\text{low} \\} \\\\\n", " \\mathcal{A}(\\text{high} ) &=& \\{ \\text{search}, \\text{wait} \\} \\\\\n", " \\mathcal{A}(\\text{low} ) &=& \\{ \\text{search}, \\text{wait}, \\text{recharge} \\}\n", "\\end{aligned}\n", "\n", "\n", "The action *search* brings on average a reward of $\\mathcal{R}^\\text{search}$, the action *wait* a reward of $\\mathcal{R}^\\text{wait}$, the action *recharge* brings no reward, but allows to get in the *high* state.\n", "\n", "Note that if the robot decides to search in the *low* state, there is a probability $1 - \\beta$ that it totally empties its battery, requiring human intervention. This is punished with a negative reward of -3.\n", "\n", "The transition and reward probabilities of each transition is defined in the following table, completely defining a MDP.\n", "\n", "| s | s' | a | p(s' / s, a) | r(s, a, s') |\n", "|:-------------:|:-------------:|:------------:|:-----------------:|:-----------------------------:|\n", "| high | high | search | $\\alpha$ | $\\mathcal{R}^\\text{search}$ |\n", "| high | low | search | $1 - \\alpha$ | $\\mathcal{R}^\\text{search}$ |\n", "| low | high | search | $1 - \\beta$ | $-3$ |\n", "| low | low | search | $\\beta$ | $\\mathcal{R}^\\text{search}$ |\n", "| high | high | wait | $1$ | $\\mathcal{R}^\\text{wait}$ |\n", "| high | low | wait | $0$ | $\\mathcal{R}^\\text{wait}$ |\n", "| low | high | wait | $0$ | $\\mathcal{R}^\\text{wait}$ |\n", "| low | low | wait | $1$ | $\\mathcal{R}^\\text{wait}$ |\n", "| low | high | recharge | $1$ | $0$ |\n", "| low | low | recharge | $0$ | $0$ |\n", "\n", "The goal of this exercise is to find the optimal policy $\\pi^*$ of the robot, i.e to find for each state the action that should be performed systematically in order to gather the maximum of reward on the long term. \n", "\n", "We will apply here two **dynamic programming** methods, policy iteration and value iteration, to solve the Bellman equations.\n", "\n", "The Bellman equation for the state function is:\n", "\n", "$$V^{\\pi} (s) = \\sum_{a \\in \\mathcal{A}(s)} \\pi(s, a) \\, \\sum_{s' \\in \\mathcal{S}} p(s' | s, a) \\, [ r(s, a, s') + \\gamma \\, V^{\\pi} (s') ]$$\n", "\n", "**Q:** On paper, adapt the Bellman equation to the problem. First, for every state $s$ and possible action $a$, find the optimal value of the action with the form:\n", "\n", "$$Q^{\\pi} (s, a) = f( V^\\pi (\\text{high}), V^\\pi (\\text{low}), \\alpha, \\beta, \\gamma, \\mathcal{R}^{\\text{search}}, \\mathcal{R}^{\\text{wait}} )$$\n", "\n", "Deduce the Bellman equation for the two states $V^\\pi (\\text{high})$ and $V^\\pi (\\text{low})$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**A:**\n", "\n", "$$Q^\\pi(\\text{high}, \\text{search}) = \\alpha \\, (\\mathcal{R }^\\text{search} + \\gamma \\, V^\\pi(\\text{high} )) + (1- \\alpha)\\, (\\mathcal{R}^\\text{search} + \\gamma \\, V^\\pi(\\text{low}))$$\n", "\n", "$$Q^\\pi(\\text{high}, \\text{wait}) = \\mathcal{R}^\\text{wait} + \\gamma \\, V^\\pi(\\text{high})$$\n", "\n", "$$Q^\\pi(\\text{low}, \\text{search}) = \\beta * (\\mathcal{R }^\\text{search} + \\gamma \\, V^\\pi(\\text{low})) + (1- \\beta) \\, (-3 + \\gamma \\, V^\\pi(\\text{high}))$$\n", "\n", "$$Q^\\pi(\\text{low}, \\text{wait}) = \\mathcal{R}^\\text{wait} + \\gamma \\, V^\\pi(\\text{low})$$\n", "\n", "$$Q^\\pi(\\text{low}, \\text{recharge}) = \\gamma \\, V^\\pi(\\text{high})$$\n", "\n", "$$V^\\pi(\\text{high}) = \\pi(\\text{high}, \\text{search}) \\, Q^\\pi(\\text{high}, \\text{search}) + \\pi(\\text{high}, \\text{wait}) \\, Q^\\pi(\\text{high}, \\text{wait})$$\n", "\n", "$$V^\\pi(\\text{low}) = \\pi(\\text{low}, \\text{search}) \\, Q^\\pi(\\text{low}, \\text{search}) + \\pi(\\text{low}, \\text{wait}) \\, Q^\\pi(\\text{low}, \\text{wait}) + \\pi(\\text{low}, \\text{recharge}) \\, Q^\\pi(\\text{low}, \\text{recharge})$$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Policy Iteration\n", "\n", "Now that we have the Bellman equations for the two states high and low, we can solve them using **iterative policy evaluation** for a fixed policy $\\pi$. \n", "\n", "### Iterative policy evaluation\n", "\n", "Let's start by setting the parameters of the MDP. In the rest of the exercise, you will modify these parameters to investigate how it changes the optimal policy." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Transition probabilities\n", "alpha = 0.3\n", "beta = 0.2\n", "\n", "# Discount parameter\n", "gamma = 0.7\n", "\n", "# Expected rewards\n", "r_search = 6.0\n", "r_wait = 2.0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are many ways to represent states and actions in a MDP. The suggestion for this exercise is to use dictionaries here the keys are the actions' name and the vaues are indices:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "nb_states = 2\n", "nb_actions = 3\n", "\n", "s = {'high': 0, 'low': 1}\n", "a = {'search': 0, 'wait': 1, 'recharge': 2}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using dictionaries, you can access numpy arrays with s['high'] or a['recharge'] instead of 0 and 2, what will make the code readable.\n", "\n", "The next step is to initialize numpy arrays where we will store the V and Q values. V will have only two elements for high and low, while Q will be a 2x3 matrix with one element for each state-action pair. Notice that (high, recharge) is not a possible action, so this element will not be be updated." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "V = np.zeros(nb_states)\n", "Q = np.zeros((nb_states, nb_actions))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can then access the individual values with V[s['high']] or Q[s['low'], a['wait']].\n", "\n", "We can now evaluate a policy $\\pi$. In dynamic programming, the policies are deterministic, as we want to estimate the optimal policy.\n", "\n", "To implement the policy, we just need to assign the index of an action to each state, i.e. $\\pi(s)$. The following cell creates an initial policy $\\pi$ where the agent **searches** in both states high and low. We here make sure that the array contains integers (0, 1 or 2), but that is not even necessary." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "pi = np.array([a['search'], a['search']], dtype=int)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Q:** Evaluate this policy using iterative policy evaluation.\n", "\n", "We would normally only need to update the V-value of the two states using:\n", "\n", "$$\n", " V (s) \\leftarrow \\sum_{a \\in \\mathcal{A}(s)} \\pi(s, a) \\, \\sum_{s' \\in \\mathcal{S}} p(s' | s, a) \\, [ r(s, a, s') + \\gamma \\, V (s') ] \\quad \\forall s \\in \\mathcal{S}\n", "$$\n", "\n", "The code will be more readable if you first update the Q-values of the 5 state-action pairs:\n", "\n", "$$\n", " Q (s, a) \\leftarrow \\sum_{s' \\in \\mathcal{S}} p(s' | s, a) \\, [ r(s, a, s') + \\gamma \\, V (s') ] \\quad \\forall s \\in \\mathcal{S}\n", "$$\n", "\n", "and only then update the two V-values:\n", "\n", "$$\n", " V (s) \\leftarrow \\sum_{a \\in \\mathcal{A}(s)} \\pi(s, a) \\, Q(s, a)\n", "$$\n", "\n", "These updates should normally be applied until the V-values converge. For simplicity, we could decide to simply apply 50 updates or so, and hope that it is enough.\n", "\n", "Record the V-value of the two states after each update and plot them. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[11.28888873 9.90222206 0. ]\n", " [ 5.9555554 6.16888873 7.90222206]]\n" ] }, { "data": { "image/png": "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/kHb+Xw+vfTSSzp27JjGjh3LvYM2mz59uqZOnarLLrus2XbuIZzO1q1blZubq/z8fH3961/Xjh07JJm9d2JDenaHOnTokHw+n3r06NFse48ePVRcXGyoKjhR4/3S0r20e/duEyUhQlmWpZkzZ+riiy/W0KFDJXH/4PTWr1+vsWPHqqamRl26dNFrr72mwYMHB748cO+gNS+99JI++eQTrVq16qR9/P5Ba8aMGaM//OEPOuecc3TgwAE98sgjGjdunDZu3Gj03iHYtMLlcjVbtyzrpG1AW3Av4XS+//3va926dfrggw9O2sf9g1MZMGCA1q5dq7KyMr3yyiuaNm2ali5dGtjPvYNTKSoq0j333KN33nlHCQkJpzyOewgtmTx5cmB52LBhGjt2rM466ywtXLhQF154oSQz9w6PorWgW7duiomJOal1pqSk5KT0CbSmcYQQ7iW05u6779Ybb7yh9957T7169Qps5/7B6cTHx+vss8/W6NGjVVhYqBEjRugXv/gF9w5Oa82aNSopKdGoUaMUGxur2NhYLV26VE8//bRiY2MD9wn3ENoiOTlZw4YN09atW43+/iHYtCA+Pl6jRo3S4sWLm21fvHixxo0bZ6gqOFF+fr6ys7Ob3Uu1tbVaunQp9xJkWZa+//3v69VXX9W//vUv5efnN9vP/YP2sixLXq+Xewendemll2r9+vVau3ZtYBo9erS++c1vau3aterXrx/3ENrM6/Xq888/V05OjtHfPzyKdgozZ87UTTfdpNGjR2vs2LGaP3++9uzZozvvvNN0aYgwR48e1bZt2wLrO3fu1Nq1a5WRkaHevXtrxowZmjt3rvr376/+/ftr7ty5SkpK0o033miwakSC6dOn64UXXtDrr7+ulJSUwP+7lZaWpsTExMA7Jbh/0JL7779fkydPVl5eniorK/XSSy9pyZIlevvtt7l3cFopKSmB/nyNkpOTlZmZGdjOPYRT+dGPfqQrr7xSvXv3VklJiR555BFVVFRo2rRpZn//hHTMNYf71a9+ZfXp08eKj4+3zjvvvMAQrEBT7733niXppGnatGmWZdnDHj744INWdna25fF4rAkTJljr1683WzQiQkv3jSRrwYIFgWO4f3Aq3/72twP/RnXv3t269NJLrXfeeSewn3sH7dV0uGfL4h7Cqd1www1WTk6OFRcXZ+Xm5lrXXnuttXHjxsB+U/eOy7IsK7TRCQAAAABCiz42AAAAAByPYAMAAADA8Qg2AAAAAByPYAMAAADA8Qg2AAAAAByPYAMAAADA8Qg2AAAAAByPYAMAAADA8Qg2AAAAAByPYAMAAADA8Qg2AAAAABzv/wNdBS7hqvoFeQAAAABJRU5ErkJggg==", "text/plain": [ "