我在尝试理解蒙特卡洛树搜索(MCTS)算法的工作原理,以及如何在卡牌游戏中实现它以提升AI引擎的性能。
我已经阅读了mcts.ai/网站和许多相关论文,其中一篇论文展示了在《魔法卡牌》游戏AI中应用蒙特卡洛搜索与UCB取得的成功结果,这大致是我需要做的。然而,我在理解某些要点和如何应用这些方法来解决我的需求时遇到了困难。我在数学方面的经验也不够丰富,所以当论文用复杂的公式解释这些内容时,我会感到迷茫。
到目前为止,我得出的想法如下:
-
给定一个游戏状态(游戏中的玩家手牌),确定所有可能的合法出牌,然后我会创建一个节点列表(每个节点代表一种出牌),作为MCTSTree根节点的一个属性,并记录每个节点的结果(得分值?)。
-
对每一种合法出牌模拟一个完整的(直到游戏结束)游戏过程,使用随机玩家并记录每个节点的结果,无论玩家是赢还是输,以便获得完整的画面。
我认为在这里应该应用蒙特卡洛 + UCB:
-
使用UCB递归选择最有前景的出牌(节点),如果是叶子节点,则从其游戏状态扩展所有可能的出牌。
-
从选定的节点模拟n次游戏,直到达到一定的时间限制。
- 在这个阶段我有一些疑问…假设我尝试给定一系列可能的游戏过程中的随机游戏过程…我需要如何处理第一个结果以继续模拟?我应该让树生长吗?
-
我如何回溯传播结果?
然后,
-
考虑到这是一个复杂的卡牌游戏,我有如此多的可能移动…在任何节点有如此多的子节点是否会有足够好的性能?
-
如果每次玩家进行移动时游戏状态都在变化,那么基于游戏状态的每次模拟如何让我知道这棵树是否真的有用?
我非常感谢任何帮助。
非常感谢!
回答:
MCTS只是以下内容:
我对它的描述与图片所示的略有不同,这可能更适合实现。
- 从根节点(游戏的当前状态)开始下降,使用UCB在每一步,直到你决定一个未实例化的节点
l
。(选择) - 将
l
添加到你的树中。(扩展) - 从
l
开始,玩一个随机游戏。(模拟) - 用游戏结果更新从
l
回溯到根节点路径上的所有节点。 - 重复直到时间用完。
如你所提到的,如果你的分支因子很大,你可能需要考虑在下降树时选择后继节点的其他策略,比如RAVE。