UCT(信心上限树算法)解四子棋问题——蒙特卡罗法模拟人机博弈

说蒙特卡罗规划方法的思想挺简洁的,但我在理解它的实现过程时我还是费了些功夫。这里主要以简单的四子棋为例描述一下蒙特卡罗方法是如何解决人机博弈这一类问题的。

UCT算法是蒙特卡罗规划方法的改进,是将UCB1算法(信心上限算法)思想用于蒙特卡罗规划的特定算法,它比单纯的蒙特卡罗规划更容易获得最优解。首先贴一段伪代码:

这段伪代码来自于一本我也不知道名字的书的第八章——蒙特卡罗博弈方法。首先说明这段伪代码是完全正确的,虽然在我当初理解它的时候几次三番对它的正确性产生过怀疑。接下来大概解释一下这个算法。

它的基本结构和单纯的蒙特卡罗规划是完全相同的,只不过在评价一个节点的优劣时标准并不是胜率而是所谓UCB1算法给出的信心上限的估计值(即函数BestChild中的那个算式),无论是在扩展节点还是在最终选择时都以这一标准来评价节点的优劣。

解释一下伪代码中出现的符号:s表示状态(state),在四子棋问题中对应某一时刻的棋局信息即双方的棋子是如何排布的,s(v)为状态函数即节点v所对应的状态,s0为初始状态即某一轮到我方落子的状态;v表示节点与状态s一一对应;Δ(delta)表示单次的收益或者说报酬,表征从当前状态按某一策略进行到棋局结束时的胜负情况,而Q(v)表示节点v的综合受益,是经过多次模拟后得到的收益,即很多个不同的Δ的和;N(v)表示节点v被访问的次数,与Q(v)被用于计算胜率及信心上限的估计值;A(s)表示状态s的行动集,即状态s下所有合法的落子方式或者说落子位置的集合,a(v)则表示某一行动方式。

再解释一下估计信心上限值的算式:c为比例系数(coefficient),控制后一项在整体估计中的重要程度;前一项收益Q比上访问次数N即表示胜率;后一项用于保证,在博弈树规模尚小时,某一节点v不会因为在当前经过模拟累积的收益值较小而不被选择,事实上,适当地选择单次收益Δ的计算方式以及系数c的值,可以使得在博弈树规模尚小时被访问次数越少的节点信心上限值越大,越容易被选择(可以简单手动模拟一下这种情况加深理解),随着节点深度的加深,这一项的影响会越来与小,最终的信心上限值将主要依赖于前一项,胜率。

这段伪代码还是比较清晰和详细的,尽管这样最初的时候我还是有不少地方理解错了,所以还是要简单说明一下:

1.搜索树策略(Tree Policy):所谓终止节点即为棋局结束所对应的状态节点,也就是胜负已分的情况;可扩展节点指的并不完全是胜负未分的节点,而是针对当前已经构建的这棵博弈树而言的,首先它不是终止节点,其次它有未被访问过的子状态或者说未被扩展的子节点,这两者还是比较好理解的。这个函数最初我理解错的原因是,我产生了v被赋值为自身的最优子节点后函数就返回了的错觉,而显然事实上函数的目的是按照信心上限的估计策略由根节点逐层向下选择当前最为紧迫需要被扩展的节点。尽管这是一个小错误,但它的确困扰了我很久,所以还是要提醒一下。

2.默认策略(或称模拟策略)(Default Policy):这一过程就是随机模拟,相当于在博弈树上当前节点向下随意选择一条路径走到头,看看是谁获胜。被模拟的节点或者是终止节点,或者是新扩展的节点。

3.回溯(Backup):从新扩展的节点或者终止节点,逐层向上更新收益和访问次数至根节点。由于奇偶性不同的层分别对应两方持有棋权的状态,所以单次收益Δ向紧邻的上层传递的时候要取负。(为避免在实际实现时产生混乱,可以用收益的正负值分别固定代表两方地胜负情况,然后在Δ向上传递的过程中始终不变号,而在计算信心上限估计值的时候进行判断,获得等价的效果。)

猜你喜欢

转载自blog.csdn.net/pql925/article/details/82180542
今日推荐