Skip to content

Instantly share code, notes, and snippets.

@iwishiwasaneagle
Last active November 5, 2021 10:29
Show Gist options
  • Save iwishiwasaneagle/7997a931a2c0c31f029a3a660e7bad6a to your computer and use it in GitHub Desktop.
Save iwishiwasaneagle/7997a931a2c0c31f029a3a660e7bad6a to your computer and use it in GitHub Desktop.
Figuring out what the heck Q-Learning is via OpenAI Gym
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "85916225",
"metadata": {},
"source": [
"# Q-Learning Playground\n",
"\n",
"This notebook is for me to try out Q-learning.\n",
"\n",
"Resources used:\n",
" - https://www.learndatasci.com/tutorials/reinforcement-q-learning-scratch-python-openai-gym/\n",
" - https://deeplizard.com/"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a59e0119",
"metadata": {},
"outputs": [],
"source": [
"!pip install cmake 'gym[atari]' scipy numpy matplotlib"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "933420e7",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy.ndimage.filters import uniform_filter1d\n",
"from IPython.display import clear_output\n",
"import matplotlib.pyplot as plt\n",
"import gym\n",
"import time"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "4314d6b7",
"metadata": {},
"outputs": [],
"source": [
"# Make OpenAI Gym env\n",
"env = gym.make('Taxi-v3')"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "2c1699bf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Episode: 100000 (100.00%) | Average epochs (last 100): 30.13\n",
"Training finished.\n",
"Best run (reward): 15 | Best run (epochs): 6\n",
"\n",
"CPU times: user 1min 27s, sys: 5.54 s, total: 1min 32s\n",
"Wall time: 1min 27s\n"
]
}
],
"source": [
"%%time\n",
"# Train\n",
"\n",
"# initialize q-table as all zeros\n",
"q_table = np.zeros((env.observation_space.n,env.action_space.n))\n",
"\n",
"# hyperparameters\n",
"alpha = 0.1\n",
"gamma = 0.6\n",
"epsilon = 0.5 # 0.1 works well\n",
"n = int(1e5)\n",
"\n",
"all_epochs = []\n",
"all_rewards = []\n",
"all_q_tables = []\n",
"for i in range(1,n+1):\n",
" state = env.reset() # create a new env\n",
" \n",
" epochs, rewards = 0, 0\n",
" \n",
" done = False\n",
" while not done:\n",
" # epsilon-greedy algorithm\n",
" if np.random.uniform(0,1) < epsilon:\n",
" action = env.action_space.sample() # Explore action space\n",
" else:\n",
" action = np.argmax(q_table[state]) # Exploit learned values\n",
" \n",
" # move state accoridng to action\n",
" next_state, reward, done, info = env.step(action)\n",
" \n",
" # bellman optimality equation\n",
" new_value = (1 - alpha) * q_table[state, action] + alpha * (reward + gamma * np.max(q_table[next_state]))\n",
" \n",
" # update q-table\n",
" q_table[state, action] = new_value\n",
" \n",
" # update variables\n",
" state = next_state\n",
" epochs += 1\n",
" rewards += reward\n",
" \n",
" # store data\n",
" all_rewards.append(rewards)\n",
" all_epochs.append(epochs)\n",
" all_q_tables.append(np.copy(q_table))\n",
" \n",
" # print progress\n",
" if i % 100 == 0:\n",
" clear_output(wait=True)\n",
" print(f\"Episode: {i} ({100*i/n:.2f}%) | Average epochs (last 100): {np.mean(all_epochs[:-99]):.2f}\")\n",
" \n",
"print(\"Training finished.\")\n",
"print(f\"Best run (reward): {max(all_rewards)} | Best run (epochs): {min(all_epochs)}\\n\")"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "fe6a02d4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAasAAAEkCAYAAACR9x5gAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABMk0lEQVR4nO3dd3hUVfrA8e87k0aHSKRD6L0JiqjYQEXXta0NXde6rm11f1Zc66KubS2L6NrrInZXBClSpAjSe2+hJwQCSSCkzMz5/TF3wmQyk0xCpmXez/PMk5lz79x7Zu7kvveUe44YY1BKKaWimS3SGVBKKaUqo8FKKaVU1NNgpZRSKuppsFJKKRX1EiKdAaWUOl5Lliw5MSEh4X2gF3oRHutcwGqHw3HbgAED9nkSNVgppWJeQkLC+82bN++elpZ20GazaRfnGOZyuSQ7O7tHZmbm+8AlnnS9AlFK1Qa90tLS8jRQxT6bzWbS0tJycZeSj6VHKD9KKVWTbBqoag/rWJaJTxqslFKqBojIgEsvvbS953VJSQlNmjTpe84553SqzvZeeumltDFjxpxQczmMbdpmpZRSNaBOnTquDRs21Dl8+LDUr1/ffP/99w2bNWtWUt3tPfzww9k1mb+aVlJSQmJiYtj2pyUrpZSqIcOGDcv9+uuvGwOMGzcu9Q9/+EOOZ1lWVpZ92LBhHbt06dKjb9++3RYsWFDH6XTSqlWr3vv377d71mvXrl2vnTt3Jtx///0tn3zyyWYAp5xyStc777yzVe/evbunp6f3mjx5cn2A/Px820UXXdShY8eOPc8777yOffr06TZ79uy6vvl68MEHW/Tq1at7586de44YMaKdy+Vi2bJlKb179+7uWWfDhg1JXbp06QEwZ86cuieffHLXnj17dj/jjDM6b9++PdGTj1tuuaVNr169uj/77LPNPv/880Z9+vTp1r179x6nnXZal507dyYA7NmzJ+G0007r3KlTp57XXHNNu5YtW/beu3dvAsBbb72V2rt37+7dunXrcd1117VzOBxBfbdaslJK1S7/u7sN+9aWO2EflxN7FHDZmzsrW+2GG27Ieeqpp1pcc801h9atW1f31ltvPTBv3rz6AA8//HDLvn37FkybNm3L+PHjG9x4443t169fv/b8888/NHbs2Mb33XffgRkzZtRr1apVcZs2bcqdwR0Oh6xatWrdl19+2WjUqFEthw8fvvHll19Oa9y4sXPLli1rFi1alDJ48OCe/vL10EMP7fvXv/61F+Cyyy5r/8UXXzS67rrrcktKSmT9+vVJ3bp1K/70009TL7vssoNFRUVy7733tp04ceLmli1bOt57770mDz74YKuvv/46A6C4uFhWr169DiA7O9t+7bXXrrfZbLz66qtNR40a1fy9997bNXLkyJZnnXVW/vPPP5/5zTffNPzqq6+aAixdujTlm2++SV28ePH65ORk88c//rHt22+/fcI999xzoLLvVktWSilVQwYNGnR0165dye+9917qsGHDcr2XLVy4sMGtt956AOCSSy7JP3ToUEJOTo7tuuuuy/nmm29SAcaOHVumNObtqquuOghw2mmnHdm1a1cSwLx58+qPGDEiB+Dkk08u7NKlS4G/906aNKlBnz59unXp0qXHvHnzGqxevboOwGWXXZbz6aefpgJ8//33TW644YaclStXJm/atKnOueee26Vbt249Xn755RZ79uwpre/z7A9g27ZtSUOGDOncpUuXHqNHj26+fv36OtZnrX/jjTfmAFx55ZV5DRs2dAJMnjy5werVq+v27du3e7du3XrMnTu34datW5OD+W61ZKWUql2CKAGF0vDhww899dRTbaZOnbph3759lZ5jhw4deuTWW29N3rNnT8LkyZMbP/fcc3v8rZeSkmIAEhIScDqdEmx+CgoK5IEHHmi3YMGCtZ06dSq5//77WxYWFtoAbrjhhoNXXXVVh2uvvfagiNC7d++ihQsX1unUqdPR5cuXr/e3vQYNGrg8z++555629913X+b111+fO2HChAajRo1qWVFejDFy1VVXHXjzzTd3B5t/Dy1ZKaVUDbrzzjv3P/jgg3tOOeWUo97pgwYNyv/oo49OAJgwYUKDJk2aOFJTU102m40LL7zw0F133dWmU6dOR5s3b+4Mdl+DBw8+/MUXXzQBWLJkScrGjRvr+K5TUFBgA2jevLkjNzfX9uOPPzbxLOvZs2eRzWbjySefbHn55ZfnAPTp06cwJycnYdq0afUAioqKZPHixSn+9p+fn29v27ZtCcDHH39c2nPx5JNPPvzZZ5+lAnz33XcN8/Ly7ADDhw/PmzBhQpPdu3cngLsdb+PGjUnBfFYtWSmlVA3q2LFjyeOPP77PN/3FF1/cc/3116d36dKlR506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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot epochs over iterations\n",
"fig=plt.figure()\n",
"ax = fig.add_subplot(1,1,1)\n",
"\n",
"y = all_epochs\n",
"y_moving_average = uniform_filter1d(y, size=100)\n",
"\n",
"x = np.arange(len(y))\n",
"\n",
"ax.plot(x,y)\n",
"ax.plot(x,y_moving_average, label='Moving average')\n",
"ax.set_xlabel('Iteration')\n",
"ax.set_ylabel('Epochs')\n",
"ax.set_title('Total epochs vs iteration')\n",
"fig.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "5244df2c",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAbMAAAEkCAYAAACljt98AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABE/ElEQVR4nO3deXwU5f3A8c93NzdngHAEAuEKEE4hnIKAcqOCKLeKV6kH1WrVYr2oR4vVaotiVay1WhWPeiDiha0K5SeXCgKiREUuOeQMR67d5/fHzIZNspvdzbW7yff9eu0ru888M/PszGa+8zzzzDNijEEppZSKZo5wF0AppZSqKA1mSimlop4GM6WUUlFPg5lSSqmoFxPuAiilVHVYv35905iYmKeBbuiJfDRzA5sKCwuv6tOnz35PogYzpVStEBMT83Tz5s27pKSkHHY4HNqNO0q53W45cOBA5t69e58Gzvek69mJUqq26JaSknJMA1l0czgcJiUl5ShWDft0epjKo5RS1c2hgaxmsPdjsfilwUwppaqJiPSZMGFCW8/ngoICkpOTew4fPrxDeZb3pz/9KeWxxx5rXHkljF56zUwppapJYmKi+5tvvkk8fvy41K1b17zxxhv1mzVrVlDe5d16660HKrN8la2goIDY2NhqWZfWzJRSqhqNGDHi6KuvvtoQ4KWXXmp04YUXHvJM27dvn3PEiBHtMzIyMnv27Nl59erViS6Xi5YtW3b/+eefnZ58bdq06bZz586Ym266KfWuu+5qBtCvX79O11xzTcvu3bt3SU9P7/bee+/VBcjJyXGMGzeuXfv27buOHDmyfY8ePTp/+umnSSXLdfPNN7fo1q1bl44dO3adPn16G7fbzRdffJHQvXv3Lp4833zzTVxGRkYmwIoVK5L69u3bqWvXrl0GDx7c8ccff4z1lOOKK65I69atW5f77ruv2YsvvtigR48enbt06ZI5aNCgjJ07d8YA7NmzJ2bQoEEdO3To0HXq1KltUlNTu//0008xAI8//nij7t27d+ncuXPmjBkz2hQWFgbcrlozU0rVPm9el8b+LaUO6BXSNPMkExfuDJTtkksuOXT33Xe3mDp16pGvv/466corrzy4atWqugC33npras+ePU8uX778uyVLltSbNWtW261bt24ZNWrUkRdeeKHhDTfccPA///lPnZYtW+anpaWVOsIXFhbKV1999fXLL7/c4J577kkdM2bMtw8++GBKw4YNXd99993mtWvXJgwcOLCrr3Ldcsst+x966KGfACZOnNh28eLFDWbMmHG0oKBAtm7dGte5c+f85557rtHEiRMP5+XlyfXXX9/6nXfeyU5NTS1ctGhR8s0339zy1Vdf3Q6Qn58vmzZt+hrgwIEDzmnTpm11OBw8/PDDTe65557mixYt2jV37tzUoUOH5vzxj3/c+9prr9V/5ZVXmgB8/vnnCa+99lqjdevWbY2PjzcXX3xx6yeeeKLxnDlzDpa1XbVmppRS1ah///6ndu3aFb9o0aJGI0aMOOo9bc2aNfWuvPLKgwDnn39+zpEjR2IOHTrkmDFjxqHXXnutEcALL7xQrDbnbfLkyYcBBg0adGLXrl1xAKtWrao7ffr0QwB9+/bNzcjIOOlr3nfffbdejx49OmdkZGSuWrWq3qZNmxIBJk6ceOi5555rBPDGG28kX3LJJYc2btwYv23btsSzzz47o3PnzpkPPvhgiz179hS1J3rWB/DDDz/EDRkypGNGRkbmggULmm/dujXR/q51Z82adQjgoosuOla/fn0XwHvvvVdv06ZNST179uzSuXPnzJUrV9b//vvv4wNtV62ZKaVqnyBqUFVpzJgxR+6+++60Dz744Jv9+/cHPA6fc845J6688sr4PXv2xLz33nsN77///j2+8iUkJBiAmJgYXC6XBFuekydPym9+85s2q1ev3tKhQ4eCm266KTU3N9cBcMkllxyePHlyu2nTph0WEbp37563Zs2axA4dOpz68ssvt/paXr169dye93PmzGl9ww037J05c+bRpUuX1rvnnntSyyqLMUYmT558cOHChbuDLT9ozUwppardNddc8/PNN9+8p1+/fqe80/v375/zj3/8ozHA0qVL6yUnJxc2atTI7XA4GDt27JFrr702rUOHDqeaN2/uCnZdAwcOPL548eJkgPXr1yd8++23iSXznDx50gHQvHnzwqNHjzrefvvtZM+0rl275jkcDu66667UCy644BBAjx49cg8dOhSzfPnyOgB5eXmybt26BF/rz8nJcbZu3boA4Nlnny3qedm3b9/jzz//fCOA119/vf6xY8ecAGPGjDm2dOnS5N27d8eAdR3x22+/jQv0PbVmppRS1ax9+/YFd9xxx/6S6Q888MCemTNnpmdk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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot rewards over iterations\n",
"fig=plt.figure()\n",
"ax = fig.add_subplot(1,1,1)\n",
"\n",
"y = all_rewards\n",
"y_moving_average = uniform_filter1d(y, size=100)\n",
"\n",
"x = np.arange(len(y))\n",
"\n",
"ax.plot(x,y)\n",
"ax.plot(x,y_moving_average, label='Moving average')\n",
"ax.set_xlabel('Iteration')\n",
"ax.set_ylabel('Reward')\n",
"ax.set_title('Rewards vs iteration')\n",
"fig.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "2dfd28f0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch: 1 | Reward: -1 | State: 1\n",
"+---------+\n",
"|\u001b[34;1m\u001b[43mR\u001b[0m\u001b[0m: | : :\u001b[35mG\u001b[0m|\n",
"| : | : : |\n",
"| : : : : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (West)\n",
"\n",
"Epoch: 2 | Reward: -2 | State: 17\n",
"+---------+\n",
"|\u001b[42mR\u001b[0m: | : :\u001b[35mG\u001b[0m|\n",
"| : | : : |\n",
"| : : : : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (Pickup)\n",
"\n",
"Epoch: 3 | Reward: -3 | State: 117\n",
"+---------+\n",
"|R: | : :\u001b[35mG\u001b[0m|\n",
"|\u001b[42m_\u001b[0m: | : : |\n",
"| : : : : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (South)\n",
"\n",
"Epoch: 4 | Reward: -4 | State: 217\n",
"+---------+\n",
"|R: | : :\u001b[35mG\u001b[0m|\n",
"| : | : : |\n",
"|\u001b[42m_\u001b[0m: : : : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (South)\n",
"\n",
"Epoch: 5 | Reward: -5 | State: 237\n",
"+---------+\n",
"|R: | : :\u001b[35mG\u001b[0m|\n",
"| : | : : |\n",
"| :\u001b[42m_\u001b[0m: : : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (East)\n",
"\n",
"Epoch: 6 | Reward: -6 | State: 257\n",
"+---------+\n",
"|R: | : :\u001b[35mG\u001b[0m|\n",
"| : | : : |\n",
"| : :\u001b[42m_\u001b[0m: : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (East)\n",
"\n",
"Epoch: 7 | Reward: -7 | State: 157\n",
"+---------+\n",
"|R: | : :\u001b[35mG\u001b[0m|\n",
"| : |\u001b[42m_\u001b[0m: : |\n",
"| : : : : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (North)\n",
"\n",
"Epoch: 8 | Reward: -8 | State: 57\n",
"+---------+\n",
"|R: |\u001b[42m_\u001b[0m: :\u001b[35mG\u001b[0m|\n",
"| : | : : |\n",
"| : : : : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (North)\n",
"\n",
"Epoch: 9 | Reward: -9 | State: 77\n",
"+---------+\n",
"|R: | :\u001b[42m_\u001b[0m:\u001b[35mG\u001b[0m|\n",
"| : | : : |\n",
"| : : : : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (East)\n",
"\n",
"Epoch: 10 | Reward: -10 | State: 97\n",
"+---------+\n",
"|R: | : :\u001b[35m\u001b[42mG\u001b[0m\u001b[0m|\n",
"| : | : : |\n",
"| : : : : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (East)\n",
"\n",
"Epoch: 11 | Reward: 10 | State: 85\n",
"+---------+\n",
"|R: | : :\u001b[35m\u001b[34;1m\u001b[43mG\u001b[0m\u001b[0m\u001b[0m|\n",
"| : | : : |\n",
"| : : : : |\n",
"| | : | : |\n",
"|Y| : |B: |\n",
"+---------+\n",
" (Dropoff)\n",
"\n",
"Done.\n"
]
}
],
"source": [
"# Animate\n",
"# Note: this won't render properly in a github gist.\n",
"state = env.reset()\n",
"done = False\n",
"epochs, rewards = 0, 0\n",
"while not done:\n",
" action = np.argmax(q_table[env.s])\n",
" \n",
" next_state, reward, done, info = env.step(action)\n",
" env.s = next_state \n",
" \n",
" rewards += reward\n",
" epochs += 1\n",
" \n",
" print(f\"Epoch: {epochs:2d} | Reward: {rewards:2d} | State: {env.s:3d}\")\n",
" print(env.render(mode='ansi'))\n",
" time.sleep(0.1)\n",
"print(f\"Done.\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ec69de59",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "c9f3134d",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment