{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Function Approximation (1) \n",
"## Tile Coding in the Mountain Car problem\n",
"\n",
"In this notebook we will show benefits of FA in the Mountain Car problem\n",
"\n",
"The Goal of Mountain Car problem is to reach the top of a hill when the obvious solution of accelerating does not work when starting form the bottom of the valley.\n",
"\n",
"https://gym.openai.com/envs/MountainCar-v0/"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[2018-04-12 18:01:49,008] Making new env: MountainCar-v0\n"
]
}
],
"source": [
"import gym\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"env = gym.make(\"MountainCar-v0\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From the previous notebook, we can obtain the action and state space"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Actions : Discrete(3)\n",
"Variables: Box(2,)\n",
"Max. var: [ 0.6 0.07]\n",
"Min. var: [-1.2 -0.07]\n"
]
}
],
"source": [
"print('Actions : ',env.action_space)\n",
"print('Variables: ',env.observation_space)\n",
"print('Max. var: ',env.observation_space.high)\n",
"print('Min. var: ',env.observation_space.low)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Variables correspond to position in x axis and speed. Actions correspond to forward and backward acceleration respectively.\n",
"\n",
"Let's see performance of random behaviour"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"observation = env.reset()\n",
"for _ in range(300):\n",
" env.render()\n",
" action = env.action_space.sample() # this takes random actions\n",
" observation, reward, done, info = env.step(action)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"For this problem we will define Tile Coding. The following Class define a TileCoding. Each variable will be discretized using *numTilings* grids, each one with *tilesPerTiling x tilesPerTiling* dimension. Tiles are overlaping in the usual way:\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"class Tilecoder:\n",
"\n",
" def __init__(self, numTilings, tilesPerTiling):\n",
" # Set max value for normalization of inputs\n",
" self.maxNormal = 1\n",
" self.maxVal = env.observation_space.high\n",
" self.minVal = env.observation_space.low\n",
" self.numTilings = numTilings\n",
" self.tilesPerTiling = tilesPerTiling\n",
" self.dim = len(self.maxVal)\n",
" self.numTiles = (self.tilesPerTiling**self.dim) * self.numTilings\n",
" self.actions = env.action_space.n\n",
" self.n = self.numTiles * self.actions\n",
" self.tileSize = np.divide(np.ones(self.dim)*self.maxNormal, self.tilesPerTiling-1)\n",
"\n",
" def getFeatures(self, variables):\n",
" # Ensures range is always between 0 and self.maxValue\n",
" values = np.zeros(self.dim)\n",
" for i in range(len(env.observation_space.shape)+1):\n",
" values[i] = self.maxNormal * ((variables[i] - self.minVal[i])/(self.maxVal[i]-self.minVal[i]))\n",
" tileIndices = np.zeros(self.numTilings)\n",
" matrix = np.zeros([self.numTilings,self.dim])\n",
" for i in range(self.numTilings):\n",
" for i2 in range(self.dim):\n",
" matrix[i,i2] = int(values[i2] / self.tileSize[i2] + i / self.numTilings)\n",
" for i in range(1,self.dim):\n",
" matrix[:,i] *= self.tilesPerTiling**i\n",
" for i in range(self.numTilings):\n",
" tileIndices[i] = (i * (self.tilesPerTiling**self.dim) + sum(matrix[i,:])) \n",
" return tileIndices\n",
"\n",
" def oneHotVector(self, features, action):\n",
" oneHot = np.zeros(self.n)\n",
" for i in features:\n",
" index = int(i + (self.numTiles*action))\n",
" oneHot[index] = 1\n",
" return oneHot\n",
"\n",
" def getVal(self, theta, features, action):\n",
" val = 0 \n",
" for i in features:\n",
" index = int(i + (self.numTiles*action))\n",
" val += theta[index]\n",
" return val\n",
"\n",
" def getQ(self, features, theta):\n",
" Q = np.zeros(self.actions)\n",
" for i in range(self.actions):\n",
" Q[i] = tile.getVal(theta, features, i)\n",
" return Q\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Q-learning with TileCoding\n",
"\n",
"Let's start defining one function to implement epsilon-greedy procedure and another one to sum long-term reward of the current episode form position *t*"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def e_greedy_policy(Qs):\n",
" return env.action_space.sample() if (np.random.random() <= epsilon) else np.argmax(Q)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Definition of funtion to collect scores of an episode whith completely greedy policy. Just to compare scores"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def rollout(niter):\n",
" G = 0\n",
" for i in range(niter):\n",
" state = env.reset()\n",
" for _ in range(1000):\n",
" F = tile.getFeatures(state)\n",
" Q = tile.getQ(F, theta) \n",
" action = np.argmax(Q)\n",
" state, reward, done, info = env.step(action)\n",
" G += reward\n",
" if done: break\n",
" return G/niter\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, we define a TileCoder of 7x14 and apply Q-learning procedure"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average reward = -193.345\n",
"Average reward = -160.68\n",
"Average reward = -142.11\n",
"Average reward = -129.25\n",
"Average reward = -125.67\n",
"Average reward = -131.57\n",
"Average reward = -128.69\n",
"Average reward = -122.05\n",
"Average reward = -123.705\n",
"Average reward = -125.395\n",
"Average reward = -123.175\n",
"Average reward = -122.74\n",
"Average reward = -127.015\n",
"Average reward = -122.975\n",
"Average reward = -120.465\n"
]
}
],
"source": [
"tile = Tilecoder(7,14) # Definition of tiles (7x (14x14)) \n",
"theta = np.random.uniform(-0.001, 0, size=(tile.n)) # Parameters for FA (7x (14x14)) = 1.372 parameters\n",
"\n",
"# Parameters of learning\n",
"alpha = 0.05\n",
"gamma = 1\n",
"numEpisodes = 3000\n",
"epsilon = 0.05\n",
"\n",
"# Variables to collect scores\n",
"rewardTracker = []\n",
"rewardTracker2 = []\n",
"episodeSum = 0\n",
"counter = 0 \n",
"\n",
"for episodeNum in range(1,numEpisodes+1):\n",
" G = 0\n",
" state = env.reset()\n",
" while True:\n",
" F = tile.getFeatures(state) # Vector of 1.372 representing state \n",
" Q = tile.getQ(F, theta) # Q-values for given state all actions\n",
" action = e_greedy_policy(Q) # select action with epsilon-greedy procedure\n",
" Qs = Q[action]\n",
" state2, reward, done, info = env.step(action)\n",
" G += reward\n",
" if done == True:\n",
" theta += np.multiply((alpha*(reward - Qs)), tile.oneHotVector(F,action))\n",
" episodeSum += G\n",
" rewardTracker.append(G) # Store reward collected\n",
" rewardTracker2.append(rollout(1)) # Store reward collected TESTING with epsilon = 0\n",
" if episodeNum %200 == 0:\n",
" print('Average reward = {}'.format(episodeSum / 200))\n",
" episodeSum = 0\n",
" break\n",
" Q = tile.getQ(tile.getFeatures(state2), theta)\n",
" theta += np.multiply((alpha*(reward - Qs+gamma*np.max(Q))), tile.oneHotVector(F,action))\n",
" state = state2\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's see behaviour learnt "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"state = env.reset()\n",
"for _ in range(200):\n",
" env.render()\n",
" F = tile.getFeatures(state)\n",
" Q = tile.getQ(F, theta) \n",
" action = np.argmax(Q)\n",
" state, reward, done, info = env.step(action)\n",
" if done: break"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"