Skip to content

Instantly share code, notes, and snippets.

@vfdev-5
Last active November 6, 2019 09:09
Show Gist options
  • Select an option

  • Save vfdev-5/f88007b0d0f7ef68a84c269f74f18ca9 to your computer and use it in GitHub Desktop.

Select an option

Save vfdev-5/f88007b0d0f7ef68a84c269f74f18ca9 to your computer and use it in GitHub Desktop.
racetrack example from from *Reinforcement learning - An introduction* book, chapter 5, Exercice 5.8
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Racetrack example\n",
"from *Reinforcement learning - An introduction* book, chapter 5, Exercice 5.8"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Racetrack**. Consider driving a race car around a turn like those shown in Figure 5.6. You want to go as fast as possible, but not so fast as to run off the track. In our simplified racetrack, the car is at one of a discrete set\n",
"of grid positions, the cells in the diagram. The velocity is also discrete, a number of grid cells moved horizontally and vertically per time step. The actions are increments to the velocity components. Each may be changed by +1, −1, or 0 in one step, for a total of nine actions. Both velocity components are restricted to be nonnegative and less than 5, and they cannot both be zero except at the starting line. Each episode begins in one of the randomly selected start states with both velocity components zero and ends when the car crosses the finish line. The rewards are −1 for each step\n",
"until the car crosses the finish line. If the car hits the track boundary, it is moved back to a random position on the starting line, both velocity components are reduced to zero, and the episode continues. Before updating the car’s location at each time step, check to see if the projected path of the car intersects the track boundary. If it intersects the finish line, the episode ends; if it intersects anywhere else, the car is considered to have hit the track boundary and is sent back to the starting line. To make the task more challenging, with probability 0.1 at each time step the velocity increments are both zero, independently of the intended increments. Apply a Monte Carlo control method to this task to compute the optimal policy from each starting state. Exhibit several trajectories following the optimal policy (but turn the noise off for these trajectories).\n",
"\n",
"- States : position (x,y) on the grid and velocity (vx, vy)\n",
"- Actions : vx, vy velocity increments (+1,-1,0) "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"import logging\n",
"logging.getLogger().setLevel(logging.DEBUG)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First we define a race track similar as in the exercise"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"TRACK_WIDTH = 25\n",
"TRACK_HEIGTH = 60\n",
"\n",
"TRACK = {}\n",
"TRACK['grid'] = np.ones((TRACK_HEIGTH, TRACK_WIDTH))\n",
"\n",
"# Starting line:\n",
"TRACK['starting_line'] = ((0, 7), (0,15))\n",
"sl = TRACK['starting_line']\n",
"TRACK['grid'][TRACK_HEIGTH - 1 - sl[0][0], sl[0][1]:sl[1][1]] = 0.5\n",
"\n",
"# Finish line:\n",
"TRACK['finish_line'] = ((TRACK_HEIGTH, TRACK_WIDTH-1), (TRACK_HEIGTH-10, TRACK_WIDTH-1))\n",
"fl = TRACK['finish_line']\n",
"TRACK['grid'][TRACK_HEIGTH - fl[0][0]:TRACK_HEIGTH - fl[1][0], fl[0][1]] = 0.5\n",
"\n",
"# Off-track:\n",
"for i in range(TRACK_WIDTH):\n",
" for j in range(TRACK_HEIGTH):\n",
" if i + j < 7:\n",
" TRACK['grid'][j, i] = 0.0\n",
" elif i >= 15 and j >= 10:\n",
" TRACK['grid'][j, i] = 0.0\n",
" elif i <= 7 and j >= TRACK_HEIGTH/2.2 and i + 0.2*(TRACK_HEIGTH-j) <= 7:\n",
" TRACK['grid'][j, i] = 0.0"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f45e5f32dd0>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n1l8LnAbc0e1zSTpSV3vYiNgCDAMXAo9HxCmth/Zn5sHMPBAR1wMbI+IxYBS4FrjNM8TS/HV7SHw5\nzWvRf+1YfinwudafR4DDwFZgObANuGLuI0qa0O112BkPoTPz18B7WjdJPeR7iaVCDFYqxGClQgxW\nKsRgpUIMVirEYKVCDFYqxGClQgxWKsRgpUIMVirEYKVCDFYqxGClQgxWKsRgpUIMVirEYKVCDFYq\nxGClQgxWKsRgpUIMVirEYKVCDFYqxGClQgxWKsRgpUIMVirEYKVCDFYqxGClQgxWKsRgpUIMVirE\nYKVCDFYqxGClQgxWKsRgpUIMVirEYKVCDFYqxGClQgxWKsRgpUIMVirEYKVCDFYqxGClQgxWKuSY\nfg8wYf369UTEpI+Nj48v8jTSYHIPKxVisFIhBisVYrBSIQYrFWKwUiEGKxUyMNdhATKz3yNIA809\nrFSIwUqFGKxUiMFKhRisVIjBSoV0FWxEXB4Rd0fE/tbt9oj4g7bHl0fE5ojYFxGjEbE1Ilb3fmxp\naep2D/sQ8D5gfev2beArEfHi1uPXABcAFwHnAqcCN857yGXLpr1JS0VXb5zIzH/pWPSBiPgz4FUR\n8TBwGXBxZt4CEBGXAvdFxFmZuaMnE0tL2Jx3TxGxLCIuBoaAO2j2uMcAN0+sk5n3Aw8CZ89zTknM\n4a2JEfE7NIEeD4wCb83MH0XEy4AnM/NAx5fsBdbMe1JJc3ov8Y+AlwIn0rxW/VxEnDvN+gH4JmFp\nGmNjY7Nar+tgM/Mp4Getu3dFxFnAlcANwHERsbJjL7uaZi8raQpDQ0OMjo7OuF4vTrEuA5YDO4Gn\ngA0TD0TEWuA0mkNoSfPU1R42Iv4K+DrN5Z0VwDuB84Dfz8wDEXE9sDEiHqN5fXstcJtniKXe6PaQ\n+BTgc8BvAvuB/6CJ9dutx0eAw8BWmr3uNuCK+Q7p52SlRvQ7hohYR3M4PWf9/m9Yiqbb5r6ZpXsr\nVqyYeA27PjPvmmo9t6xUiMFKhRisVIjBSoUYrFSIwUqFGKxUiMFKhRisVIjBSoUYrFSIwUqFGKxU\niMFKhRisVIjBSoUYrFSIwUqFGKxUiMFKhRisVIjBSoUYrFSIwUqFGKxUiMFKhRisVIjBSoUYrFRI\n17+BfRBN99vSxsfHF3ESaWG5h5UKMVipEIOVCjFYqRCDlQoxWKmQo+KyTmb2ewRpUbiHlQoxWKkQ\n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\nGKxUiMFKhfwvCTC910AsExwAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f45e7f7df90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(14,6))\n",
"plt.imshow(TRACK['grid'], cmap='gray', interpolation='None')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Below we define useful functions to work with states and actions and some helper functions.\n",
"In the episode generating method `race`, we do not implement finish and off-track checks by the intersection, we simply check if final state is at the finish or off-track. This leads in some cases to non-finishing and fly-over boundaries trajectories."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def position_in_interval(x,y,(x1,y1,x2,y2)):\n",
" v1 = (x - x1, y - y1)\n",
" v2 = (x2 - x, y2 - y)\n",
" v3 = (x2 - x1, y2 - y1)\n",
" n1 = np.linalg.norm(v1)\n",
" n2 = np.linalg.norm(v2)\n",
" c = np.dot(v1, v2) if n1 > 0 and n2 > 0 else 1.0\n",
" n3 = np.linalg.norm(v3)\n",
" return n1 + n2 == n3 and c >= 0\n",
"\n",
"def get_actions(state, track):\n",
" \"\"\"\n",
" Method to get all available actions for the current state\n",
" :state: (x, y, vx, vy)\n",
" :return: list of actions, e.g. [[dvx, dvy], ...]\n",
" \"\"\" \n",
" x,y,vx,vy = state\n",
" actions = []\n",
" for dvx in range(-1,2):\n",
" for dvy in range(-1,2):\n",
" nvx = vx + dvx; nvy = vy + dvy\n",
" if 0 < nvx < 5 and 0 < nvy < 5:\n",
" actions.append([dvx, dvy])\n",
" elif 0 < nvx < 5 and 0 == nvy or 0 < nvy < 5 and 0 == nvx:\n",
" actions.append([dvx, dvy])\n",
" elif 0 == nvx and 0 == nvy:\n",
" if track['grid'][TRACK_HEIGTH-1-y, x] == 0.5:\n",
" actions.append([dvx, dvy])\n",
" assert len(actions) > 0, \"No actions found for the state : {}\".format(state)\n",
" return actions\n",
"\n",
"def take_action(state, action):\n",
" x, y, vx, vy = state\n",
" nx = x + vx\n",
" ny = y + vy\n",
" nvx = vx + action[0]\n",
" nvy = vy + action[1]\n",
" return (nx, ny, nvx, nvy)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def get_initial_state(track, alpha):\n",
" [y1, x1], [y2, x2] = track['starting_line']\n",
" v = (x2 - x1, y2 - y1)\n",
" return (int(x1 + v[0] * alpha), int(y1 + v[1] * alpha), 0, 0)\n",
"\n",
"def at_start(x, y, track):\n",
" sl = track['starting_line']\n",
" return position_in_interval(x,y,(sl[0][1], sl[0][0], sl[1][1], sl[1][0]))\n",
"\n",
"def at_finish(x, y, track):\n",
" fl = track['finish_line']\n",
" return position_in_interval(x,y,(fl[0][1], fl[0][0], fl[1][1], fl[1][0]))\n",
"\n",
"def distance_to_finish(x, y, track):\n",
" fl = track['finish_line']\n",
" finish_point = (int(fl[1][1] + 0.5*(fl[0][1]-fl[1][1])), int(fl[1][0] + 0.5*(fl[0][0]-fl[1][0])))\n",
" return np.abs(finish_point[0] - x) + np.abs(finish_point[1] - y)\n",
"\n",
"def is_off_track(x, y, track):\n",
" return x < 0 or y < 0 or x >= TRACK_WIDTH or y >= TRACK_HEIGTH or track['grid'][TRACK_HEIGTH-1-y, x] < 0.5\n",
" \n",
"\n",
"MIN_REWARD = -(TRACK_HEIGTH + TRACK_WIDTH) \n",
"CRASH_REWARD = MIN_REWARD*0.15\n",
"REACHED_FINISH_REWARD = 100\n",
" \n",
"def race(policy_func, track, initial_state=None):\n",
" \n",
" logging.debug(\"-- Race is called : initial_state={}\".format(initial_state))\n",
" \n",
" if initial_state is None:\n",
" initial_state = get_initial_state(track, alpha=np.random.rand())\n",
" \n",
" # define a function when car is at finish\n",
" fl = track['finish_line']\n",
"\n",
" trajectory = []\n",
" reward = 0\n",
" state = initial_state\n",
" reached_finish = False\n",
" while reward > MIN_REWARD and not reached_finish:\n",
"\n",
" action = policy_func(state)\n",
" trajectory.append((state, action))\n",
" \n",
" logging.debug(\"--- Race loop : state={}, action={}, reward={}, len(trajectory)={}\".format(state, action, reward, len(trajectory)))\n",
" \n",
" state = take_action(state, action)\n",
" logging.debug(\"--- Race loop 2 : new state={}\".format(state))\n",
" x, y, vx, vy = state\n",
" if is_off_track(x, y, track):\n",
" logging.debug(\"--- Race loop 3 : out of track\")\n",
" reward = CRASH_REWARD\n",
" break\n",
"\n",
" reward -= 1\n",
" reached_finish = at_finish(state[0], state[1], track)\n",
" \n",
" if reached_finish:\n",
" reward += REACHED_FINISH_REWARD\n",
" \n",
" return reward, trajectory, reached_finish"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from operator import itemgetter\n",
"\n",
"def find_best_trajectory(initial_state, q_state_action, track):\n",
" state = initial_state\n",
" reward = 0\n",
" reached_finish = False\n",
" trajectory = []\n",
" while not reached_finish or is_off_track(state[0], state[1], track):\n",
" actions_values = q_state_action[state]\n",
" action = actions_values[0][0]\n",
" state = take_action(state, action)\n",
" reward -= 1\n",
" reached_finish = at_finish(state[0], state[1], track)\n",
" trajectory.append(state)\n",
" \n",
" return trajectory, reward, reached_finish\n",
"\n",
"def draw_trajectory(trajectory, track, fig=None):\n",
" if fig is None:\n",
" plt.figure(figsize=(12,4))\n",
" plt.imshow(track['grid'], cmap='gray', interpolation='None')\n",
" xs = []\n",
" ys = []\n",
" us = []\n",
" vs = []\n",
" for state, action in trajectory:\n",
" xs.append(state[0])\n",
" ys.append(TRACK_HEIGTH - 1 - state[1])\n",
" us.append(state[2])\n",
" vs.append(state[3])\n",
" plt.quiver(xs, ys, us, vs)\n",
" \n",
" \n",
"def draw_q_state_action(q_state_action, track):\n",
" plt.figure(figsize=(12,6))\n",
" plt.imshow(track['grid'], cmap='gray', interpolation='None')\n",
" xs = []; ys = []; us1 = []; vs1 = []; us2 = []; vs2 = []\n",
" for state in q_state_action:\n",
" xs.append(state[0])\n",
" ys.append(TRACK_HEIGTH - 1 - state[1])\n",
" us1.append(state[2])\n",
" vs1.append(state[3])\n",
" plt.quiver(xs, ys, us1, vs1) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We also define a behavior policy that selects the best action for a known state, otherwise it picks a random action such that: \n",
"- car keeps moving\n",
"- distance to finish decrease\n",
"- car does not go off the track"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def random_behavior_policy(state, track):\n",
" index = 0\n",
" actions = get_actions(state, track)\n",
" count = len(actions)\n",
" prev_dist = distance_to_finish(state[0], state[1], track)\n",
" while count > 0:\n",
" index = np.random.randint(len(actions))\n",
" action = actions[index]\n",
" x,y,vx,vy = take_action(state, action)\n",
" nx, ny = x + vx + action[0], y + vy + action[1]\n",
" new_dist = distance_to_finish(nx, ny, track)\n",
" if vx > 0 or vy > 0 and new_dist < prev_dist and not is_off_track(nx, ny, track):\n",
" break\n",
" count -= 1\n",
" return actions[index]\n",
"\n",
"def behavior_policy(state, track, q_state_action):\n",
" if state in q_state_action:\n",
" actions_values = q_state_action[state]\n",
" return actions_values[0][0]\n",
" else:\n",
" return random_behavior_policy(state, track)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we define some policy parameters and now we can start racing and policy learning"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we implement *Monte Carlo Exploring Starts* method\n",
"\n",
"```\n",
"Initialize, for all s ∈ S, a ∈ A(s):\n",
" Q(s, a) ← arbitrary\n",
" π(s) ← arbitrary\n",
" Returns(s, a) ← empty list\n",
" \n",
"Repeat forever:\n",
" Choose S_0 ∈ S and A_0 ∈ A(S_0) s.t. all pairs have probability > 0\n",
" Generate an episode starting from S_0 , A_0 , following π\n",
" For each pair s, a appearing in the episode:\n",
" G ← return following the first occurrence of s, a\n",
" Append G to Returns(s, a)\n",
" Q(s, a) ← average(Returns(s, a))\n",
" For each s in the episode:\n",
" π(s) ← argmax_a Q(s, a)\n",
"```\n",
"\n",
"*Note on the implementation*\n",
"- The initialization part is done in the `behavior_policy` if the input state is not known.\n"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [],
"source": [
"from collections import defaultdict\n",
"\n",
"def monte_carlo_es(n_episodes=1000, track=TRACK, q_state_action=None):\n",
" \n",
" q_state_action = {} if q_state_action is None else q_state_action\n",
" \n",
" finished_race_count = 0\n",
" best_reward = MIN_REWARD\n",
" policy_func = lambda state: behavior_policy(state, track, q_state_action)\n",
" \n",
" for episode in range(n_episodes):\n",
" if episode % 1000 == 0:\n",
" logging.info(\"Episode : %i\" % episode)\n",
" \n",
" # Policy evaluation:\n",
" logging.debug(\"- Policy evaluation\")\n",
" initial_state = get_initial_state(track, alpha=np.random.rand())\n",
" reward, trajectory, reached_finish = race(policy_func, track, initial_state)\n",
"\n",
" if reached_finish:\n",
" finished_race_count += 1\n",
" if best_reward < reward:\n",
" best_reward = reward\n",
"# logging.info(\"Reward: {} | start_state={}, last_state={}\".format(reward, trajectory[0][0], trajectory[-1][0]))\n",
"# draw_trajectory(trajectory, track)\n",
" \n",
" # Policy improvement:\n",
" logging.debug(\"- Policy improvement\")\n",
" first_occurence = defaultdict(list)\n",
" for (state, action) in trajectory:\n",
" if not action in first_occurence[state]:\n",
" first_occurence[state].append(action)\n",
" if state in q_state_action:\n",
" actions_values = q_state_action[state]\n",
" for action_value in actions_values:\n",
" if action_value[0] == action:\n",
" action_value[1] += reward\n",
" q_state_action[state] = sorted(actions_values, key=itemgetter(1), reverse=True)\n",
" else:\n",
" # Generate arbitrary state action values:\n",
" actions = get_actions(state, track)\n",
" actions_values = []\n",
" for a in actions:\n",
" if a == action:\n",
" actions_values.append([a, reward])\n",
" elif at_start(state[0], state[1], track) and a == [0, 0]:\n",
" actions_values.append([a, MIN_REWARD*10])\n",
" else:\n",
" actions_values.append([a, np.random.randint(MIN_REWARD*0.75, MIN_REWARD*0.55)])\n",
"\n",
" actions_values = sorted(actions_values, key=itemgetter(1), reverse=True)\n",
" q_state_action[state] = actions_values \n",
"\n",
" logging.info(\"Finished racing: {} / {}, best reward: {}\".format(finished_race_count, n_episodes, best_reward))\n",
" return q_state_action, finished_race_count, best_reward"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"MIN_REWARD = -(TRACK_HEIGTH + TRACK_WIDTH) \n",
"CRASH_REWARD = MIN_REWARD*0.65\n",
"REACHED_FINISH_REWARD = 30\n",
"\n",
"q_state_action = {}"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:root:Episode : 0\n",
"INFO:root:Episode : 1000\n",
"INFO:root:Episode : 2000\n",
"INFO:root:Episode : 3000\n",
"INFO:root:Episode : 4000\n",
"INFO:root:Episode : 5000\n",
"INFO:root:Episode : 6000\n",
"INFO:root:Episode : 7000\n",
"INFO:root:Episode : 8000\n",
"INFO:root:Episode : 9000\n",
"INFO:root:Finished racing: 4559 / 10000, best reward: 9\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f45e5c67250>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"logging.getLogger().setLevel(logging.INFO) \n",
"q_state_action, finished_race_count, best_reward = monte_carlo_es(10000, q_state_action=q_state_action)\n",
"draw_q_state_action(q_state_action, TRACK)"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nOefK01weTFpni3PuCudcB+dca+fc6c65lbmXDin45T5r1izfZQAFRdb49+ijj2rEiBG+ywAKjrzx\na8SIEXrsscd8lwEUHFnj10cffaTf/va3vstABvJ2OlQU38yZMzVkyBA1b97cdykAYmzp0qW69NJL\nyRoABbV8+XJdfPHFZA2AgnLO6fzzz9e6det8l4IM0LhopDZs2KCf/OQnqqmp4Rc8gIKpra3V2Wef\nrXXr1pE1AAomkUjovPPO05o1a9SsWTPf5QCIsX/+858aPXo0n2saGRoXjdSnn36qM844Q/vss492\n3XVX3+UAiKl33nlHnTp1UqtWrfgFD6Bgli9frs6dO6tNmzbaaaedfJcDIKYWLVqkX/ziF5LE55pG\nhkM2N1K77babXn31VV188cW65JJLfJcDIKY6d+4s55x+/vOf6/TTT/ddDoCY2muvvbR161YNGjSI\nzzUACqZly5Y69dRT9frrr6tVq1a+y0EGaFw0UuvWrdPzzz+vO++8U+3atfNdDoCY2rRpk5599llN\nmzZNBx98sO9yAMRUdXW1Ro0apcrKSu2///6+ywEQU506ddKECRN0//3366ijjvJdDjJA46KRqqys\n1EEHHaT99tvPdykAYmzs2LHq1KmTunbt6rsUADE2adIktWjRQkcccYTvUgDE2PTp07VlyxYdc8wx\nqqjgT+HGhGNcNFI777yzrr32Wt9lAIi51q1b6/rrr5eZ+S4FQIw1b95cN910k8rK+GgKoHAqKio0\nZMgQmhaNEM9YI9W/f3/fJQAoAccdd5zvEgCUgF69eqlXr16+ywAQc0cccQQzuxop2toAAAAAACCy\naFwAAAAAAIDIonEBAAAAAAAii8YFAAAAAACILBoXAAAAAAAgsmhcAAAAAACAyKJxAQAAAAAAIovG\nBQAAAAAAiCwaFwAAAAAAILJoXAAAAAAAgMiicdFIzZw5U5s2bfJdBoCYW7lypWpqanyXASDmVq5c\nqQ0bNvguAwAQUTQuGqknnnhCEyZM8F0GgJh7+umnNX36dN9lAIi5yspKjR8/3ncZAGJu3bp1Wrt2\nre8ykAUaF41UZWWlKisrfZcBIObIGgDFUFVVRdYAKLjnn39ezz//vO8ykIUK3wUgc4sXL9bixYu1\nYcMGOedkZr5LAhBDGzZs0Pjx4/XOO+/ojjvu8F0OgJjavHmzxo0bpzZt2iiRSKisjO/VABRGVVWV\n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\nEffhhx/qgw8+8F0GgJjbsmWLVq9e7bsMADFXXV2t5cuX+y4DANDI0LiIuKqqKlVVVfkuA0DMTZo0\nSaNHj/ZdBoCYe/nllzVy5EjfZQCIuS1btmj27IzO94CIo3ERcZWVlaqsrPRdBoCYI2sAFENlZSVf\nyAAouEmTJumJJ57wXQbyqMJ3Aajfpk2b9OKLL8o5p40bN6ply5a+SwIQQ845VVZW6pNPPtHWrVvV\ntGlT3yUBiKnKykotWbJE69evV5s2bXyXAyCmKisrNX78eN1xxx2+S0GeMOMiwiZMmKBNmzZp8+bN\nmjBhgu9yAMTU/PnztXTpUn366aeaPHmy73IAxNTixYv11ltvqbq6WuPGjfNdDoCYcs6pqqpKCxcu\n1Ntvv+27HOQJMy4irEmTJjr99NPlnOMbUAAF88Ybb6hXr17atGmT3nnnHd/lAIipRYsW6cQTT9TH\nH3+sNWvW+C4HQEwtWLBA7733nqRg5sVVV13luSLkA42LCDv++OM1btw4JRIJHX/88b7LARBTZ5xx\nht58802tWLFCF198se9yAMTU97//fb355puaN2+eLrroIt/lAIipzZs36+c//7nmzZunAw44wHc5\nyBN2FQEAAAAAxEKPHj203377qU2bNurfv7/vcpAnNC4AAAAAAEBkmXPOdw3bMLNukjI66W7U7kM+\nrV69WpLUvn37rG5f32NTVlZSPavuzrk5votA9GSaN3HOmk8++US1tbXq0KFDVrcnaySRNagHWfOF\ntWvXauvWrdp1112zuj1ZI4msQT3Imi+sX79emzZtUseOHbO6PVkjKWJZwzEuIi7bhgUAZOIrX/mK\n7xIAlIB27dr5LgFACWjTpg2nXI6ZkmoZAQAAAACAxoXGBQAAAAAAiCwaFwAAAAAAILJoXESccy7W\nB84BAAAAAGB7aFxE3IIFCzR//nzfZQCIuRUrVmjBggW+ywAQc2vWrNErr7ziuwwAMeec09q1a32X\ngTyicRFxlZWVqqys9F0GgJgbPXq0nn32Wd9lAIi5sWPHatSoUb7LABBzixYt0iOPPOK7DOQRjYuI\no3EBoBjIGgDFUFlZqaqqKt9lAIg5PtfET4XvAvKhrCx9/yWRSBS5kvxauXLl59MpP/roI3Xs2NFz\nRUBpi2vWbN68WS+88II2bdqklStXatddd/VdElDS4po11dXVGjt2rNauXat3331XX/va13yXBJS0\n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\n3aBBg2xaSJIkSZJ6xMaFJEmSJEkqrQF5qEhHR0eX6z3LraR6MmskNYNZI6kZzBoVyRkXkiRJkiSp\ntGxcSJIkSZKk0rJxIUmSJEmSSsvGhSRJkiRJKi0bF5IkSZIkqbRa+qoinvm2uebMmcO4cePYeuut\niy5FaiqzRlIzmDWSmsGsURm1dONCzbFgwQLOO+88li1bxm9/+9uiy5EkSZIktRAbF+qzF198ka9/\n/et873vfY8OGDTzwwANFlyRJkiRJajGe40J9Nn/+fK644grWrVvHRz/6Ufbff/+iS5IkSZIktRgb\nF+qTlBI//vGPGTFiBG9+85s5//zziy5JkiRJktSCPFREvZZS4uyzz+amm25ixowZDB48mLFjxxZd\nliRJkiSpBbVE48Iz3zZPddNit912K7okqWnMGknNYNZIagazRv2Jh4qox2xaSJIkSZKazcaFemz9\n+vWklGxaSJIkSZKapiUOFVFzbLHFFvzwhz8sugxJkiRJ0gDijAtJkiRJklRa/WrGhSeQkdQMZo2k\nZjBrJDWDWaNW4IwLSZIkSZJUWjYuJEmSJElSadm4kCRJkiRJpWXjQpIkSZIklZaNC0mSJEmSVFql\nbVzMnj2bjo6OjZaI6HKRpFpU541ZI6kRzBpJzWDWqBWVtnGhYqxatYqf/OQnRZchSZIkSRJg40IV\nFi5cyNve9jbWr19fdCmSJEmSJAE2LpS74447OOyww7j//vt55zvfWXQ5kiRJkiQBNi4EPPLII3z4\nwx/m+eef57DDDmPs2LFFlyRJkiRJEgBDii5Axdt7773Zfvvt2WqrrTjttNOKLkeSJEmSpFeVtnHh\n2W6b56KLLmL58uXcdddd/OUvfym6HKnpzBtJzWDWSGoGs0atqLSNCzXHI488wvnnn8/06dMZOXIk\nI0eOLLokSZIkSZJe5TkuBrhzzjmHz3zmMxx++OFFlyJJkiRJ0ms442KAu+yyyxgzZkzRZUiSJEmS\n1CUbFwPc+PHjiy5BkiRJkqRueaiIJEmSJEkqLRsXkiRJkiSptGxcSJIkSZKk0rJxIUmSJEmSSqvm\nxkVEHB0R10XEMxHRERGndrHNBRGxOCJWR8TNEbFXrfuVNLCYNZKawayR1AxmjdQ79ZhxMQK4Dzgb\nSNU3RsTngc8AnwTeAqwCboqILeqwb0kDh1kjqRnMGknNYNZIvVDz5VBTSlOAKQAREV1sci7w1ZRS\n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\nZd5y3wAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f45e52304d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(14,10))\n",
"n_figs = 8\n",
"for i in range(0, n_figs):\n",
" alpha = i*1.0 / n_figs\n",
" state = get_initial_state(TRACK, alpha)\n",
" policy_func = lambda state: behavior_policy(state, TRACK, q_state_action)\n",
" \n",
" reward, best_trajectory, reached_finish = race(policy_func, TRACK, state)\n",
" plt.subplot(2, n_figs/2, i+1)\n",
" plt.title(\"Initial state: {}\\n Reward: {}\".format(state, reward))\n",
" draw_trajectory(best_trajectory, TRACK, fig) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we implements *on-policy first-visit Monte Carlo* method\n",
"\n",
"```\n",
"Initialize, for all s ∈ S, a ∈ A(s):\n",
" Q(s, a) ← arbitrary\n",
" Returns(s, a) ← empty list\n",
" π(a|s) ← an arbitrary ε-soft policy\n",
"\n",
"Repeat forever:\n",
" (a) Generate an episode using π\n",
" (b) For each pair s, a appearing in the episode:\n",
" G ← return following the first occurrence of s, a\n",
" Append G to Returns(s, a)\n",
" Q(s, a) ← average(Returns(s, a))\n",
" (c) For each s in the episode:\n",
" A^∗ ← arg max a Q(s, a)\n",
" For all a ∈ A(s):\n",
" π(a|s) = {\u001a 1 − ε + ε/|A(s)|, if a = A^∗,\n",
" { ε/|A(s)|, if a != A^∗\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# def epsilon_soft_policy(state, track, pi_state_action, epsilon):\n",
"# actions = get_actions(state, track)\n",
" \n",
"# for \n",
" \n",
"# if state in q_state_action:\n",
"# actions_values = q_state_action[state]\n",
"# action_star = actions_values[0][0]\n",
"# actions = get_actions(state, track)\n",
"# for action in actions:\n",
" \n",
"# return \n",
"# else:\n",
"# return random_behavior_policy(state, track)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# def monte_carlo_on_policy(n_episodes=1000, track=TRACK, q_state_action=None, epsilon=0.1):\n",
" \n",
"# q_state_action = {} if q_state_action is None else q_state_action\n",
" \n",
"# finished_race_count = 0\n",
"# best_reward = MIN_REWARD\n",
"# policy_func = lambda state, track: epsilon_soft_policy(state, track, q_state_action, epsilon)\n",
" \n",
"# for episode in range(n_episodes):\n",
"# if episode % 1000 == 0:\n",
"# logging.info(\"Episode : %i\" % episode)\n",
" \n",
"# # Policy evaluation:\n",
"# logging.debug(\"- Policy evaluation\")\n",
"# initial_state = get_initial_state(track, alpha=np.random.rand())\n",
"# reward, trajectory, reached_finish = race(policy_func, track, initial_state)\n",
"\n",
"# if reached_finish:\n",
"# finished_race_count += 1\n",
"# if best_reward < reward:\n",
"# best_reward = reward\n",
"# # logging.info(\"Reward: {} | start_state={}, last_state={}\".format(reward, trajectory[0][0], trajectory[-1][0]))\n",
"# # draw_trajectory(trajectory, track)\n",
" \n",
"# # Policy improvement:\n",
"# logging.debug(\"- Policy improvement\")\n",
"# first_occurence = defaultdict(list)\n",
"# for (state, action) in trajectory:\n",
"# actions_values = q_state_action[state]\n",
"# for action_value in actions_values:\n",
"# if action_value[0] == action:\n",
"# if not action in first_occurence[state]:\n",
"# first_occurence[state].append(action)\n",
"# action_value[1] += reward\n",
"# q_state_action[state] = sorted(actions_values, key=itemgetter(1), reverse=True)\n",
"\n",
"# logging.info(\"Finished racing: {} / {}, best reward: {}\".format(finished_race_count, n_episodes, best_reward))\n",
"# return q_state_action, finished_race_count, best_reward"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def get_line_coeff(x1, y1, x2, y2):\n",
" s = x2 - x1 \n",
" c = y1 - y2 \n",
" d = x1 * y2 - y1 * x2\n",
" return (c, s, d)\n",
"\n",
"\n",
"def position_on_line(x,y,line_coeff):\n",
" assert len(line_coeff) == 3, \"Line coefficients are (cos, sin, dist)\"\n",
" return np.dot((x, y, 1), line_coeff) == 0"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment