{ "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.10" }, "orig_nbformat": 2, "kernelspec": { "name": "python3710jvsc74a57bd0fbea1422c2cf61ed9c0cfc03f38f71cc9083cc288606edc4170b5309b352ce27", "display_name": "Python 3.7.10 64-bit ('py37': conda)" } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "from pathlib import Path\n", "curr_path = str(Path().absolute())\n", "parent_path = str(Path().absolute().parent)\n", "sys.path.append(parent_path) # add current terminal path to sys.path\n", "\n", "import gym\n", "import datetime\n", "\n", "from envs.gridworld_env import CliffWalkingWapper\n", "from QLearning.agent import QLearning\n", "from common.plot import plot_rewards\n", "from common.utils import save_results,make_dir\n", "curr_time = datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\") # obtain current time" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class QlearningConfig:\n", " '''训练相关参数'''\n", " def __init__(self):\n", " self.algo = 'Qlearning'\n", " self.env = 'CliffWalking-v0' # 0 up, 1 right, 2 down, 3 left\n", " self.result_path = curr_path+\"/outputs/\" +self.env+'/'+curr_time+'/results/' # path to save results\n", " self.model_path = curr_path+\"/outputs/\" +self.env+'/'+curr_time+'/models/' # path to save models\n", " self.train_eps = 300 # 训练的episode数目\n", " self.eval_eps = 30\n", " self.gamma = 0.9 # reward的衰减率\n", " self.epsilon_start = 0.95 # e-greedy策略中初始epsilon\n", " self.epsilon_end = 0.01 # e-greedy策略中的终止epsilon\n", " self.epsilon_decay = 200 # e-greedy策略中epsilon的衰减率\n", " self.lr = 0.1 # learning rate" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def env_agent_config(cfg,seed=1):\n", " env = gym.make(cfg.env) \n", " env = CliffWalkingWapper(env)\n", " env.seed(seed)\n", " state_dim = env.observation_space.n\n", " action_dim = env.action_space.n\n", " agent = QLearning(state_dim,action_dim,cfg)\n", " return env,agent" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def train(cfg,env,agent):\n", " rewards = [] \n", " ma_rewards = [] # moving average reward\n", " for i_ep in range(cfg.train_eps):\n", " ep_reward = 0 # 记录每个episode的reward\n", " state = env.reset() # 重置环境, 重新开一局(即开始新的一个episode)\n", " while True:\n", " action = agent.choose_action(state) # 根据算法选择一个动作\n", " next_state, reward, done, _ = env.step(action) # 与环境进行一次动作交互\n", " agent.update(state, action, reward, next_state, done) # Q-learning算法更新\n", " state = next_state # 存储上一个观察值\n", " ep_reward += reward\n", " if done:\n", " break\n", " rewards.append(ep_reward)\n", " if ma_rewards:\n", " ma_rewards.append(ma_rewards[-1]*0.9+ep_reward*0.1)\n", " else:\n", " ma_rewards.append(ep_reward)\n", " if (i_ep+1)%10==0:\n", " print(\"Episode:{}/{}: reward:{:.1f}\".format(i_ep+1, cfg.train_eps,ep_reward))\n", " return rewards,ma_rewards" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def eval(cfg,env,agent):\n", " # env = gym.make(\"FrozenLake-v0\", is_slippery=False) # 0 left, 1 down, 2 right, 3 up\n", " # env = FrozenLakeWapper(env)\n", " rewards = [] # 记录所有episode的reward\n", " ma_rewards = [] # 滑动平均的reward\n", " for i_ep in range(cfg.eval_eps):\n", " ep_reward = 0 # 记录每个episode的reward\n", " state = env.reset() # 重置环境, 重新开一局(即开始新的一个episode)\n", " while True:\n", " action = agent.predict(state) # 根据算法选择一个动作\n", " next_state, reward, done, _ = env.step(action) # 与环境进行一个交互\n", " state = next_state # 存储上一个观察值\n", " ep_reward += reward\n", " if done:\n", " break\n", " rewards.append(ep_reward)\n", " if ma_rewards:\n", " ma_rewards.append(ma_rewards[-1]*0.9+ep_reward*0.1)\n", " else:\n", " ma_rewards.append(ep_reward)\n", " if (i_ep+1)%10==0:\n", " print(f\"Episode:{i_ep+1}/{cfg.eval_eps}, reward:{ep_reward:.1f}\")\n", " return rewards,ma_rewards" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Episode:10/300: reward:-158.0\n", "Episode:20/300: reward:-131.0\n", "Episode:30/300: reward:-37.0\n", "Episode:40/300: reward:-93.0\n", "Episode:50/300: reward:-47.0\n", "Episode:60/300: reward:-67.0\n", "Episode:70/300: reward:-56.0\n", "Episode:80/300: reward:-44.0\n", "Episode:90/300: reward:-41.0\n", "Episode:100/300: reward:-61.0\n", "Episode:110/300: reward:-52.0\n", "Episode:120/300: reward:-14.0\n", "Episode:130/300: reward:-44.0\n", "Episode:140/300: reward:-31.0\n", "Episode:150/300: reward:-17.0\n", "Episode:160/300: reward:-35.0\n", "Episode:170/300: reward:-34.0\n", "Episode:180/300: reward:-16.0\n", "Episode:190/300: reward:-20.0\n", "Episode:200/300: reward:-25.0\n", "Episode:210/300: reward:-13.0\n", "Episode:220/300: reward:-16.0\n", "Episode:230/300: reward:-20.0\n", "Episode:240/300: reward:-27.0\n", "Episode:250/300: reward:-17.0\n", "Episode:260/300: reward:-14.0\n", "Episode:270/300: reward:-15.0\n", "Episode:280/300: reward:-20.0\n", "Episode:290/300: reward:-13.0\n", "Episode:300/300: reward:-13.0\n", "results saved!\n" ] }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-29T17:04:54.671110\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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", "image/png": "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\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Episode:10/30, reward:-13.0\nEpisode:20/30, reward:-13.0\nEpisode:30/30, reward:-13.0\nresults saved!\n" ] }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-29T17:04:55.053953\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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 \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", "image/png": "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h2XLlt310/j9tGvXjr1793LhwgUaNWoEYJt+2rFjh+2DU2RkJIMHD8bX15dKlSoRFRWV6z51c3OjWbNmjBs3jrFjx2a7Q+xemjVrxunTp/nll18A2LZtG1evXsVkMjF9+nQ2btzIxo0bGTBgAHDzmuO6des4cuQIXbt2BW7e7bRz504SExMxDIPVq1fTuXPnfO2XwqIzhNv4+/vz3nvv4ePjg6OjI82bN2f79u22T4G+vr7MnTs32y/kkSNHMnv2bHr37o3FYqFBgwaMHz8+R9/16tWjQ4cOeHl54eLiwt/+9jeefPJJzpw5Q9u2bXnxxRfp378/pUuXpk6dOrZPtQ/a/+0CAwOZOnUqPj4+pKen06NHD3r27MmlS5dsFztLlChBq1atuHLlCikpKYW7I4EJEyYwceJEfHx8qFChAtWrV89xIRHg73//O9OnT6dXr15YLBa8vb3p0qULjRo14r333qNr1648/vjjtGjR4p7b8/Pz45133mHhwoX33Q93CgwMZMqUKaxbt4709HR8fHzo06fPPbdnNptZvHgxn376Kb1797Z92i5btiwJCQl899132T4Zt23bluHDhzNs2DBMJhNOTk588sknmEwmxowZw1tvvUX58uUpU6aMba68sNWuXZsJEybw6quvUrJkSRo0aGD7ObuXu+2f8+fP37NdzZo1+eyzz5g3bx6zZ8/GarXi6urKwoULqVu3LufOnctzDTVq1CAzMxMPD49sHzDatm3L9u3beeKJJwB46623mDNnDp9++imOjo40a9bsnvu0d+/ebNu2jVmzZuUI89xUqFCBuXPnMm7cOBwcHHj66acxm8133Z+33u/atavtDK9+/fq89dZbDB48mIyMDBo3blykF5QB3Xb6KIiJiTH+93//1/Y6JCTEeOedd4puQIVg+fLlxuHDhw3DMIy0tDSjb9++xq5du4p4VH+O+Pj4At+y+TCcPXvWCA4ONiwWi2EYhrFt2zajX79+RTyq4ik5OdmYPXu2cf36dcMwDOOnn34yPDw8DKvVWsQjKxidITwCateuzRdffMGaNWswmUxUq1aNqVOnFvWwCuTJJ59k6tSpWK1WMjIy6Natm+103t65ubnZbk9+lDz22GPEx8fbzoCdnZ2ZMWNGUQ+rWHJycqJEiRL069cPs9mM2Wxm3rx5uU6LFicmw9AX5IiIiC4qi4hI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\n" }, "metadata": {} } ], "source": [ "cfg = QlearningConfig()\n", "env,agent = env_agent_config(cfg,seed=1)\n", "rewards,ma_rewards = train(cfg,env,agent)\n", "make_dir(cfg.result_path,cfg.model_path)\n", "agent.save(path=cfg.model_path)\n", "save_results(rewards,ma_rewards,tag='train',path=cfg.result_path)\n", "plot_rewards(rewards,ma_rewards,tag=\"train\",env=cfg.env,algo = cfg.algo,path=cfg.result_path)\n", "\n", "env,agent = env_agent_config(cfg,seed=10)\n", "agent.load(path=cfg.model_path)\n", "rewards,ma_rewards = eval(cfg,env,agent)\n", "save_results(rewards,ma_rewards,tag='eval',path=cfg.result_path)\n", "plot_rewards(rewards,ma_rewards,tag=\"eval\",env=cfg.env,algo = cfg.algo,path=cfg.result_path)" ] } ] }