我想知道如何正确实现两人游戏的 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
,因为如果对手在下一步中获胜,则奖励为负数。我错过了什么重要的东西还是只是超参数调整的问题?