0

我想知道如何正确实现两人游戏的 DQN 算法,例如井字游戏和连接 4。虽然我的算法相对快速地掌握井字游戏,但连接 4 无法获得很好的结果。代理正在学习获胜很快,如果它有机会的话,但它只在中路发挥作用。它无法检测第一列和最后一列中的威胁。我正在使用带有内存重放的 DDQN。并且指的是两个实力不同的代理人teacherstudent而老师经常被新学生取代。我的算法看起来简化如下:

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

4

0 回答 0