diff --git a/lessons/6-Other/22-DeepRL/CartPole-RL-Pytorch.ipynb b/lessons/6-Other/22-DeepRL/CartPole-RL-Pytorch.ipynb new file mode 100644 index 00000000..e69de29b diff --git a/lessons/6-Other/22-DeepRL/CartPole-RL-TF.ipynb b/lessons/6-Other/22-DeepRL/CartPole-RL-TF.ipynb index 5afa5a35..71f925f1 100644 --- a/lessons/6-Other/22-DeepRL/CartPole-RL-TF.ipynb +++ b/lessons/6-Other/22-DeepRL/CartPole-RL-TF.ipynb @@ -17,21 +17,21 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: gym in c:\\winapp\\miniconda3\\envs\\py38\\lib\\site-packages (0.23.1)\n", + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: gym in /home/leo/.local/lib/python3.10/site-packages (0.25.0)\n", "Collecting pygame\n", - " Downloading pygame-2.1.2-cp38-cp38-win_amd64.whl (8.4 MB)\n", - "Requirement already satisfied: importlib-metadata>=4.10.0 in c:\\winapp\\miniconda3\\envs\\py38\\lib\\site-packages (from gym) (4.11.3)\n", - "Requirement already satisfied: cloudpickle>=1.2.0 in c:\\winapp\\miniconda3\\envs\\py38\\lib\\site-packages (from gym) (2.0.0)\n", - "Requirement already satisfied: gym-notices>=0.0.4 in c:\\winapp\\miniconda3\\envs\\py38\\lib\\site-packages (from gym) (0.0.6)\n", - "Requirement already satisfied: numpy>=1.18.0 in c:\\winapp\\miniconda3\\envs\\py38\\lib\\site-packages (from gym) (1.22.3)\n", - "Requirement already satisfied: zipp>=0.5 in c:\\winapp\\miniconda3\\envs\\py38\\lib\\site-packages (from importlib-metadata>=4.10.0->gym) (3.6.0)\n", + " Downloading pygame-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (21.9 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.9/21.9 MB\u001b[0m \u001b[31m3.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: cloudpickle>=1.2.0 in /home/leo/.local/lib/python3.10/site-packages (from gym) (2.1.0)\n", + "Requirement already satisfied: numpy>=1.18.0 in /usr/lib/python3/dist-packages (from gym) (1.21.5)\n", + "Requirement already satisfied: gym-notices>=0.0.4 in /home/leo/.local/lib/python3.10/site-packages (from gym) (0.0.7)\n", "Installing collected packages: pygame\n", "Successfully installed pygame-2.1.2\n" ] @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -64,10 +64,22 @@ "Action space: Discrete(2)\n", "Observation space: Box([-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38], [4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38], (4,), float32)\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/leo/.local/lib/python3.10/site-packages/gym/core.py:329: DeprecationWarning: \u001b[33mWARN: Initializing wrapper in old step API which returns one bool instead of two. It is recommended to set `new_step_api=True` to use new step API. This will be the default behaviour in future.\u001b[0m\n", + " deprecation(\n", + "/home/leo/.local/lib/python3.10/site-packages/gym/wrappers/step_api_compatibility.py:39: DeprecationWarning: \u001b[33mWARN: Initializing environment in old step API which returns one bool instead of two. It is recommended to set `new_step_api=True` to use new step API. This will be the default behaviour in future.\u001b[0m\n", + " deprecation(\n" + ] } ], "source": [ "import gym\n", + "import pygame\n", + "import tqdm\n", "\n", "env = gym.make(\"CartPole-v1\")\n", "\n", @@ -86,33 +98,44 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 3, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/leo/.local/lib/python3.10/site-packages/gym/core.py:57: DeprecationWarning: \u001b[33mWARN: You are calling render method, but you didn't specified the argument render_mode at environment initialization. To maintain backward compatibility, the environment will render in human mode.\n", + "If you want to render in human mode, initialize the environment in this way: gym.make('EnvName', render_mode='human') and don't call the render method.\n", + "See here for more information: https://www.gymlibrary.ml/content/api/\u001b[0m\n", + " deprecation(\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "[-0.04825775 -0.21918646 -0.00796685 0.27188525] -> 1.0\n", - "[-0.05264147 -0.4141938 -0.00252914 0.5620448 ] -> 1.0\n", - "[-0.06092535 -0.21903647 0.00871175 0.26856613] -> 1.0\n", - "[-0.06530608 -0.41428167 0.01408308 0.56398404] -> 1.0\n", - "[-0.07359171 -0.60959834 0.02536276 0.8610703 ] -> 1.0\n", - "[-0.08578368 -0.4148308 0.04258416 0.57646877] -> 1.0\n", - "[-0.09408029 -0.610523 0.05411354 0.88225687] -> 1.0\n", - "[-0.10629076 -0.4161761 0.07175867 0.6070649 ] -> 1.0\n", - "[-0.11461428 -0.22212696 0.08389997 0.33781925] -> 1.0\n", - "[-0.11905681 -0.0282929 0.09065636 0.07272854] -> 1.0\n", - "[-0.11962268 0.16542032 0.09211093 -0.19003159] -> 1.0\n", - "[-0.11631427 -0.03089041 0.08831029 0.13022853] -> 1.0\n", - "[-0.11693208 -0.22715913 0.09091487 0.44941387] -> 1.0\n", - "[-0.12147526 -0.42344147 0.09990314 0.76931363] -> 1.0\n", - "[-0.12994409 -0.61978614 0.11528942 1.0916848 ] -> 1.0\n", - "[-0.14233981 -0.81622297 0.13712311 1.4182041 ] -> 1.0\n", - "[-0.15866427 -1.01275 0.1654872 1.7504154 ] -> 1.0\n", - "[-0.17891927 -1.2093195 0.2004955 2.0896728 ] -> 1.0\n", - "[-0.20310566 -1.4058217 0.24228896 2.4370732 ] -> 1.0\n", - "Total reward: 19.0\n" + "[-0.01453476 -0.23855041 -0.04445581 0.29491952] -> 1.0\n", + "[-0.01930577 -0.4330113 -0.03855742 0.57325697] -> 1.0\n", + "[-0.027966 -0.62757206 -0.02709228 0.8535481 ] -> 1.0\n", + "[-0.04051744 -0.43209147 -0.01002132 0.55247074] -> 1.0\n", + "[-0.04915927 -0.23683023 0.00102809 0.25664735] -> 1.0\n", + "[-0.05389587 -0.04172298 0.00616104 -0.03571114] -> 1.0\n", + "[-0.05473033 0.15331008 0.00544682 -0.32644385] -> 1.0\n", + "[-0.05166413 0.34835407 -0.00108206 -0.6174041 ] -> 1.0\n", + "[-0.04469705 0.15324724 -0.01343014 -0.3250622 ] -> 1.0\n", + "[-0.0416321 0.34855783 -0.01993139 -0.62195 ] -> 1.0\n", + "[-0.03466095 0.54395235 -0.03237038 -0.92084295] -> 1.0\n", + "[-0.0237819 0.7394964 -0.05078724 -1.2235206 ] -> 1.0\n", + "[-0.00899197 0.5450641 -0.07525766 -0.9471733 ] -> 1.0\n", + "[ 0.00190931 0.7411144 -0.09420113 -1.2625213 ] -> 1.0\n", + "[ 0.0167316 0.54731464 -0.11945155 -1.0007646 ] -> 1.0\n", + "[ 0.02767789 0.74381286 -0.13946684 -1.3284469 ] -> 1.0\n", + "[ 0.04255415 0.55069894 -0.16603577 -1.0824591 ] -> 1.0\n", + "[ 0.05356812 0.35811067 -0.18768495 -0.84614 ] -> 1.0\n", + "[ 0.06073034 0.55522907 -0.20460775 -1.1914812 ] -> 1.0\n", + "[ 0.07183492 0.7523274 -0.22843738 -1.5406975 ] -> 1.0\n", + "Total reward: 20.0\n" ] } ], @@ -126,7 +149,9 @@ " obs, rew, done, info = env.step(env.action_space.sample())\n", " total_reward += rew\n", " print(f\"{obs} -> {rew}\")\n", - "print(f\"Total reward: {total_reward}\")" + "print(f\"Total reward: {total_reward}\")\n", + "\n", + "env.close()" ] }, { @@ -152,9 +177,35 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/tensorflow/__init__.py:29: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives\n", + " import distutils as _distutils\n", + "2022-07-24 16:22:33.879054: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2022-07-24 16:22:33.879079: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n", + "/usr/local/lib/python3.10/dist-packages/flatbuffers/compat.py:19: DeprecationWarning: the imp module is deprecated in favour of importlib and slated for removal in Python 3.12; see the module's documentation for alternative uses\n", + " import imp\n", + "2022-07-24 16:22:35.795765: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:975] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", + "2022-07-24 16:22:35.795964: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", + "2022-07-24 16:22:35.796020: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcublas.so.11'; dlerror: libcublas.so.11: cannot open shared object file: No such file or directory\n", + "2022-07-24 16:22:35.796070: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcublasLt.so.11'; dlerror: libcublasLt.so.11: cannot open shared object file: No such file or directory\n", + "2022-07-24 16:22:35.796120: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcufft.so.10'; dlerror: libcufft.so.10: cannot open shared object file: No such file or directory\n", + "2022-07-24 16:22:35.796169: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcurand.so.10'; dlerror: libcurand.so.10: cannot open shared object file: No such file or directory\n", + "2022-07-24 16:22:35.796218: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcusolver.so.11'; dlerror: libcusolver.so.11: cannot open shared object file: No such file or directory\n", + "2022-07-24 16:22:35.796267: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcusparse.so.11'; dlerror: libcusparse.so.11: cannot open shared object file: No such file or directory\n", + "2022-07-24 16:22:35.796317: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudnn.so.8'; dlerror: libcudnn.so.8: cannot open shared object file: No such file or directory\n", + "2022-07-24 16:22:35.796325: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1850] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n", + "Skipping registering GPU devices...\n", + "2022-07-24 16:22:35.796558: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", + "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" + ] + } + ], "source": [ "import numpy as np\n", "import tensorflow as tf\n", @@ -181,7 +232,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -213,14 +264,14 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Total reward: 13.0\n" + "Total reward: 27.0\n" ] } ], @@ -238,7 +289,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -270,38 +321,53 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "0 -> 44.0\n", - "100 -> 105.0\n", - "200 -> 145.0\n", - "300 -> 70.0\n", - "400 -> 190.0\n", - "500 -> 298.0\n", - "600 -> 289.0\n", - "700 -> 499.0\n", - "800 -> 499.0\n", - "900 -> 499.0\n" + "0 -> 220.0\n", + "100 -> 499.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-07-24 16:24:08.306764: W tensorflow/core/data/root_dataset.cc:247] Optimization loop failed: CANCELLED: Operation was cancelled\n", + "2022-07-24 16:24:18.603528: W tensorflow/core/data/root_dataset.cc:247] Optimization loop failed: CANCELLED: Operation was cancelled\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "200 -> 499.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-07-24 16:25:03.522510: W tensorflow/core/data/root_dataset.cc:247] Optimization loop failed: CANCELLED: Operation was cancelled\n", + "2022-07-24 16:25:08.844014: W tensorflow/core/data/root_dataset.cc:247] Optimization loop failed: CANCELLED: Operation was cancelled\n" ] }, { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 73, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -340,9 +406,33 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "error", + "evalue": "display Surface quit", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31merror\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_37078/1459719159.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrun_episode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/tmp/ipykernel_37078/3855001447.py\u001b[0m in \u001b[0;36mrun_episode\u001b[0;34m(max_steps_per_episode, render)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmax_steps_per_episode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0maction_probs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_dims\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0maction\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchoice\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum_actions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqueeze\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction_probs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrender_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 429\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 430\u001b[0m \u001b[0;34m\"\"\"Renders the environment.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 431\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 432\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 433\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrender_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/wrappers/order_enforcing.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0;34m\"set `disable_render_order_enforcing=True` on the OrderEnforcer wrapper.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m )\n\u001b[0;32m---> 51\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 52\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 53\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrender_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 429\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 430\u001b[0m \u001b[0;34m\"\"\"Renders the environment.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 431\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 432\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 433\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrender_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/wrappers/env_checker.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 53\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0menv_render_passive_checker\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 55\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrender_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/envs/classic_control/cartpole.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, mode)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_renders\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_render\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_render\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"human\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/envs/classic_control/cartpole.py\u001b[0m in \u001b[0;36m_render\u001b[0;34m(self, mode)\u001b[0m\n\u001b[1;32m 296\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 297\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msurf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpygame\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msurf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 298\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscreen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mblit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msurf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 299\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"human\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 300\u001b[0m \u001b[0mpygame\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpump\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31merror\u001b[0m: display Surface quit" + ] + } + ], "source": [ "_ = run_episode(render=True)" ] @@ -540,11 +630,8 @@ } ], "metadata": { - "interpreter": { - "hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f" - }, "kernelspec": { - "display_name": "Python 3.8.12 ('py38')", + "display_name": "Python 3.10.4 64-bit", "language": "python", "name": "python3" }, @@ -558,9 +645,14 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.12" + "version": "3.10.4" }, - "orig_nbformat": 4 + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" + } + } }, "nbformat": 4, "nbformat_minor": 2 diff --git a/lessons/6-Other/22-DeepRL/notebook.ipynb b/lessons/6-Other/22-DeepRL/notebook.ipynb index b6338c89..50c2c33f 100644 --- a/lessons/6-Other/22-DeepRL/notebook.ipynb +++ b/lessons/6-Other/22-DeepRL/notebook.ipynb @@ -1,39 +1,15 @@ { - "metadata": { - "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.0" - }, - "orig_nbformat": 4, - "kernelspec": { - "name": "python3", - "display_name": "Python 3.7.0 64-bit ('3.7')" - }, - "interpreter": { - "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" - } - }, - "nbformat": 4, - "nbformat_minor": 2, "cells": [ { + "cell_type": "markdown", + "metadata": {}, "source": [ "## CartPole Skating\n", "\n", "> **Problem**: If Peter wants to escape from the wolf, he needs to be able to move faster than him. We will see how Peter can learn to skate, in particular, to keep balance, using Q-Learning.\n", "\n", "First, let's install the gym and import required libraries:" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -41,23 +17,34 @@ "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "Requirement already satisfied: gym in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (0.18.3)\n", - "Requirement already satisfied: Pillow<=8.2.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from gym) (7.0.0)\n", - "Requirement already satisfied: scipy in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from gym) (1.4.1)\n", - "Requirement already satisfied: numpy>=1.10.4 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from gym) (1.19.2)\n", - "Requirement already satisfied: cloudpickle<1.7.0,>=1.2.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from gym) (1.6.0)\n", - "Requirement already satisfied: pyglet<=1.5.15,>=1.4.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from gym) (1.5.15)\n", - "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n", - "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n" + "Defaulting to user installation because normal site-packages is not writeable\n", + "Collecting gym\n", + " Downloading gym-0.25.0.tar.gz (720 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m720.4/720.4 KB\u001b[0m \u001b[31m3.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25h Installing build dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Getting requirements to build wheel ... \u001b[?25ldone\n", + "\u001b[?25h Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25hRequirement already satisfied: numpy>=1.18.0 in /usr/lib/python3/dist-packages (from gym) (1.21.5)\n", + "Collecting gym-notices>=0.0.4\n", + " Downloading gym_notices-0.0.7-py3-none-any.whl (2.7 kB)\n", + "Collecting cloudpickle>=1.2.0\n", + " Downloading cloudpickle-2.1.0-py3-none-any.whl (25 kB)\n", + "Building wheels for collected packages: gym\n", + " Building wheel for gym (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25h Created wheel for gym: filename=gym-0.25.0-py3-none-any.whl size=824430 sha256=3f4ed647f1d12814bb457f7d83a7ccd0f682d12a0259ca07b7fab0db5100fc6e\n", + " Stored in directory: /home/leo/.cache/pip/wheels/c0/3c/33/32d86254a5bd554f5f07759ae1794646e490dd5fa81ebdcda3\n", + "Successfully built gym\n", + "Installing collected packages: gym-notices, cloudpickle, gym\n", + "Successfully installed cloudpickle-2.1.0 gym-0.25.0 gym-notices-0.0.7\n" ] } ], "source": [ "import sys\n", - "!pip install gym \n", + "!pip install gym pygame\n", "\n", "import gym\n", "import matplotlib.pyplot as plt\n", @@ -66,86 +53,118 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "## Create a cartpole environment" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { - "source": [ - "env = gym.make(\"CartPole-v1\")\n", - "print(env.action_space)\n", - "print(env.observation_space)\n", - "print(env.action_space.sample())" - ], "cell_type": "code", - "metadata": {}, "execution_count": 2, + "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", + "text": [ + "Discrete(2)\n", + "Box([-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38], [4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38], (4,), float32)\n", + "1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", "text": [ - "Discrete(2)\nBox(-3.4028234663852886e+38, 3.4028234663852886e+38, (4,), float32)\n0\n" + "/home/leo/.local/lib/python3.10/site-packages/gym/core.py:329: DeprecationWarning: \u001b[33mWARN: Initializing wrapper in old step API which returns one bool instead of two. It is recommended to set `new_step_api=True` to use new step API. This will be the default behaviour in future.\u001b[0m\n", + " deprecation(\n", + "/home/leo/.local/lib/python3.10/site-packages/gym/wrappers/step_api_compatibility.py:39: DeprecationWarning: \u001b[33mWARN: Initializing environment in old step API which returns one bool instead of two. It is recommended to set `new_step_api=True` to use new step API. This will be the default behaviour in future.\u001b[0m\n", + " deprecation(\n" ] } + ], + "source": [ + "env = gym.make(\"CartPole-v1\")\n", + "print(env.action_space)\n", + "print(env.observation_space)\n", + "print(env.action_space.sample())" ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "To see how the environment works, let's run a short simulation for 100 steps." - ], - "cell_type": "markdown", - "metadata": {} + ] }, { - "source": [ - "env.reset()\n", - "\n", - "for i in range(100):\n", - " env.render()\n", - " env.step(env.action_space.sample())\n", - "env.close()" - ], "cell_type": "code", - "metadata": {}, "execution_count": 3, + "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stderr", + "output_type": "stream", "text": [ - "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/gym/logger.py:30: UserWarning: \u001b[33mWARN: You are calling 'step()' even though this environment has already returned done = True. You should always call 'reset()' once you receive 'done = True' -- any further steps are undefined behavior.\u001b[0m\n warnings.warn(colorize('%s: %s'%('WARN', msg % args), 'yellow'))\n" + "/home/leo/.local/lib/python3.10/site-packages/gym/core.py:57: DeprecationWarning: \u001b[33mWARN: You are calling render method, but you didn't specified the argument render_mode at environment initialization. To maintain backward compatibility, the environment will render in human mode.\n", + "If you want to render in human mode, initialize the environment in this way: gym.make('EnvName', render_mode='human') and don't call the render method.\n", + "See here for more information: https://www.gymlibrary.ml/content/api/\u001b[0m\n", + " deprecation(\n" + ] + }, + { + "ename": "DependencyNotInstalled", + "evalue": "pygame is not installed, run `pip install gym[classic_control]`", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/envs/classic_control/cartpole.py\u001b[0m in \u001b[0;36m_render\u001b[0;34m(self, mode)\u001b[0m\n\u001b[1;32m 221\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 222\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mpygame\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 223\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mpygame\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mgfxdraw\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'pygame'", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mDependencyNotInstalled\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_32716/4123126963.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maction_space\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msample\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrender_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 429\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 430\u001b[0m \u001b[0;34m\"\"\"Renders the environment.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 431\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 432\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 433\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrender_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/wrappers/order_enforcing.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0;34m\"set `disable_render_order_enforcing=True` on the OrderEnforcer wrapper.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m )\n\u001b[0;32m---> 51\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 52\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 53\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrender_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 429\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 430\u001b[0m \u001b[0;34m\"\"\"Renders the environment.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 431\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 432\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 433\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrender_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/wrappers/env_checker.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchecked_render\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchecked_render\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0menv_render_passive_checker\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 54\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/utils/passive_env_checker.py\u001b[0m in \u001b[0;36menv_render_passive_checker\u001b[0;34m(env, *args, **kwargs)\u001b[0m\n\u001b[1;32m 322\u001b[0m )\n\u001b[1;32m 323\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 324\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 325\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 326\u001b[0m \u001b[0;31m# TODO: Check that the result is correct\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/core.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 64\u001b[0m )\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 66\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mrender_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 67\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/envs/classic_control/cartpole.py\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, mode)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_renders\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_render\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_render\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"human\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.10/site-packages/gym/envs/classic_control/cartpole.py\u001b[0m in \u001b[0;36m_render\u001b[0;34m(self, mode)\u001b[0m\n\u001b[1;32m 223\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mpygame\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mgfxdraw\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 224\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mImportError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 225\u001b[0;31m raise DependencyNotInstalled(\n\u001b[0m\u001b[1;32m 226\u001b[0m \u001b[0;34m\"pygame is not installed, run `pip install gym[classic_control]`\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 227\u001b[0m )\n", + "\u001b[0;31mDependencyNotInstalled\u001b[0m: pygame is not installed, run `pip install gym[classic_control]`" ] } + ], + "source": [ + "env.reset()\n", + "\n", + "for i in range(100):\n", + " env.render()\n", + " env.step(env.action_space.sample())\n", + "env.close()" ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "During simulation, we need to get observations in order to decide how to act. In fact, `step` function returns us back current observations, reward function, and the `done` flag that indicates whether it makes sense to continue the simulation or not:" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { - "source": [ - "env.reset()\n", - "\n", - "done = False\n", - "while not done:\n", - " env.render()\n", - " obs, rew, done, info = env.step(env.action_space.sample())\n", - " print(f\"{obs} -> {rew}\")\n", - "env.close()" - ], "cell_type": "code", - "metadata": {}, "execution_count": 4, + "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "[ 0.03044442 -0.19543914 -0.04496216 0.28125618] -> 1.0\n", "[ 0.02653564 -0.38989186 -0.03933704 0.55942606] -> 1.0\n", @@ -168,14 +187,24 @@ "[ 0.12921301 0.59883361 -0.22594088 -1.22169133] -> 1.0\n" ] } + ], + "source": [ + "env.reset()\n", + "\n", + "done = False\n", + "while not done:\n", + " env.render()\n", + " obs, rew, done, info = env.step(env.action_space.sample())\n", + " print(f\"{obs} -> {rew}\")\n", + "env.close()" ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "We can get min and max value of those numbers:" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -183,10 +212,11 @@ "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "[-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]\n[4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]\n" + "[-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]\n", + "[4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]\n" ] } ], @@ -196,11 +226,11 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "## State Discretization" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -213,11 +243,11 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Let's also explore other discretization method using bins:" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -225,10 +255,11 @@ "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "Sample bins for interval (-5,5) with 10 bins\n [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.]\n" + "Sample bins for interval (-5,5) with 10 bins\n", + " [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.]\n" ] } ], @@ -247,11 +278,11 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Let's now run a short simulation and observe those discrete environment values." - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -259,10 +290,21 @@ "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "(0, 0, -1, -3)\n(0, 0, -2, 0)\n(0, 0, -2, -3)\n(0, 1, -3, -6)\n(0, 2, -4, -9)\n(0, 3, -6, -12)\n(0, 2, -8, -9)\n(0, 3, -10, -13)\n(0, 4, -13, -16)\n(0, 4, -16, -19)\n(0, 4, -20, -17)\n(0, 4, -24, -20)\n" + "(0, 0, -1, -3)\n", + "(0, 0, -2, 0)\n", + "(0, 0, -2, -3)\n", + "(0, 1, -3, -6)\n", + "(0, 2, -4, -9)\n", + "(0, 3, -6, -12)\n", + "(0, 2, -8, -9)\n", + "(0, 3, -10, -13)\n", + "(0, 4, -13, -16)\n", + "(0, 4, -16, -19)\n", + "(0, 4, -20, -17)\n", + "(0, 4, -24, -20)\n" ] } ], @@ -279,11 +321,11 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "## Q-Table Structure" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -299,11 +341,11 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "## Let's Start Q-Learning!" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -323,8 +365,8 @@ "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "0: 108.0, alpha=0.3, epsilon=0.9\n" ] @@ -370,11 +412,11 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "## Plotting Training Progress" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -382,25 +424,27 @@ "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, + "execution_count": 20, "metadata": {}, - "execution_count": 20 + "output_type": "execute_result" }, { - "output_type": "display_data", "data": { - "text/plain": "
", + "image/png": "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", "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", - "image/png": "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\n" + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } ], "source": [ @@ -408,11 +452,11 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "From this graph, it is not possible to tell anything, because due to the nature of stochastic training process the length of training sessions varies greatly. To make more sense of this graph, we can calculate **running average** over series of experiments, let's say 100. This can be done conveniently using `np.convolve`:" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -420,25 +464,27 @@ "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, + "execution_count": 22, "metadata": {}, - "execution_count": 22 + "output_type": "execute_result" }, { - "output_type": "display_data", "data": { - "text/plain": "
", + "image/png": "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", "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", - "image/png": "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\n" + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } ], "source": [ @@ -449,13 +495,13 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "## Varying Hyperparameters and Seeing the Result in Action\n", "\n", "Now it would be interesting to actually see how the trained model behaves. Let's run the simulation, and we will be following the same action selection strategy as during training: sampling according to the probability distribution in Q-Table: " - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -475,14 +521,14 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "\n", "## Saving result to an animated GIF\n", "\n", "If you want to impress your friends, you may want to send them the animated GIF picture of the balancing pole. To do this, we can invoke `env.render` to produce an image frame, and then save those to animated GIF using PIL library:" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -490,8 +536,8 @@ "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "360\n" ] @@ -516,5 +562,32 @@ "print(i)" ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.10.4 64-bit", + "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.10.4" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}