我正在开发一个蒙特卡洛树搜索(MCTS)算法的实现,用于零和棋盘游戏中,这些游戏具有完美信息。例如,国际象棋、围棋、跳棋。
据我所知,算法的每次迭代包含四个步骤:选择、扩展、模拟和回溯。
我的问题是关于如何在树中表示对手的移动,以及在每个阶段如何实现这些移动。
例如,我们想象一场围棋比赛,我们(黑方)与AI(白方)对弈。当黑方从根节点s0采取行动ab后,轮到白方采取行动aw。
我的初步想法是,每个行动都会产生一个新的状态。因此,s0 -> ab -> s1 -> aw -> s2,其中每个s状态代表一个节点。然而,这会影响MCTS的选择过程。在这种情况下,MCTS不会倾向于探索坏的aw移动吗?因为这会为黑方带来更好的回报。
我考虑的另一种解决方案是将行动组合成一个节点。因此,s0 -> ab -> aw -> s1。然而,这会使决策过程变得更加复杂,因为每个根级别的行动现在与多个不同的节点相关联。
有没有哪种框架建议在MCTS中如何表示对手?任何帮助都将不胜感激。
编辑1:因为我们在上面的示例中将扮演黑方,所以每次模拟结束时的奖励函数将针对黑方。例如,如果黑方在游戏结束时获胜,奖励将通过所有节点回溯,包括黑方和白方的节点。我的预期是允许黑方获胜的白方节点将具有高状态值。
但也许我在回溯时应该翻转奖励?例如,如果黑方获胜,对黑方节点是1,对白方节点是-1。这样,选择函数保持不变。这是否正确?
回答:
你应该与一个已知的强力对手或与算法本身对抗。
假设你与自己的算法对抗,将数据输入其中以找出“最佳”移动。确保算法适用于预定的角色(例如,如果你玩围棋/国际象棋,最简单的方法是交换游戏棋子的颜色)。
如果你与自己对抗,基本上会为学习游戏生成两倍的数据点。
如果你刚开始,可能值得与其他机器玩家对抗。你不会获得那么多数据点,但你获得的数据点会教你更多(即,坏的移动会更快被学习)。
你可能想先与某个合理的、现有的AI对抗,然后切换到与自己对抗。