{ "cells": [ { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:08:48.249166Z", "start_time": "2023-03-07T14:08:48.246325Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import gym\n", "import matplotlib.pyplot as plt\n", "from matplotlib import animation\n", "import random" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:03:53.352738Z", "start_time": "2023-03-07T14:03:53.345794Z" } }, "outputs": [ { "data": { "text/plain": [ "'0.15.4'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gym.version.VERSION" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2023-03-05T14:51:34.744085Z", "start_time": "2023-03-05T14:51:31.888070Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Looking in indexes: http://mirrors.aliyun.com/pypi/simple/\r\n", "Requirement already satisfied: JSAnimation in /Users/chunhuizhang/anaconda3/envs/py3/lib/python3.7/site-packages (0.1)\r\n" ] } ], "source": [ "!pip install JSAnimation" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:04:07.798088Z", "start_time": "2023-03-07T14:04:07.791365Z" } }, "outputs": [], "source": [ "from JSAnimation.IPython_display import display_animation\n", "from IPython.display import display, HTML" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 重新认识 cartpole 环境" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 小滑块/倒立摆\n", "- 典型的 mdp(markov decision process)\n", " - 下一时刻的状态(转移)$s_{t+1}$ 只跟当前状态 $s_t$ 和(当前状态下采取的)$a_t$ 有关\n", "- action space is discrete and finite\n", "- state(observation)space is continuous" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:04:12.875444Z", "start_time": "2023-03-07T14:04:12.854714Z" } }, "outputs": [], "source": [ "env = gym.make('CartPole-v0')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### state/space" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:04:15.382240Z", "start_time": "2023-03-07T14:04:15.377243Z" } }, "outputs": [ { "data": { "text/plain": [ "array([-3.40156280e-02, -4.64929535e-05, -2.24331342e-02, -3.44344543e-02])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# init space\n", "env.reset()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:04:25.359650Z", "start_time": "2023-03-07T14:04:25.356727Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Discrete(2)\n" ] } ], "source": [ "# action space\n", "print(env.action_space)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:04:30.487576Z", "start_time": "2023-03-07T14:04:30.484735Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] } ], "source": [ "print(env.action_space.n)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:04:51.524995Z", "start_time": "2023-03-07T14:04:51.520685Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Box(4,)\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\n" ] } ], "source": [ "# observation space\n", "# https://www.gymlibrary.dev/environments/classic_control/cart_pole/\n", "print(env.observation_space)\n", "print(env.observation_space.low)\n", "print(env.observation_space.high)\n", "print(env.observation_space.shape[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### one episode" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2023-03-05T14:57:32.225046Z", "start_time": "2023-03-05T14:57:31.832564Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "step: 1, state: [-0.02012693 0.20925067 0.03958993 -0.29435305]\n", "step: 2, state: [-0.01594191 0.40378649 0.03370287 -0.57429172]\n", "step: 3, state: [-0.00786618 0.20820864 0.02221704 -0.27118479]\n", "step: 4, state: [-0.00370201 0.01277682 0.01679334 0.02842187]\n", "step: 5, state: [-0.00344647 -0.18258188 0.01736178 0.32635562]\n", "step: 6, state: [-0.00709811 0.01228863 0.02388889 0.03919801]\n", "step: 7, state: [-0.00685234 -0.18316759 0.02467285 0.33932136]\n", "step: 8, state: [-0.01051569 -0.37863177 0.03145928 0.63968147]\n", "step: 9, state: [-0.01808833 -0.18396223 0.04425291 0.35706915]\n", "step: 10, state: [-0.02176757 -0.37968447 0.05139429 0.66337121]\n", "step: 11, state: [-0.02936126 -0.18531377 0.06466172 0.38730339]\n", "step: 12, state: [-0.03306753 0.00883356 0.07240779 0.1156883 ]\n", "step: 13, state: [-0.03289086 -0.18724716 0.07472155 0.43030799]\n", "step: 14, state: [-0.03663581 0.00674154 0.08332771 0.16208459]\n", "step: 15, state: [-0.03650098 -0.18946834 0.0865694 0.47984822]\n", "step: 16, state: [-0.04029034 -0.38569887 0.09616637 0.79851137]\n", "step: 17, state: [-0.04800432 -0.19201853 0.11213659 0.53756254]\n", "step: 18, state: [-0.05184469 0.00136303 0.12288785 0.28221117]\n", "step: 19, state: [-0.05181743 0.19453743 0.12853207 0.0306729 ]\n", "step: 20, state: [-0.04792668 0.38760429 0.12914553 -0.21885405]\n", "step: 21, state: [-0.0401746 0.19089548 0.12476845 0.1116153 ]\n", "step: 22, state: [-0.03635669 -0.00577295 0.12700075 0.44091157]\n", "step: 23, state: [-0.03647215 -0.20244188 0.13581898 0.770777 ]\n", "step: 24, state: [-0.04052098 -0.00942435 0.15123452 0.52372515]\n", "step: 25, state: [-0.04070947 -0.20631499 0.16170903 0.85998375]\n", "step: 26, state: [-0.04483577 -0.0137211 0.1789087 0.62219743]\n", "step: 27, state: [-0.04511019 0.17851121 0.19135265 0.39077045]\n", "step: 28, state: [-0.04153997 -0.01873813 0.19916806 0.73715912]\n", "step: 29, state: [-0.04191473 0.17315764 0.21391124 0.51317475]\n" ] } ], "source": [ "env = gym.make('CartPole-v0')\n", "# observation = env.reset()\n", "state = env.reset()\n", "steps = 0\n", "frames = []\n", "while True:\n", " frames.append(env.render(mode='rgb_array'))\n", " action = env.action_space.sample()\n", " state, reward, done, info = env.step(action)\n", " steps += 1\n", " print(f'step: {steps}, state: {state}')\n", " if done:\n", " break" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2023-03-05T14:58:23.485976Z", "start_time": "2023-03-05T14:58:23.446404Z" } }, "outputs": [ { "data": { "text/plain": [ "[array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8),\n", " array([[[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " ...,\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]],\n", " \n", " [[255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " ...,\n", " [255, 255, 255],\n", " [255, 255, 255],\n", " [255, 255, 255]]], dtype=uint8)]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frames" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:05:15.008732Z", "start_time": "2023-03-07T14:05:15.003533Z" } }, "outputs": [], "source": [ "def display_frames_as_gif(frames, output):\n", " \"\"\"\n", " Displays a list of frames as a gif, with controls\n", " 以gif格式显示关键帧列,带有控件\n", " \"\"\"\n", " \n", " fig = plt.figure(figsize=(frames[0].shape[1]/72.0, frames[0].shape[0]/72.0),dpi=72)\n", " patch = plt.imshow(frames[0])\n", " plt.axis('off')\n", " \n", " def animate(i):\n", " img = patch.set_data(frames[i])\n", " return img ## *** return是必须要有的 ***\n", " \n", " anim = animation.FuncAnimation(plt.gcf(), animate, frames=len(frames), interval=50)\n", " \n", " anim.save(output)\n", " return HTML(anim.to_jshtml()) ## *** 返回一个HTML对象,以便被调用者显示。 ***\n", " # display(display_animation(anim, default_mode='loop'))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "ExecuteTime": { "end_time": "2023-03-05T14:59:09.169623Z", "start_time": "2023-03-05T14:58:48.224146Z" }, "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5gAAAJqCAYAAABO5e8bAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAZ0ElEQVR4nO3d24+c9X3H8e8zswevd9c2azBgDDjYhFKcQBNOappDISGVorYJyUW5iSKlaar0pv9Aep8qV1V70fYiPYioEWlaNQpNEwRtmjSQACKACWAOBtvYgI9r7N317szTizgujbC9O/7O/GZ2Xi/JF+tnft7P3ejtZw5VXdcBAAAAF6pRegAAAACrg8AEAAAghcAEAAAghcAEAAAghcAEAAAghcAEAAAgxch5rvsOEwAAAN6uOtsFdzABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIMVJ6AAAMo7kj+2NpbjYiIsbXXxpjkxvKDgKABAITAAo48MR34/CuhyMiYt2VO2LtxVedubZpxx0xOjFdahoAdExgAkBhs3uejtk9T5/5+dirT0VjZCwiIhojY7H941+KqKrTV6toND19A9Cfqrquz3X9nBcBgJVbnJuN3Q/9Xczu3bmsx1eN/wvKtRdfGdd89I9ibGqmW/MA4Hyqs13wIT8A0GOze3YuOy4jIur20pk/J954OQ6dfmktAPQbgQkAA2TtxVfFzPbbSs8AgHckMAFggDTH1sb49MbSMwDgHQlMAOih1qm5OPbqU6VnAEBXCEwA6KHWqbk48tJjnf8D1Vk/VwEAihOYADAgGiNjse1jXyw9AwDOSmACwAD55fdjAkA/EpgA0CN1Xcfeh79ZegYAdI3ABIAeeuvACx2fHZu+OHEJAOQTmAAwILZ+5HNRNZqlZwDAWQlMAAAAUghMAOiRV//73lg8OVt6BgB0jcAEgB5pLc5HRN3R2clN74rRiencQQCQTGACwADY8K73xdjUTOkZAHBOAhMAeqB1aj7aSwulZwBAVwlMAOiBIy89GsdeebL0DADoKoEJAH1uYmZLrL9qR+kZAHBeAhMAuqxut2Jp4UTH50cn18fERZsTFwFAdwhMAOiyheOHYt8j3yo9AwC6TmACQB+rmqOxacedpWcAwLIITADoY1WjGeu2XF96BgAsi8AEgC6q6zqO73u29AwA6AmBCQBd9tqj/1Z6AgD0hMAEgD52zZ1fiIiq9AwAWBaBCQB9bGzqoqgqgQnAYBCYANBFh577UbQW50vPAICeEJgA0EXH9uyMurXY0dmqORrh7iUAA0RgAkCfuuLWT8WaDZeXngEAyyYwAaCPef8lAINEYAJAlxx+8adxfN/PS88AgJ4RmADQJUvzJ6J1aq6jsyNrpmN8emPyIgDoLoEJAH1o8tJrYsPWm0rPAIAVEZgA0AV1XUfdXio9AwB6SmACQBcsHHs99j78zdIzAKCnBCYAdEtdd3Ssao7GzPZbk8cAQPcJTADoM42R0bjomveXngEAKyYwASBZXddx8tDe0jMAoOcEJgB0was//HrpCQDQ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UghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUoyc53rVkxUAAAAMPHcwAQAASCEwAQAASCEwAQAASCEwAQAASCEwAQAASCEwAQAASPG/e2QgBt5rhWsAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5gAAAJqCAYAAABO5e8bAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAZ0ElEQVR4nO3d24+c9X3H8e8zswevd9c2azBgDDjYhFKcQBNOappDISGVorYJyUW5iSKlaar0pv9Aep8qV1V70fYiPYioEWlaNQpNEwRtmjSQACKACWAOBtvYgI9r7N317szTizgujbC9O/7O/GZ2Xi/JF+tnft7P3ejtZw5VXdcBAAAAF6pRegAAAACrg8AEAAAghcAEAAAghcAEAAAghcAEAAAghcAEAAAgxch5rvsOEwAAAN6uOtsFdzABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIMVJ6AAAMo7kj+2NpbjYiIsbXXxpjkxvKDgKABAITAAo48MR34/CuhyMiYt2VO2LtxVedubZpxx0xOjFdahoAdExgAkBhs3uejtk9T5/5+dirT0VjZCwiIhojY7H941+KqKrTV6toND19A9Cfqrquz3X9nBcBgJVbnJuN3Q/9Xczu3bmsx1eN/wvKtRdfGdd89I9ibGqmW/MA4Hyqs13wIT8A0GOze3YuOy4jIur20pk/J954OQ6dfmktAPQbgQkAA2TtxVfFzPbbSs8AgHckMAFggDTH1sb49MbSMwDgHQlMAOih1qm5OPbqU6VnAEBXCEwA6KHWqbk48tJjnf8D1Vk/VwEAihOYADAgGiNjse1jXyw9AwDOSmACwAD55fdjAkA/EpgA0CN1Xcfeh79ZegYAdI3ABIAeeuvACx2fHZu+OHEJAOQTmAAwILZ+5HNRNZqlZwDAWQlMAAAAUghMAOiRV//73lg8OVt6BgB0jcAEgB5pLc5HRN3R2clN74rRiencQQCQTGACwADY8K73xdjUTOkZAHBOAhMAeqB1aj7aSwulZwBAVwlMAOiBIy89GsdeebL0DADoKoEJAH1uYmZLrL9qR+kZAHBeAhMAuqxut2Jp4UTH50cn18fERZsTFwFAdwhMAOiyheOHYt8j3yo9AwC6TmACQB+rmqOxacedpWcAwLIITADoY1WjGeu2XF96BgAsi8AEgC6q6zqO73u29AwA6AmBCQBd9tqj/1Z6AgD0hMAEgD52zZ1fiIiq9AwAWBaBCQB9bGzqoqgqgQnAYBCYANBFh577UbQW50vPAICeEJgA0EXH9uyMurXY0dmqORrh7iUAA0RgAkCfuuLWT8WaDZeXngEAyyYwAaCPef8lAINEYAJAlxx+8adxfN/PS88AgJ4RmADQJUvzJ6J1aq6jsyNrpmN8emPyIgDoLoEJAH1o8tJrYsPWm0rPAIAVEZgA0AV1XUfdXio9AwB6SmACQBcsHHs99j78zdIzAKCnBCYAdEtdd3Ssao7GzPZbk8cAQPcJTADoM42R0bjomveXngEAKyYwASBZXddx8tDe0jMAoOcEJgB0was//HrpCQDQ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UghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUoyc53rVkxUAAAAMPHcwAQAASCEwAQAASCEwAQAASCEwAQAASCEwAQAASCEwAQAASPG/e2QgBt5rhWsAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "display_frames_as_gif(frames, output='./save/rand_cartpole.gif')\n", "display_frames_as_gif(frames, output='./save/rand_cartpole.mp4')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 状态离散化" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "ExecuteTime": { "end_time": "2023-03-05T15:01:26.306200Z", "start_time": "2023-03-05T15:01:26.301178Z" } }, "outputs": [], "source": [ "NUM_DIGITIZED = 6\n", "\n", "# 分桶, 5个值,对应 6 个分段,即 6 个桶 (0, 1, 2, 3, 4, 5)\n", "def bins(clip_min, clip_max, num_bins=NUM_DIGITIZED):\n", " return np.linspace(clip_min, clip_max, num_bins+1)[1:-1]\n", "\n", "# 按 6 进制映射将 4位 6 进制数映射为 id,\n", "def digitize_state(observation):\n", " pos, cart_v, angle, pole_v = observation\n", " digitized = [np.digitize(pos, bins=bins(-2.4, 2.4, NUM_DIGITIZED)), \n", " np.digitize(cart_v, bins=bins(-3., 3, NUM_DIGITIZED)), \n", " np.digitize(angle, bins=bins(-0.418, 0.418, NUM_DIGITIZED)), \n", " np.digitize(pole_v, bins=bins(-2, 2, NUM_DIGITIZED))]\n", " # 3,1,2,4 (4位10进制数) = 4*10^0 + 2*10^1 + 1*10^2 + 3*10^3,最终的取值范围是 0-9999,总计 10^4 == 10000\n", " # a,b,c,d (4位6进制数) = d*6^0 + c*6^1 + b*6^2 + a*6^3,最终的取值范围是 0-`5555`(1295),总计 6^4 == 1296\n", " ind = sum([d*(NUM_DIGITIZED**i) for i, d in enumerate(digitized)])\n", " return ind\n", " " ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "ExecuteTime": { "end_time": "2023-03-05T15:01:29.874797Z", "start_time": "2023-03-05T15:01:29.871656Z" } }, "outputs": [], "source": [ "obs = env.reset()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "ExecuteTime": { "end_time": "2023-03-05T15:01:31.165281Z", "start_time": "2023-03-05T15:01:31.161059Z" } }, "outputs": [ { "data": { "text/plain": [ "array([ 0.04002152, 0.00259074, -0.03391407, -0.04418303])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obs" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "ExecuteTime": { "end_time": "2023-03-05T14:25:41.628539Z", "start_time": "2023-03-05T14:25:41.625136Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([-1.6, -0.8, 0. , 0.8, 1.6])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bins(-2.4, 2.4, NUM_DIGITIZED)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## q-learning" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:21:15.848998Z", "start_time": "2023-03-07T14:21:15.838895Z" } }, "outputs": [], "source": [ "class Agent:\n", " def __init__(self, action_space, n_states, eta=0.5, gamma=0.99, NUM_DIGITIZED=6):\n", " self.eta = 0.5\n", " self.gamme = gamma\n", " # Discrete(2)\n", " self.action_space = action_space\n", " self.NUM_DIGITIZED = NUM_DIGITIZED\n", " self.q_table = np.random.uniform(0, 1, size=(NUM_DIGITIZED**n_states, self.action_space.n))\n", " \n", " # 分桶, 5个值,对应 6 个分段,即 6 个桶 (0, 1, 2, 3, 4, 5)\n", " @staticmethod\n", " def _bins(clip_min, clip_max, num_bins):\n", " return np.linspace(clip_min, clip_max, num_bins+1)[1:-1]\n", "\n", " # 按 6 进制映射将 4位 6 进制数映射为 id,\n", " @staticmethod\n", " def _digitize_state(observation, NUM_DIGITIZED):\n", " pos, cart_v, angle, pole_v = observation\n", " digitized = [np.digitize(pos, bins=Agent._bins(-2.4, 2.4, NUM_DIGITIZED)), \n", " np.digitize(cart_v, bins=Agent._bins(-3., 3, NUM_DIGITIZED)), \n", " np.digitize(angle, bins=Agent._bins(-0.418, 0.418, NUM_DIGITIZED)), \n", " np.digitize(pole_v, bins=Agent._bins(-2, 2, NUM_DIGITIZED))]\n", " # 3,1,2,4 (4位10进制数) = 4*10^0 + 2*10^1 + 1*10^2 + 3*10^3,最终的取值范围是 0-9999,总计 10^4 == 10000\n", " # a,b,c,d (4位6进制数) = d*6^0 + c*6^1 + b*6^2 + a*6^3,最终的取值范围是 0-`5555`(1295),总计 6^4 == 1296\n", " ind = sum([d*(NUM_DIGITIZED**i) for i, d in enumerate(digitized)])\n", " return ind\n", "\n", "# def update_q_table()\n", " def q_learning(self, obs, action, reward, obs_next):\n", " obs_ind = Agent._digitize_state(obs, self.NUM_DIGITIZED)\n", " obs_next_ind = Agent._digitize_state(obs_next, self.NUM_DIGITIZED)\n", " self.q_table[obs_ind, action] = self.q_table[obs_ind, action] + self.eta*(reward + max(self.q_table[obs_next_ind, :]) - self.q_table[obs_ind, action])\n", " \n", " def choose_action(self, state, episode):\n", " eps = 0.5*1/(episode + 1)\n", " state_ind = Agent._digitize_state(state, self.NUM_DIGITIZED)\n", " # epsilon greedy\n", " if random.random() < eps:\n", " action = self.action_space.sample()\n", " else:\n", " action = np.argmax(self.q_table[state_ind, :])\n", " return action" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:25:28.552642Z", "start_time": "2023-03-07T14:25:15.162622Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "episode: 0, finish 15 time steps.\n", "episode: 1, finish 9 time steps.\n", "episode: 2, finish 44 time steps.\n", "episode: 3, finish 21 time steps.\n", "episode: 4, finish 14 time steps.\n", "episode: 5, finish 79 time steps.\n", "episode: 6, finish 45 time steps.\n", "episode: 7, finish 8 time steps.\n", "episode: 8, finish 12 time steps.\n", "episode: 9, finish 26 time steps.\n", "episode: 10, finish 71 time steps.\n", "episode: 11, finish 91 time steps.\n", "episode: 12, finish 66 time steps.\n", "episode: 13, finish 40 time steps.\n", "episode: 14, finish 57 time steps.\n", "episode: 15, finish 14 time steps.\n", "episode: 16, finish 9 time steps.\n", "episode: 17, finish 125 time steps.\n", "episode: 18, finish 9 time steps.\n", "episode: 19, finish 22 time steps.\n", "episode: 20, finish 30 time steps.\n", "episode: 21, finish 54 time steps.\n", "episode: 22, finish 34 time steps.\n", "episode: 23, finish 37 time steps.\n", "episode: 24, finish 12 time steps.\n", "episode: 25, finish 8 time steps.\n", "episode: 26, finish 53 time steps.\n", "episode: 27, finish 9 time steps.\n", "episode: 28, finish 95 time steps.\n", "episode: 29, finish 48 time steps.\n", "episode: 30, finish 23 time steps.\n", "episode: 31, finish 12 time steps.\n", "episode: 32, finish 84 time steps.\n", "episode: 33, finish 10 time steps.\n", "episode: 34, finish 63 time steps.\n", "episode: 35, finish 23 time steps.\n", "episode: 36, finish 85 time steps.\n", "episode: 37, finish 10 time steps.\n", "episode: 38, finish 73 time steps.\n", "episode: 39, finish 100 time steps.\n", "episode: 40, finish 81 time steps.\n", "episode: 41, finish 68 time steps.\n", "episode: 42, finish 92 time steps.\n", "episode: 43, finish 129 time steps.\n", "episode: 44, finish 15 time steps.\n", "episode: 45, finish 96 time steps.\n", "episode: 46, finish 10 time steps.\n", "episode: 47, finish 7 time steps.\n", "episode: 48, finish 7 time steps.\n", "episode: 49, finish 9 time steps.\n", "episode: 50, finish 38 time steps.\n", "episode: 51, finish 85 time steps.\n", "episode: 52, finish 90 time steps.\n", "episode: 53, finish 18 time steps.\n", "episode: 54, finish 80 time steps.\n", "episode: 55, finish 104 time steps.\n", "episode: 56, finish 156 time steps.\n", "episode: 57, finish 183 time steps.\n", "episode: 58, finish 25 time steps.\n", "episode: 59, finish 121 time steps.\n", "episode: 60, finish 122 time steps.\n", "episode: 61, finish 112 time steps.\n", "episode: 62, finish 19 time steps.\n", "episode: 63, finish 56 time steps.\n", "episode: 64, finish 183 time steps.\n", "episode: 65, finish 35 time steps.\n", "episode: 66, finish 23 time steps.\n", "episode: 67, finish 146 time steps.\n", "episode: 68, finish 58 time steps.\n", "episode: 69, finish 114 time steps.\n", "episode: 70, finish 39 time steps.\n", "episode: 71, finish 107 time steps.\n", "episode: 72, finish 58 time steps.\n", "episode: 73, finish 189 time steps.\n", "episode: 74, finish 27 time steps.\n", "episode: 75, finish 106 time steps.\n", "episode: 76, finish 102 time steps.\n", "episode: 77, finish 109 time steps.\n", "episode: 78, finish 48 time steps.\n", "episode: 79, finish 85 time steps.\n", "episode: 80, finish 82 time steps.\n", "episode: 81, finish 90 time steps.\n", "episode: 82, finish 199 time steps.\n", "episode: 83, finish 10 time steps.\n", "episode: 84, finish 120 time steps.\n", "episode: 85, finish 59 time steps.\n", "episode: 86, finish 168 time steps.\n", "episode: 87, finish 199 time steps.\n", "episode: 88, finish 166 time steps.\n", "episode: 89, finish 199 time steps.\n", "episode: 90, finish 43 time steps.\n", "episode: 91, finish 131 time steps.\n", "episode: 92, finish 54 time steps.\n", "episode: 93, finish 191 time steps.\n", "episode: 94, finish 199 time steps.\n", "episode: 95, finish 71 time steps.\n", "episode: 96, finish 199 time steps.\n", "episode: 97, finish 167 time steps.\n", "episode: 98, finish 199 time steps.\n", "episode: 99, finish 102 time steps.\n", "episode: 100, finish 27 time steps.\n", "episode: 101, finish 184 time steps.\n", "episode: 102, finish 122 time steps.\n", "episode: 103, finish 166 time steps.\n", "episode: 104, finish 120 time steps.\n", "episode: 105, finish 39 time steps.\n", "episode: 106, finish 116 time steps.\n", "episode: 107, finish 155 time steps.\n", "episode: 108, finish 109 time steps.\n", "episode: 109, finish 199 time steps.\n", "episode: 110, finish 31 time steps.\n", "episode: 111, finish 199 time steps.\n", "episode: 112, finish 152 time steps.\n", "episode: 113, finish 199 time steps.\n", "episode: 114, finish 117 time steps.\n", "episode: 115, finish 95 time steps.\n", "episode: 116, finish 165 time steps.\n", "episode: 117, finish 143 time steps.\n", "episode: 118, finish 32 time steps.\n", "episode: 119, finish 9 time steps.\n", "episode: 120, finish 55 time steps.\n", "episode: 121, finish 177 time steps.\n", "episode: 122, finish 199 time steps.\n", "episode: 123, finish 164 time steps.\n", "episode: 124, finish 80 time steps.\n", "episode: 125, finish 42 time steps.\n", "episode: 126, finish 135 time steps.\n", "episode: 127, finish 46 time steps.\n", "episode: 128, finish 42 time steps.\n", "episode: 129, finish 199 time steps.\n", "episode: 130, finish 112 time steps.\n", "episode: 131, finish 18 time steps.\n", "episode: 132, finish 17 time steps.\n", "episode: 133, finish 8 time steps.\n", "episode: 134, finish 55 time steps.\n", "episode: 135, finish 113 time steps.\n", "episode: 136, finish 39 time steps.\n", "episode: 137, finish 198 time steps.\n", "episode: 138, finish 130 time steps.\n", "episode: 139, finish 199 time steps.\n", "episode: 140, finish 37 time steps.\n", "episode: 141, finish 48 time steps.\n", "episode: 142, finish 42 time steps.\n", "episode: 143, finish 170 time steps.\n", "episode: 144, finish 176 time steps.\n", "episode: 145, finish 199 time steps.\n", "episode: 146, finish 136 time steps.\n", "episode: 147, finish 94 time steps.\n", "episode: 148, finish 199 time steps.\n", "episode: 149, finish 190 time steps.\n", "episode: 150, finish 95 time steps.\n", "episode: 151, finish 199 time steps.\n", "episode: 152, finish 34 time steps.\n", "episode: 153, finish 24 time steps.\n", "episode: 154, finish 180 time steps.\n", "episode: 155, finish 103 time steps.\n", "episode: 156, finish 157 time steps.\n", "episode: 157, finish 199 time steps.\n", "episode: 158, finish 140 time steps.\n", "episode: 159, finish 154 time steps.\n", "episode: 160, finish 83 time steps.\n", "episode: 161, finish 148 time steps.\n", "episode: 162, finish 86 time steps.\n", "episode: 163, finish 87 time steps.\n", "episode: 164, finish 145 time steps.\n", "episode: 165, finish 139 time steps.\n", "episode: 166, finish 199 time steps.\n", "episode: 167, finish 84 time steps.\n", "episode: 168, finish 191 time steps.\n", "episode: 169, finish 162 time steps.\n", "episode: 170, finish 137 time steps.\n", "episode: 171, finish 115 time steps.\n", "episode: 172, finish 117 time steps.\n", "episode: 173, finish 199 time steps.\n", "episode: 174, finish 199 time steps.\n", "episode: 175, finish 199 time steps.\n", "episode: 176, finish 90 time steps.\n", "episode: 177, finish 199 time steps.\n", "episode: 178, finish 199 time steps.\n", "episode: 179, finish 199 time steps.\n", "episode: 180, finish 125 time steps.\n", "episode: 181, finish 199 time steps.\n", "episode: 182, finish 199 time steps.\n", "episode: 183, finish 199 time steps.\n", "episode: 184, finish 199 time steps.\n", "episode: 185, finish 199 time steps.\n", "episode: 186, finish 199 time steps.\n", "episode: 187, finish 199 time steps.\n", "episode: 188, finish 199 time steps.\n", "episode: 189, finish 199 time steps.\n", "episode: 190, finish 199 time steps.\n", "continue success(step > 195) more than 10 times \n", "episode: 191, finish 199 time steps.\n" ] } ], "source": [ "env = gym.make('CartPole-v0')\n", "env.reset()\n", "action_space = env.action_space\n", "n_states = env.observation_space.shape[0]\n", "\n", "agent = Agent(action_space, n_states)\n", "\n", "max_episodes = 1000\n", "max_steps = 200\n", "\n", "continue_success_episodes = 0\n", "learning_finish_flag = False\n", "\n", "frames = []\n", "\n", "for episode in range(max_episodes):\n", " obs = env.reset()\n", " for step in range(max_steps):\n", " if learning_finish_flag:\n", " frames.append(env.render(mode='rgb_array'))\n", " action = agent.choose_action(obs, episode)\n", " obs_next, _, done, _ = env.step(action)\n", " if done:\n", " if step < 195:\n", " reward = -1\n", " continue_success_episodes = 0\n", " else:\n", " reward = 1\n", " continue_success_episodes += 1\n", " else:\n", " reward = 0\n", " \n", " agent.q_learning(obs, action, reward, obs_next)\n", " \n", " if done:\n", " print(f'episode: {episode}, finish {step} time steps.')\n", " break\n", " \n", " obs = obs_next\n", " \n", " if learning_finish_flag:\n", " break\n", " if continue_success_episodes >= 10:\n", " learning_finish_flag = True\n", " print(f'continue success(step > 195) more than 10 times ')\n" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "ExecuteTime": { "end_time": "2023-03-07T14:27:17.476903Z", "start_time": "2023-03-07T14:25:53.586819Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5gAAAJqCAYAAABO5e8bAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAARD0lEQVR4nO3dQY+cdQHH8f+zu+x2KbJqEwNCjMFoSEDFCPGgB8NFExPilQMvg7fgG+DUCwlnEm+QeBD1oIkejBKUWMBqqlKDNoW6LUvLPh4gIIZtYf3OzG79fI7znyfzO+53npnZaZ7nAQAAAP+rtVUPAAAA4OYgMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASGzc4Nz/MAEAAOA/TQcduIMJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQ2Vj0AALg57V3653jt9z871LUbWyfHHQ98J14EwKIJTABgIa5evjj+/tsfHerazU+cEpgAx5CPyAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBCYAIAAJAQmAAAACQEJgAAAAmBCQAAQEJgAgAAkBCYAAAAJAQmAAAACYEJAABAQmACAACQEJgAAAAkBCYAAAAJgQkAAEBimuf5eufXPQQAjr5nnnlmPPXUU0t/3c/urI/HHrr9UNdevPL2OP3zN+JFNzZN03jyySfHyZMnl/7aAMfIdNDBxjJXAADLd+bMmfH0008v/XW/fM9nxmMPff9Q1+7u7q5k8zRN4/Tp00t/XYCbhY/IAgAAkHAHEwBYqg/7ds504IetADhOBCYAsHD789rY298e8zyNX1743nh7fv9PkDtP/HHcc9vz48TartAEOOYEJgCwUPM8xiu7Xxl/uPTQu498sCLPXr5/nL18/3hg5yfj7ltfXv5AADK+gwkALNQru18dZy49ON4Jyw+7RfnO4y+88a1x7vIXlzsOgJQ7mADAwpzdvW+cufT1MX+E97SvzZvjhTe++W5u/nrx4wDIuYMJACzEW/snxoW37hj7H+P97LfnzfGb17899va3FzcMgIURmADAQuxe2xmvvvmFVc8AYIkEJgBw5Fzd31r1BAAOQWACAEfMNH514burHgHAIQhMAOCImcc9J59f9QgADkFgAgBHzp3bZ1c9AYBDEJgAwELcsrY3Tq5fXPUMAJZIYAIAC3HbxsVx9/ZLH/u6u7dfGhvT1QUsAmDRBCYAsDCfu/XFcWrzb2OM+SM8ex53bZ8Z993+i7EuMAGOJYEJACzM1vqb4xuffnac2nz1Bs+cx13bL48Hdn46bll7aynbAOhtrHoAAHBzW5v2x9c++ePxlytfGmOMcebSg2N/rL93/qlbzo87TvxpfP7k78Y0rWolAAWBCQAsxMt/vTAe+8EP/+vRabx+9dQY4/2S3Fy7MrbX//WBZ129tr/4gQDkBCYAsBBX9q6NF//8jw85eW3pWwBYDt/BBAAAIHHdO5gPP/zwsnYAAAty7ty5VU84NuZ5Ho888sjY2PAhL4CDPPfccweeTfN88M+G7+3tfZTfFAcAjrAnnnhiPP7446uecSxM0zTOnz8/dnZ2Vj0F4Mja2to68CfZrvv23NbWVr8GAFiq9fX1Gz+J92xubvobCOCQfAcTAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABIbqx4AACzWvffeOx599NFVzzgWpmkam5ubq54BcGxN8zxf7/y6hwAAAPzfmQ468BFZAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASAhMAAAAEgITAACAhMAEAAAgITABAABICEwAAAASAhMAAICEwAQAACCxcYPzaSkrAAAAOPbcwQQAACAhMAEAAEgITAAAABICEwAAgITABAAAICEwAQAASPwb9M/Acx0K05MAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "display_frames_as_gif(frames, output='./save/cart_pole_q_learrning.gif')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.3" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }