一、def
如果我们的state与action很多,就如打砖块游戏,每个时间不同的砖块排列跟剩余都是不同的state,就会导致维度灾难。使用神经网络来 估算 这个 state 的值, 这样就不需要一张表了.
更新方式
二、算法更新
1、初始化replay memory D 容量为N
2、用一个深度神经网络作为Q值网络,初始化权重参数
3、设定游戏片段总数M
4、初始化网络输入,大小为84*84*4,并且计算网络输出
5、以概率ϵ随机选择动作at或者通过网络输出的Q(max)值选择动作at
6、得到执行at后的奖励rt和下一个网络的输入
7、根据当前的值计算下一时刻网络的输出
8、将四个参数作为此刻的状态一起存入到D中(D中存放着N个时刻的状态)
9、随机从D中取出minibatch个状态 (随即采样)
10、计算每一个状态的目标值(通过执行at后的reward来更新Q值作为目标值)
11、通过SGD更新weight
整个算法乍看起来很复杂, 不过我们拆分一下, 就变简单了. 也就是个 Q learning 主框架上加了些装饰.
这些装饰包括:
- 记忆库 (用于重复学习)
- 神经网络计算 Q 值
- 暂时冻结
q_target
(现实)参数 (切断相关性)
rom maze_env import Maze
from RL_brain import DeepQNetwork
def run_maze():
step = 0 # 用来控制什么时候学习
for episode in range(300):
# 初始化环境
observation = env.reset()
while True:
# 刷新环境
env.render()
# action
action = RL.choose_action(observation)
# 获得 state, reward, 是否终止
observation_, reward, done = env.step(action)
# DQN 存储记忆
RL.store_transition(observation, action, reward, observation_)
# 控制学习起始时间和频率 (先累积一些记忆再开始学习)
if (step > 200) and (step % 5 == 0):
RL.learn()
# state_ → state
observation = observation_
# 如果终止, 就跳出循环
if done:
break
step += 1 # 总步数
# end of game
print('game over')
env.destroy()
if __name__ == "__main__":
env = Maze()
RL = DeepQNetwork(env.n_actions, env.n_features,
learning_rate=0.01,
reward_decay=0.9,
e_greedy=0.9,
replace_target_iter=200, # 每 200 步替换一次 target_net 的参数
memory_size=2000, # 记忆上限
# output_graph=True # 是否输出 tensorboard 文件