reinforcement-learning - 适用于 2 人游戏的深度 Q 学习 (DQN)
问题描述
我想知道如何正确实现两人游戏的 DQN 算法,例如井字游戏和连接 4。虽然我的算法相对快速地掌握井字游戏,但连接 4 无法获得很好的结果。代理正在学习获胜很快,如果它有机会的话,但它只在中路发挥作用。它无法检测第一列和最后一列中的威胁。我正在使用带有内存重放的 DDQN。并且指的是两个实力不同的代理人teacher
,student
而老师经常被新学生取代。我的算法看起来简化如下:
for i in range(episodes):
observation = env.reset()
done = False
while not done:
if env.turn == 1:
action = student.choose_action(observation)
observation_, reward, done, info = env.step(action)
loss = student.learn(observation, action, reward, observation_, done))
observation = observation_
else:
action = teacher.choose_action(-observation)
observation_, reward, done, info = env.step(action)
observation = observation_
观察值对于玩家“o”是 -1,对于玩家“x”是 1,对于空玩家是 0。代理学习扮演玩家“x”,并通过action = teacher.choose_action(-observation)
它为玩家“o”找到最佳移动。我希望这很清楚。
更新规则如下所示:
# Get predicted q values for the actions that were taken
q_pred = Q_eval.forward(state, action)
# Get Q value for opponent's next move
state_ *= -1.
q_next = Q_target.forward(state_, max_action)
# Update rule
q_target = reward_batch - gamma * q_next * terminal
loss = Q_eval.loss(q_pred, q_target)
我正在使用-gamma * q_next * terminal
,因为如果对手在下一步中获胜,则奖励为负数。我错过了什么重要的东西还是只是超参数调整的问题?
解决方案
推荐阅读
- python - 如何在 Tensorflow 中实现反转梯度?
- javascript - 具有多个画布元素的 ReactJS 组件
- sonarqube - 如何将数据从 Sonarqube 的社区版(云)迁移到 Sonarqube 的社区版(本地)?
- javascript - jQuery:如何在 jQuery 中将`map`与类一起使用
- c# - c#中使用graphql的嵌套查询
- node.js - Node js :- 响应块以内容配置重命名的文件
- regex - 如果在纯正则表达式替换中不存在参数,则在 URL 查询字符串中插入参数
- laravel - 未过期的 cookie 在 Laravel 中显示为过期?
- sql - 是否可以在 BigQuery 中按案例进行分组?
- java - Soap UI-数据驱动测试-Apache POI 错误