一、Pendulum-v0环境介绍:
钟摆以随机位置开始,目标是将其向上摆动,使其保持直立。
gym/gym/envs/classic_control at master · openai/gym · GitHub
二、Pendulum-v0.py代码
import gym#导入gym库
import numpy as np#导入numpy模块
from RL_brain import DeepQNetwork#从RL_brain导入DeepQNetwork
ACTION_SPACE = 11#可以选取的动作有11个
env = gym.make('Pendulum-v0')#导入环境
env = env.unwrapped#env.unwrapped可以得到原始的类,原始类想step多久就多久,不会200步后失败
print(env.action_space)#输出动作信息
print(env.observation_space)#查看状态空间
print(env.observation_space.high)#查看状态的最高值
print(env.observation_space.low)#查看状态的最低值
RL = DeepQNetwork(n_actions=ACTION_SPACE, #调用DeepQNetwork:输出多少个action的Q值、
n_features=3,#接收多少个observation的值(用observation来预测action的值)、
learning_rate=0.01,#学习率
e_greedy=0.9,#e_greedy的值
replace_target_iter=100, #进行了多少步之后将targetnet的值换为最新的参数、
memory_size=2000,#记忆库的容量
e_greedy_increment=0.001,)
total_steps = 0#学习步数
for i_episode in range(100):#episode循环
observation = env.reset()#获得环境初始observation
ep_r = 0
while True:
env.render()#重绘环境的一幅图像
action = RL.choose_action(observation)#选取动作
#Pendulum-v0是连续性动作。而DQN处理的是离散的,我们需要将Pendulum-v0动作离散化
f_action = (action-(ACTION_SPACE-1)/2)/((ACTION_SPACE-1)/4) # convert to [-2 ~ 2] float actions
observation_, reward, done, info = env.step(np.array([f_action]))#将这一状态的动作入、获取下一状态的观测值、奖励以及是否已经终结
reward /= 10 # normalize to a range of (-1, 0). r = 0 when get upright
# the Q target at 竖直向上 state will be 0, because Q_target = r + gamma * Qmax(s', a') = 0 + gamma * 0
RL.store_transition(observation, action, reward, observation_)#存储记忆:当前的observation、采取的行动、奖励、下一步的observation
ep_r += reward
if total_steps > 1000:#大于1000步的时候再开始学习
RL.learn()
if done:#完成此次episode
print('episode: ', i_episode,#输出此时的episode
'ep_r: ', round(ep_r, 2),#round(number[, ndigits])number是你的数、是舍入到小数点后的位数
' epsilon: ', round(RL.epsilon, 2))
break
observation = observation_#更迭
total_steps += 1#步数加一
RL.plot_cost()#绘制cost
DQN基于Q-Learning,Q-Learning中有Qmax
,Qmax
会导致Q现实
当中的过估计(overestimate)。而Double DQN就是用来解决出现的过估计问题的。