From ef259995ed2ef123f6da5e94fbfb0dfb02182f35 Mon Sep 17 00:00:00 2001 From: JohnJim0816 Date: Tue, 8 Sep 2020 13:26:45 +0800 Subject: [PATCH] add project2 --- docs/chapter7/img/p1.png | Bin 0 -> 20392 bytes docs/chapter7/img/p2.png | Bin 0 -> 36611 bytes docs/chapter7/project2.md | 70 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 docs/chapter7/img/p1.png create mode 100644 docs/chapter7/img/p2.png create mode 100644 docs/chapter7/project2.md diff --git a/docs/chapter7/img/p1.png b/docs/chapter7/img/p1.png new file mode 100644 index 0000000000000000000000000000000000000000..1197da0557fd0a2fc4c32c42b3433c2e4fd652d7 GIT binary patch literal 20392 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 NR#aEWJZW_6e*h_ENy`8L literal 0 HcmV?d00001 diff --git a/docs/chapter7/project2.md b/docs/chapter7/project2.md new file mode 100644 index 0000000..b1fb49d --- /dev/null +++ b/docs/chapter7/project2.md @@ -0,0 +1,70 @@ +# 使用DQN实现CartPole-v0 + +推荐使用Double-DQN去解决,即建立两个初始参数相同的全链接网络target_net,和policy_net。 + +## CartPole-v0 + +CartPole-v0是open ai gym中的一个经典环境,通过向左(action=0)或向右(action=1)推车能够实现平衡,所以动作空间由两个动作组成。每进行一个step就会给一个reward,如果无法保持平衡那么done等于true,本次episode失败。理想状态下,每个episode至少能进行200个step,也就是说每个episode的reward总和至少为200,step数目至少为200。 + +![p1](img/p1.png) + +环境建立如下: + +```python +env = gym.make('CartPole-v0') +env.seed(1) # 设置env随机种子 +n_states = env.observation_space.shape[0] # 获取总的状态数 +n_actions = env.action_space.n # 获取总的动作数 +``` + +## 强化学习基本接口 + +```python +rewards = [] # 记录总的rewards +moving_average_rewards = [] # 记录总的经滑动平均处理后的rewards +ep_steps = [] +for i_episode in range(1, cfg.max_episodes+1): # cfg.max_episodes为最大训练的episode数 + state = env.reset() # reset环境状态 + ep_reward = 0 + for i_step in range(1, cfg.max_steps+1): # cfg.max_steps为每个episode的补偿 + action = agent.select_action(state) # 根据当前环境state选择action + next_state, reward, done, _ = env.step(action) # 更新环境参数 + ep_reward += reward + agent.memory.push(state, action, reward, next_state, done) # 将state等这些transition存入memory + state = next_state # 跳转到下一个状态 + agent.update() # 每步更新网络 + if done: + break + # 更新target network,复制DQN中的所有weights and biases + if i_episode % cfg.target_update == 0: # cfg.target_update为target_net的更新频率 + agent.target_net.load_state_dict(agent.policy_net.state_dict()) + print('Episode:', i_episode, ' Reward: %i' % + int(ep_reward), 'n_steps:', i_step, 'done: ', done,' Explore: %.2f' % agent.epsilon) + ep_steps.append(i_step) + rewards.append(ep_reward) + # 计算滑动窗口的reward + if i_episode == 1: + moving_average_rewards.append(ep_reward) + else: + moving_average_rewards.append( + 0.9*moving_average_rewards[-1]+0.1*ep_reward) +``` + +## 任务要求 + +训练并绘制reward以及滑动平均后的reward随epiosde的变化曲线图并记录超参数写成报告,图示如下: + +![p2](img/p2.png) + +### 代码清单 + +**main.py**:保存强化学习基本接口,以及相应的超参数,可使用argparse + +**model.py**:保存神经网络,比如全链接网络 + +**dqn.py**: 保存算法模型,主要包含select_action和update两个函数 + +**memory.py**:保存Replay Buffer + +**plot.py**:保存相关绘制函数 +