黑白棋游戏-黑白棋游戏中蒙特卡罗算法流程的分析

200 阅读4分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

蒙特卡罗算法分析

    利用蒙特卡洛树搜索算法解决该问题时,将问题分为四个步骤,① 路径选择,从搜索树中选择一条由根节点到非满节点的路径; ② 节点扩充,在搜索树中为选择路径上的非满节点添加一个新节点; ③ 模拟实验,沿搜索路径和添加的新节点出发,进行一次模拟实验;④ 节点更新,根据模拟实验结果,更新搜索路径中各节点的信息。将模拟过程中各步合并的数字之和作为模拟实验的评价值。

1 路径选择

路径选择过程的设计,就是对节点选择方法的设计。本文采用UCT节点选择算法,利用如下公式:

image.png

式中,k为最终选择的节点,i为候选节点,I为候选节点的集合,vi为节点i的评价值,C为常数,需要自行选择,np为节点i父节点的访问次数,ni为节点i的访问次数。在标准UCT方法中,假设节点i的评价值vi的变化范围确定,并且vi越大表示节点越好。

从根节点开始选择一个子节点进行下一步的迭代,而这样的子节点共有三种情况:(1)该节点已经拓展完全,比如当前节点各个方向上都已经进行探索了,那么就是拓展完全;(2)该节点未拓展完全,比如当前节点的某一方向上还未进行探索,那么就是未拓展完全;(3)该节点游戏已经结束,比如在翻转棋中,双方都没有可以位置可以落子了,就是游戏结束。针对以上三种情况,在程序中判断了不同的情况并进行不同的操作:(1)如果当前节点已经拓展完全并且游戏未结束,则反复选择(通过信心上限的估计值) 最佳的节点进行迭代, 直到找到未拓展完全的节点或游戏已结束的节点;(2)如果当前节点未拓展完全并且游戏未结束,则反复拓展直到拓展完全或游戏结束;(3)如果当前节点游戏已经结束,则直接进行模拟

经过以上步骤之后,将选出来的节点先进行筛选,如果节点游戏已经结束, 则直接跳过模拟步骤进行反向传播,如果节点游戏未结束则模拟下棋, 也就是创建一个模拟的对局,让这个对局进行到结束,模拟过程中首先利用当前棋局状态创建一个临时棋局,之后双方交替下棋,过程中双方的落子位置都是从他们的可落子集合中随机选取的,得到最后的反馈结果(delta),若 AI 赢则为 1,反之为 0;之后反向传播,也就是将模拟得到的结果倒着加回到这次模拟涉及到的节点,并且更新其访问次数。之后就一直重复以上四个步骤,直到时间达到上限或迭代次数达到上限停止循环,通过胜率(节点胜率/节点被访问次数)选取出最佳落子位置的节点。

2 节点扩充

节点扩充过程中,会向搜索树添加一个新节点。所以,随着搜索的进行,搜索树会逐渐扩充。在本文设计的算法中,每次向选择的路径的终点(即非满节点)随机添加一个新节点。

3 模拟实验

模拟实验过程分为 2 步:首先,从根节点出发,沿选择的搜索路径进行游戏;然后,从新添加的节点开始,根据既定的动作选择策略继续进行若干步游戏。

4 节点更新

节点更新过程中,根据模拟实验的结果,对搜索树种相关节点的信息进行更新,这保证了后续的搜索过程能够利用到之前搜索过程的信息。节点i的信息包括节点评价值vi和节点访问次数ni两部分。本文将经过节点i的所有模拟实验评价值的平均值作为节点i的评价值,所以,节点评价值的vi更新公式为

image.png

式中,R为模拟实验的评价值。节点访问次数的ni更新为

image.png

5 最终选择

MCTS算法中,需要选择合适的搜索次数Cs。Cs越大,模拟实验得到的数据越丰富,算法精度越高,但算法时间也会更长。

在Cs次搜索结束之后,需要根据搜索结果选择最优节点作为实际移动的方向。访问次数最多的节点,即稳定性最好的节点,作为最优节点。