Monte Carlo 棋盘游戏中的树搜索 - 如何实现对手的动作

Monte Carlo Tree Search in board games - How to Implement Opponent Moves

我正在研究 MCTS 算法的实现,在具有完美信息的零和棋盘游戏的背景下。例如。国际象棋、围棋、西洋跳棋。

据我了解,在算法的每次迭代中,有四个步骤:选择、扩展、模拟和反向传播。

我的问题是关于对手动作的实现,它应该如何在树中呈现,以及它应该如何在每个阶段实现。

例如,让我们想象一个 GO 游戏,我们(黑色)与 AI(白色)对战。当黑方从根节点s0开始行动ab时,轮到白方行动a w.

我最初的想法是每个动作都会产生一个新的状态。所以 s0 -> ab -> s1 -> aw -> s2,其中每个 s 状态代表一个节点。但是,这会影响 MCTS 中的选择过程。在这种情况下,MCTS 不会倾向于探索坏的 aw 动作吗?因为这将 return 更好地奖励黑色。

我的替代解决方案是将操作组合到单个节点中。所以 s0 -> ab -> aw -> s1 。但是,这会使决策变得更加困难,因为每个根级操作现在都与多个不同的节点相关联。

是否有任何框架建议应该如何在 MCTS 中表示对手?任何帮助将不胜感激。

编辑 1: 由于我们将在上面的示例中玩黑色,因此每次模拟结束时的奖励函数将与黑色相关。例如。如果黑色在游戏结束时获胜,奖励将通过所有节点备份,包括黑色和白色节点。我的期望是具有高状态值的白色节点(允许黑色获胜)。

但也许我应该在进行反向传播时翻转奖励?例如。如果黑色获胜,黑色节点为 1,白色节点为 -1。这样,选择功能保持不变。这是正确的吗?

你应该运行对抗已知的强大对手或对抗算法本身。

假设您 运行 反对您自己的算法,将数据输入其中以找出 "best" 着法。确保算法适用于预期的一面(即如果你玩 go/chess,最简单的事情就是交换游戏棋子的颜色)。

如果您与自己对战,您基本上会生成两倍于学习游戏的数据点。

如果您刚刚起步,可能值得与其他机器玩家对战。你不会得到那么多的数据点,但你得到的数据点会教你更多(即,一个坏的动作会学得更快)。

您可能想先与一些合理的现有 AI 对战,然后切换到与自己对战。