{ "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-final" }, "orig_nbformat": 2, "kernelspec": { "name": "python3", "display_name": "Python 3", "language": "python" } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys,os\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", "import gym\n", "import torch\n", "import datetime\n", "from DQN.agent import DQN\n", "from common.plot import plot_rewards\n", "from common.utils import save_results" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "SEQUENCE = datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\") # 获取当前时间\n", "SAVED_MODEL_PATH = curr_path+\"/saved_model/\"+SEQUENCE+'/' # 生成保存的模型路径\n", "if not os.path.exists(curr_path+\"/saved_model/\"): # 检测是否存在文件夹\n", " os.mkdir(curr_path+\"/saved_model/\")\n", "if not os.path.exists(SAVED_MODEL_PATH): # 检测是否存在文件夹\n", " os.mkdir(SAVED_MODEL_PATH)\n", "RESULT_PATH = curr_path+\"/results/\"+SEQUENCE+'/' # 存储reward的路径\n", "if not os.path.exists(curr_path+\"/results/\"): # 检测是否存在文件夹\n", " os.mkdir(curr_path+\"/results/\")\n", "if not os.path.exists(RESULT_PATH): # 检测是否存在文件夹\n", " os.mkdir(RESULT_PATH)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "class DQNConfig:\n", " def __init__(self):\n", " self.algo = \"DQN\" # 算法名称\n", " self.gamma = 0.99\n", " self.epsilon_start = 0.95 # e-greedy策略的初始epsilon\n", " self.epsilon_end = 0.01\n", " self.epsilon_decay = 200\n", " self.lr = 0.01 # 学习率\n", " self.memory_capacity = 800 # Replay Memory容量\n", " self.batch_size = 64\n", " self.train_eps = 300 # 训练的episode数目\n", " self.train_steps = 200 # 训练每个episode的最大长度\n", " self.target_update = 2 # target net的更新频率\n", " self.eval_eps = 20 # 测试的episode数目\n", " self.eval_steps = 200 # 测试每个episode的最大长度\n", " self.device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\") # 检测gpu\n", " self.hidden_dim = 128 # 神经网络隐藏层维度" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def train(cfg,env,agent):\n", " print('Start to train !')\n", " rewards = []\n", " ma_rewards = [] # 滑动平均的reward\n", " ep_steps = []\n", " for i_episode in range(cfg.train_eps):\n", " state = env.reset() # reset环境状态\n", " ep_reward = 0\n", " for i_step in range(cfg.train_steps):\n", " action = agent.choose_action(state) # 根据当前环境state选择action\n", " next_state, reward, done, _ = env.step(action) # 更新环境参数\n", " ep_reward += reward\n", " agent.memory.push(state, action, reward, next_state, done) # 将state等这些transition存入memory\n", " state = next_state # 跳转到下一个状态\n", " agent.update() # 每步更新网络\n", " if done:\n", " break\n", " # 更新target network,复制DQN中的所有weights and biases\n", " if i_episode % cfg.target_update == 0:\n", " agent.target_net.load_state_dict(agent.policy_net.state_dict())\n", " print('Episode:{}/{}, Reward:{}, Steps:{}, Done:{}'.format(i_episode+1,cfg.train_eps,ep_reward,i_step+1,done))\n", " ep_steps.append(i_step)\n", " rewards.append(ep_reward)\n", " # 计算滑动窗口的reward\n", " if ma_rewards:\n", " ma_rewards.append(\n", " 0.9*ma_rewards[-1]+0.1*ep_reward)\n", " else:\n", " ma_rewards.append(ep_reward) \n", " print('Complete training!')\n", " return rewards,ma_rewards" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [] }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Start to train !\n", "Episode:1/300, Reward:41.0, Steps:41, Done:True\n", "Episode:2/300, Reward:23.0, Steps:23, Done:True\n", "Episode:3/300, Reward:19.0, Steps:19, Done:True\n", "Episode:4/300, Reward:17.0, Steps:17, Done:True\n", "Episode:5/300, Reward:14.0, Steps:14, Done:True\n", "Episode:6/300, Reward:15.0, Steps:15, Done:True\n", "Episode:7/300, Reward:10.0, Steps:10, Done:True\n", "Episode:8/300, Reward:23.0, Steps:23, Done:True\n", "Episode:9/300, Reward:14.0, Steps:14, Done:True\n", "Episode:10/300, Reward:9.0, Steps:9, Done:True\n", "Episode:11/300, Reward:9.0, Steps:9, Done:True\n", "Episode:12/300, Reward:9.0, Steps:9, Done:True\n", "Episode:13/300, Reward:9.0, Steps:9, Done:True\n", "Episode:14/300, Reward:10.0, Steps:10, Done:True\n", "Episode:15/300, Reward:10.0, Steps:10, Done:True\n", "Episode:16/300, Reward:12.0, Steps:12, Done:True\n", "Episode:17/300, Reward:10.0, Steps:10, Done:True\n", "Episode:18/300, Reward:10.0, Steps:10, Done:True\n", "Episode:19/300, Reward:9.0, Steps:9, Done:True\n", "Episode:20/300, Reward:10.0, Steps:10, Done:True\n", "Episode:21/300, Reward:8.0, Steps:8, Done:True\n", "Episode:22/300, Reward:10.0, Steps:10, Done:True\n", "Episode:23/300, Reward:10.0, Steps:10, Done:True\n", "Episode:24/300, Reward:13.0, Steps:13, Done:True\n", "Episode:25/300, Reward:10.0, Steps:10, Done:True\n", "Episode:26/300, Reward:9.0, Steps:9, Done:True\n", "Episode:27/300, Reward:9.0, Steps:9, Done:True\n", "Episode:28/300, Reward:9.0, Steps:9, Done:True\n", "Episode:29/300, Reward:12.0, Steps:12, Done:True\n", "Episode:30/300, Reward:9.0, Steps:9, Done:True\n", "Episode:31/300, Reward:9.0, Steps:9, Done:True\n", "Episode:32/300, Reward:10.0, Steps:10, Done:True\n", "Episode:33/300, Reward:11.0, Steps:11, Done:True\n", "Episode:34/300, Reward:12.0, Steps:12, Done:True\n", "Episode:35/300, Reward:8.0, Steps:8, Done:True\n", "Episode:36/300, Reward:10.0, Steps:10, Done:True\n", "Episode:37/300, Reward:9.0, Steps:9, Done:True\n", "Episode:38/300, Reward:10.0, Steps:10, Done:True\n", "Episode:39/300, Reward:10.0, Steps:10, Done:True\n", "Episode:40/300, Reward:10.0, Steps:10, Done:True\n", "Episode:41/300, Reward:9.0, Steps:9, Done:True\n", "Episode:42/300, Reward:10.0, Steps:10, Done:True\n", "Episode:43/300, Reward:10.0, Steps:10, Done:True\n", "Episode:44/300, Reward:10.0, Steps:10, Done:True\n", "Episode:45/300, Reward:9.0, Steps:9, Done:True\n", "Episode:46/300, Reward:22.0, Steps:22, Done:True\n", "Episode:47/300, Reward:74.0, Steps:74, Done:True\n", "Episode:48/300, Reward:13.0, Steps:13, Done:True\n", "Episode:49/300, Reward:29.0, Steps:29, Done:True\n", "Episode:50/300, Reward:56.0, Steps:56, Done:True\n", "Episode:51/300, Reward:74.0, Steps:74, Done:True\n", "Episode:52/300, Reward:85.0, Steps:85, Done:True\n", "Episode:53/300, Reward:72.0, Steps:72, Done:True\n", "Episode:54/300, Reward:114.0, Steps:114, Done:True\n", "Episode:55/300, Reward:97.0, Steps:97, Done:True\n", "Episode:56/300, Reward:101.0, Steps:101, Done:True\n", "Episode:57/300, Reward:104.0, Steps:104, Done:True\n", "Episode:58/300, Reward:58.0, Steps:58, Done:True\n", "Episode:59/300, Reward:11.0, Steps:11, Done:True\n", "Episode:60/300, Reward:56.0, Steps:56, Done:True\n", "Episode:61/300, Reward:74.0, Steps:74, Done:True\n", "Episode:62/300, Reward:51.0, Steps:51, Done:True\n", "Episode:63/300, Reward:113.0, Steps:113, Done:True\n", "Episode:64/300, Reward:48.0, Steps:48, Done:True\n", "Episode:65/300, Reward:97.0, Steps:97, Done:True\n", "Episode:66/300, Reward:59.0, Steps:59, Done:True\n", "Episode:67/300, Reward:200.0, Steps:200, Done:True\n", "Episode:68/300, Reward:67.0, Steps:67, Done:True\n", "Episode:69/300, Reward:200.0, Steps:200, Done:True\n", "Episode:70/300, Reward:45.0, Steps:45, Done:True\n", "Episode:71/300, Reward:48.0, Steps:48, Done:True\n", "Episode:72/300, Reward:90.0, Steps:90, Done:True\n", "Episode:73/300, Reward:47.0, Steps:47, Done:True\n", "Episode:74/300, Reward:94.0, Steps:94, Done:True\n", "Episode:75/300, Reward:107.0, Steps:107, Done:True\n", "Episode:76/300, Reward:12.0, Steps:12, Done:True\n", "Episode:77/300, Reward:30.0, Steps:30, Done:True\n", "Episode:78/300, Reward:62.0, Steps:62, Done:True\n", "Episode:79/300, Reward:64.0, Steps:64, Done:True\n", "Episode:80/300, Reward:41.0, Steps:41, Done:True\n", "Episode:81/300, Reward:67.0, Steps:67, Done:True\n", "Episode:82/300, Reward:45.0, Steps:45, Done:True\n", "Episode:83/300, Reward:130.0, Steps:130, Done:True\n", "Episode:84/300, Reward:50.0, Steps:50, Done:True\n", "Episode:85/300, Reward:51.0, Steps:51, Done:True\n", "Episode:86/300, Reward:67.0, Steps:67, Done:True\n", "Episode:87/300, Reward:37.0, Steps:37, Done:True\n", "Episode:88/300, Reward:41.0, Steps:41, Done:True\n", "Episode:89/300, Reward:54.0, Steps:54, Done:True\n", "Episode:90/300, Reward:93.0, Steps:93, Done:True\n", "Episode:91/300, Reward:71.0, Steps:71, Done:True\n", "Episode:92/300, Reward:102.0, Steps:102, Done:True\n", "Episode:93/300, Reward:55.0, Steps:55, Done:True\n", "Episode:94/300, Reward:73.0, Steps:73, Done:True\n", "Episode:95/300, Reward:61.0, Steps:61, Done:True\n", "Episode:96/300, Reward:16.0, Steps:16, Done:True\n", "Episode:97/300, Reward:61.0, Steps:61, Done:True\n", "Episode:98/300, Reward:79.0, Steps:79, Done:True\n", "Episode:99/300, Reward:76.0, Steps:76, Done:True\n", "Episode:100/300, Reward:32.0, Steps:32, Done:True\n", "Episode:101/300, Reward:95.0, Steps:95, Done:True\n", "Episode:102/300, Reward:83.0, Steps:83, Done:True\n", "Episode:103/300, Reward:41.0, Steps:41, Done:True\n", "Episode:104/300, Reward:30.0, Steps:30, Done:True\n", "Episode:105/300, Reward:83.0, Steps:83, Done:True\n", "Episode:106/300, Reward:95.0, Steps:95, Done:True\n", "Episode:107/300, Reward:104.0, Steps:104, Done:True\n", "Episode:108/300, Reward:98.0, Steps:98, Done:True\n", "Episode:109/300, Reward:109.0, Steps:109, Done:True\n", "Episode:110/300, Reward:63.0, Steps:63, Done:True\n", "Episode:111/300, Reward:98.0, Steps:98, Done:True\n", "Episode:112/300, Reward:105.0, Steps:105, Done:True\n", "Episode:113/300, Reward:99.0, Steps:99, Done:True\n", "Episode:114/300, Reward:200.0, Steps:200, Done:True\n", "Episode:115/300, Reward:200.0, Steps:200, Done:True\n", "Episode:116/300, Reward:47.0, Steps:47, Done:True\n", "Episode:117/300, Reward:98.0, Steps:98, Done:True\n", "Episode:118/300, Reward:200.0, Steps:200, Done:True\n", "Episode:119/300, Reward:52.0, Steps:52, Done:True\n", "Episode:120/300, Reward:55.0, Steps:55, Done:True\n", "Episode:121/300, Reward:200.0, Steps:200, Done:True\n", "Episode:122/300, Reward:200.0, Steps:200, Done:True\n", "Episode:123/300, Reward:200.0, Steps:200, Done:True\n", "Episode:124/300, Reward:200.0, Steps:200, Done:True\n", "Episode:125/300, Reward:200.0, Steps:200, Done:True\n", "Episode:126/300, Reward:40.0, Steps:40, Done:True\n", "Episode:127/300, Reward:42.0, Steps:42, Done:True\n", "Episode:128/300, Reward:101.0, Steps:101, Done:True\n", "Episode:129/300, Reward:200.0, Steps:200, Done:True\n", "Episode:130/300, Reward:70.0, Steps:70, Done:True\n", "Episode:131/300, Reward:175.0, Steps:175, Done:True\n", "Episode:132/300, Reward:90.0, Steps:90, Done:True\n", "Episode:133/300, Reward:81.0, Steps:81, Done:True\n", "Episode:134/300, Reward:61.0, Steps:61, Done:True\n", "Episode:135/300, Reward:74.0, Steps:74, Done:True\n", "Episode:136/300, Reward:68.0, Steps:68, Done:True\n", "Episode:137/300, Reward:50.0, Steps:50, Done:True\n", "Episode:138/300, Reward:51.0, Steps:51, Done:True\n", "Episode:139/300, Reward:99.0, Steps:99, Done:True\n", "Episode:140/300, Reward:87.0, Steps:87, Done:True\n", "Episode:141/300, Reward:94.0, Steps:94, Done:True\n", "Episode:142/300, Reward:51.0, Steps:51, Done:True\n", "Episode:143/300, Reward:200.0, Steps:200, Done:True\n", "Episode:144/300, Reward:55.0, Steps:55, Done:True\n", "Episode:145/300, Reward:200.0, Steps:200, Done:True\n", "Episode:146/300, Reward:57.0, Steps:57, Done:True\n", "Episode:147/300, Reward:129.0, Steps:129, Done:True\n", "Episode:148/300, Reward:74.0, Steps:74, Done:True\n", "Episode:149/300, Reward:108.0, Steps:108, Done:True\n", "Episode:150/300, Reward:63.0, Steps:63, Done:True\n", "Episode:151/300, Reward:200.0, Steps:200, Done:True\n", "Episode:152/300, Reward:103.0, Steps:103, Done:True\n", "Episode:153/300, Reward:129.0, Steps:129, Done:True\n", "Episode:154/300, Reward:77.0, Steps:77, Done:True\n", "Episode:155/300, Reward:129.0, Steps:129, Done:True\n", "Episode:156/300, Reward:200.0, Steps:200, Done:True\n", "Episode:157/300, Reward:181.0, Steps:181, Done:True\n", "Episode:158/300, Reward:200.0, Steps:200, Done:True\n", "Episode:159/300, Reward:136.0, Steps:136, Done:True\n", "Episode:160/300, Reward:200.0, Steps:200, Done:True\n", "Episode:161/300, Reward:181.0, Steps:181, Done:True\n", "Episode:162/300, Reward:120.0, Steps:120, Done:True\n", "Episode:163/300, Reward:190.0, Steps:190, Done:True\n", "Episode:164/300, Reward:200.0, Steps:200, Done:True\n", "Episode:165/300, Reward:200.0, Steps:200, Done:True\n", "Episode:166/300, Reward:200.0, Steps:200, Done:True\n", "Episode:167/300, Reward:200.0, Steps:200, Done:True\n", "Episode:168/300, Reward:200.0, Steps:200, Done:True\n", "Episode:169/300, Reward:200.0, Steps:200, Done:True\n", "Episode:170/300, Reward:89.0, Steps:89, Done:True\n", "Episode:171/300, Reward:74.0, Steps:74, Done:True\n", "Episode:172/300, Reward:200.0, Steps:200, Done:True\n", "Episode:173/300, Reward:200.0, Steps:200, Done:True\n", "Episode:174/300, Reward:200.0, Steps:200, Done:True\n", "Episode:175/300, Reward:200.0, Steps:200, Done:True\n", "Episode:176/300, Reward:93.0, Steps:93, Done:True\n", "Episode:177/300, Reward:139.0, Steps:139, Done:True\n", "Episode:178/300, Reward:78.0, Steps:78, Done:True\n", "Episode:179/300, Reward:200.0, Steps:200, Done:True\n", "Episode:180/300, Reward:200.0, Steps:200, Done:True\n", "Episode:181/300, Reward:200.0, Steps:200, Done:True\n", "Episode:182/300, Reward:200.0, Steps:200, Done:True\n", "Episode:183/300, Reward:200.0, Steps:200, Done:True\n", "Episode:184/300, Reward:200.0, Steps:200, Done:True\n", "Episode:185/300, Reward:200.0, Steps:200, Done:True\n", "Episode:186/300, Reward:200.0, Steps:200, Done:True\n", "Episode:187/300, Reward:200.0, Steps:200, Done:True\n", "Episode:188/300, Reward:200.0, Steps:200, Done:True\n", "Episode:189/300, Reward:200.0, Steps:200, Done:True\n", "Episode:190/300, Reward:200.0, Steps:200, Done:True\n", "Episode:191/300, Reward:200.0, Steps:200, Done:True\n", "Episode:192/300, Reward:200.0, Steps:200, Done:True\n", "Episode:193/300, Reward:190.0, Steps:190, Done:True\n", "Episode:194/300, Reward:200.0, Steps:200, Done:True\n", "Episode:195/300, Reward:200.0, Steps:200, Done:True\n", "Episode:196/300, Reward:200.0, Steps:200, Done:True\n", "Episode:197/300, Reward:200.0, Steps:200, Done:True\n", "Episode:198/300, Reward:200.0, Steps:200, Done:True\n", "Episode:199/300, Reward:200.0, Steps:200, Done:True\n", "Episode:200/300, Reward:200.0, Steps:200, Done:True\n", "Episode:201/300, Reward:200.0, Steps:200, Done:True\n", "Episode:202/300, Reward:200.0, Steps:200, Done:True\n", "Episode:203/300, Reward:67.0, Steps:67, Done:True\n", "Episode:204/300, Reward:200.0, Steps:200, Done:True\n", "Episode:205/300, Reward:200.0, Steps:200, Done:True\n", "Episode:206/300, Reward:200.0, Steps:200, Done:True\n", "Episode:207/300, Reward:200.0, Steps:200, Done:True\n", "Episode:208/300, Reward:200.0, Steps:200, Done:True\n", "Episode:209/300, Reward:200.0, Steps:200, Done:True\n", "Episode:210/300, Reward:200.0, Steps:200, Done:True\n", "Episode:211/300, Reward:200.0, Steps:200, Done:True\n", "Episode:212/300, Reward:200.0, Steps:200, Done:True\n", "Episode:213/300, Reward:200.0, Steps:200, Done:True\n", "Episode:214/300, Reward:200.0, Steps:200, Done:True\n", "Episode:215/300, Reward:200.0, Steps:200, Done:True\n", "Episode:216/300, Reward:200.0, Steps:200, Done:True\n", "Episode:217/300, Reward:200.0, Steps:200, Done:True\n", "Episode:218/300, Reward:44.0, Steps:44, Done:True\n", "Episode:219/300, Reward:200.0, Steps:200, Done:True\n", "Episode:220/300, Reward:200.0, Steps:200, Done:True\n", "Episode:221/300, Reward:200.0, Steps:200, Done:True\n", "Episode:222/300, Reward:200.0, Steps:200, Done:True\n", "Episode:223/300, Reward:200.0, Steps:200, Done:True\n", "Episode:224/300, Reward:200.0, Steps:200, Done:True\n", "Episode:225/300, Reward:200.0, Steps:200, Done:True\n", "Episode:226/300, Reward:200.0, Steps:200, Done:True\n", "Episode:227/300, Reward:200.0, Steps:200, Done:True\n", "Episode:228/300, Reward:200.0, Steps:200, Done:True\n", "Episode:229/300, Reward:200.0, Steps:200, Done:True\n", "Episode:230/300, Reward:200.0, Steps:200, Done:True\n", "Episode:231/300, Reward:200.0, Steps:200, Done:True\n", "Episode:232/300, Reward:200.0, Steps:200, Done:True\n", "Episode:233/300, Reward:200.0, Steps:200, Done:True\n", "Episode:234/300, Reward:200.0, Steps:200, Done:True\n", "Episode:235/300, Reward:200.0, Steps:200, Done:True\n", "Episode:236/300, Reward:200.0, Steps:200, Done:True\n", "Episode:237/300, Reward:200.0, Steps:200, Done:True\n", "Episode:238/300, Reward:200.0, Steps:200, Done:True\n", "Episode:239/300, Reward:200.0, Steps:200, Done:True\n", "Episode:240/300, Reward:200.0, Steps:200, Done:True\n", "Episode:241/300, Reward:200.0, Steps:200, Done:True\n", "Episode:242/300, Reward:126.0, Steps:126, Done:True\n", "Episode:243/300, Reward:200.0, Steps:200, Done:True\n", "Episode:244/300, Reward:200.0, Steps:200, Done:True\n", "Episode:245/300, Reward:200.0, Steps:200, Done:True\n", "Episode:246/300, Reward:200.0, Steps:200, Done:True\n", "Episode:247/300, Reward:200.0, Steps:200, Done:True\n", "Episode:248/300, Reward:118.0, Steps:118, Done:True\n", "Episode:249/300, Reward:200.0, Steps:200, Done:True\n", "Episode:250/300, Reward:200.0, Steps:200, Done:True\n", "Episode:251/300, Reward:99.0, Steps:99, Done:True\n", "Episode:252/300, Reward:145.0, Steps:145, Done:True\n", "Episode:253/300, Reward:200.0, Steps:200, Done:True\n", "Episode:254/300, Reward:200.0, Steps:200, Done:True\n", "Episode:255/300, Reward:200.0, Steps:200, Done:True\n", "Episode:256/300, Reward:200.0, Steps:200, Done:True\n", "Episode:257/300, Reward:130.0, Steps:130, Done:True\n", "Episode:258/300, Reward:170.0, Steps:170, Done:True\n", "Episode:259/300, Reward:200.0, Steps:200, Done:True\n", "Episode:260/300, Reward:200.0, Steps:200, Done:True\n", "Episode:261/300, Reward:200.0, Steps:200, Done:True\n", "Episode:262/300, Reward:200.0, Steps:200, Done:True\n", "Episode:263/300, Reward:200.0, Steps:200, Done:True\n", "Episode:264/300, Reward:200.0, Steps:200, Done:True\n", "Episode:265/300, Reward:200.0, Steps:200, Done:True\n", "Episode:266/300, Reward:200.0, Steps:200, Done:True\n", "Episode:267/300, Reward:200.0, Steps:200, Done:True\n", "Episode:268/300, Reward:200.0, Steps:200, Done:True\n", "Episode:269/300, Reward:200.0, Steps:200, Done:True\n", "Episode:270/300, Reward:200.0, Steps:200, Done:True\n", "Episode:271/300, Reward:200.0, Steps:200, Done:True\n", "Episode:272/300, Reward:135.0, Steps:135, Done:True\n", "Episode:273/300, Reward:200.0, Steps:200, Done:True\n", "Episode:274/300, Reward:200.0, Steps:200, Done:True\n", "Episode:275/300, Reward:200.0, Steps:200, Done:True\n", "Episode:276/300, Reward:200.0, Steps:200, Done:True\n", "Episode:277/300, Reward:200.0, Steps:200, Done:True\n", "Episode:278/300, Reward:200.0, Steps:200, Done:True\n", "Episode:279/300, Reward:200.0, Steps:200, Done:True\n", "Episode:280/300, Reward:200.0, Steps:200, Done:True\n", "Episode:281/300, Reward:200.0, Steps:200, Done:True\n", "Episode:282/300, Reward:200.0, Steps:200, Done:True\n", "Episode:283/300, Reward:200.0, Steps:200, Done:True\n", "Episode:284/300, Reward:200.0, Steps:200, Done:True\n", "Episode:285/300, Reward:200.0, Steps:200, Done:True\n", "Episode:286/300, Reward:200.0, Steps:200, Done:True\n", "Episode:287/300, Reward:200.0, Steps:200, Done:True\n", "Episode:288/300, Reward:200.0, Steps:200, Done:True\n", "Episode:289/300, Reward:200.0, Steps:200, Done:True\n", "Episode:290/300, Reward:200.0, Steps:200, Done:True\n", "Episode:291/300, Reward:200.0, Steps:200, Done:True\n", "Episode:292/300, Reward:200.0, Steps:200, Done:True\n", "Episode:293/300, Reward:200.0, Steps:200, Done:True\n", "Episode:294/300, Reward:200.0, Steps:200, Done:True\n", "Episode:295/300, Reward:200.0, Steps:200, Done:True\n", "Episode:296/300, Reward:200.0, Steps:200, Done:True\n", "Episode:297/300, Reward:200.0, Steps:200, Done:True\n", "Episode:298/300, Reward:200.0, Steps:200, Done:True\n", "Episode:299/300, Reward:200.0, Steps:200, Done:True\n", "Episode:300/300, Reward:200.0, Steps:200, Done:True\n", "Complete training!\n", "results saved!\n" ] }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n \n \n \n \n 2021-03-29T19:53:51.889101\n image/svg+xml\n \n \n Matplotlib v3.4.0, 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", "image/png": "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uppIJMK8efOMbYqiJLRvh+rqal566aUE2eLII48E4K233uLee+9lx44dKIpCIBBg0qRJxrGlpaV4vV5Lm0OGDDH+zsnJIRgMEolEbLXpZMfW1dUxbNgwBEEw9nc1n5qaGsaMGdPtfO0QP4exY8cyceJE3njjDU444QRef/11nn76aaD762VGXV0dw4cPRxRjdt+IESOora3NaJw6amtrKS4uNsZeX1+fcEwkEqG5uZnS0lLL9kmTJnH88cfzwAMPMHHixB6Nw0EMDtkPcOzdu5elS5fy97//nZkzZxrWpw5JkjjllFN47rnnGDJkCMcffzwFBQWARkyXXXYZP/zhD5O2byay7vqqqKhg3759xnvz38OHD8fj8fDBBx906eyzQ2VlJWeddRa33nprwr5QKMSSJUtYtmwZCxcuxO1286Mf/QhzMlfzHLKJiooKamtrUVXV6KOmpobRo0cnnceuXbts9+Xm5hpWOkB9fT3Dhg0z3tvN4fTTT+e5555DURQOOuggxo4da/ST7HrFY+jQoezbtw9FUQzCr6mpYdy4cd2emwyKovDGG29wzDHHAHDMMcdw99134/P5LFLOyy+/jNvtZvr06QltLFmyhHPOOYdLLrkk43E4sMKRcQY4/H4/giBQVlYGaM7KLVu2WI4544wzePHFF1m5ciWnn366sf28887jscceY/369aiqis/n480336SjoyOjvk499VQefvhhamtraWtr4y9/+YuxTw/Ju/322+no6EBRFHbt2sWaNWu6neOZZ57JG2+8wTvvvIMsywSDQVavXs2+ffsIhUKEQiHKyspwuVy89dZbvPvuu6lfwB5gxowZSJLEI488QiQS4dVXX7U4b+PxP//zP/ztb39jw4YNqKrKzp07jSekQw45hOeeew5Zlnn77bf58MMPu+3/tNNO49133+XRRx+1fK5dXa94HH744eTk5PDXv/6VcDjM6tWref311znttNPSvh6RSIStW7dy1VVX0dDQwEUXXQTAWWedxfDhw7nyyivZs2cP4XCYd955h1tvvZXvfve7FBYWJrQ1duxYTjvtNCfkMotwyH6A46CDDuKSSy5h8eLFHHPMMWzevJlZs2ZZjpk+fTq5ubnU1dVx7LHHGtsPO+wwbrnlFm6++WbmzJnD1772NZ588smM+/rGN77B3LlzOfPMMzn77LM57rjjcLlc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AwAO2Ttw4MDBAQCH7B04cODgAIBD9g4cOHBwAKBfp0tIFwM9pfKCBQvweDx4vVqt26uvvpr58+ezbt06brjhBoLBICNHjuTOO++kvLy8j0cbw7Jly1i1ahV79+5l5cqVTJo0Cej68+ivn1WyuST7bIB++/k0Nzfz85//nF27duHxeBg7diw333wzZWVlXY65P86nq7lMnjyZSZMmGUXR77jjDiZPngzA66+/zh133IEsy0ydOpXf/va35Obm9uVUAPjRj37Enj17EEWRvLw8fvWrXzFlypTe/c2ogwgXXHCB+vTTT6uqqqpPP/20esEFF/TxiNLDCSecoG7atMmyTZZl9cQTT1Q//PBDVVVV9d5771WvvfbavhheUnz44YdqdXV1wvi7+jz662eVbC52n42q9u/Pp7m5Wf3ggw+M97fffrv6y1/+sssx99f5JJuLqqrqpEmT1I6OjoRzOjo61GOOOUbdvn27qqqqet1116nLly/fL+PtDm1tbcbfr7zyinr22Werqtq7v5lBI+MM1pTKGzZswOv1UlVVBcDixYt56aWX+nhUVlRVVSXkPOrq8+jPn5XdXLpCf/58SkpKOPLII433M2bMoLq6ussx99f5JJtLV3j77beZNm2aYf0uXryYF198sTeHmTIKC2NJzjo6OhAEodd/M4NGxukqpfJAysdz9dVXo6oqs2fP5qqrrqKmpoYRI0YY+8vKylAUxXiU66/o6vNQVXVAflbxn01RUdGA+XwUReHRRx9lwYIFXY55IMzHPBcdF1xwAbIsc+yxx3LFFVfg8XgS5jJixIh+lWL9+uuv591330VVVf7617/2+m9m0Fj2gwErVqzg2Wef5YknnkBVVW6++ea+HpKDKAb6Z3PLLbeQl5fHt7/97b4eSo8RP5c333yTJ598khUrVvDVV19x77339vEIU8Ntt93Gm2++yU9/+lPuuOOOXu9v0JD9YEiprI/V4/Fw/vnn8/HHH1NZWWl5XG1qakIUxX5jZSVDV5/HQPys7D4bfXt//3yWLVvGzp07+cMf/oAoil2Oub/PJ34uEPtsCgoKOO+885J+NtXV1f3yO3b22WezevVqhg8f3qu/mUFD9gM9pbLP56O9Xas5qaoqL7zwAlOmTGHatGkEAgHWrl0LwGOPPcYpp5zSl0NNCV19HgPts0r22QD9/vO5++672bBhA/fe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\n" }, "metadata": {} } ], "source": [ "cfg = DQNConfig()\n", "env = gym.make('CartPole-v0')\n", "env.seed(1)\n", "state_dim = env.observation_space.shape[0]\n", "action_dim = env.action_space.n\n", "agent = DQN(state_dim,action_dim,cfg)\n", "rewards,ma_rewards = train(cfg,env,agent)\n", "agent.save(path=SAVED_MODEL_PATH)\n", "save_results(rewards,ma_rewards,tag='train',path=RESULT_PATH)\n", "plot_rewards(rewards,ma_rewards,tag=\"train\",algo = cfg.algo,path=RESULT_PATH)" ] } ] }