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

本文介绍了如何使用UCT(信心上限树算法)结合蒙特卡罗方法解决四子棋的人机博弈问题。通过详细解读UCT算法的伪代码,解释了搜索树策略、默认策略和回溯过程。在编程实现中,注意了信心上限值可能为负、初始落子归属、死循环等问题的调试,提供了调试经验和技巧。
摘要由CSDN通过智能技术生成

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


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被赋值为自身的最优子节点后函数就返回了的错觉,而显然事实上函数的目的是按照信心上限的估计策略由根节点逐层向下选择当前最为紧迫需要被扩展的节点。尽管这是一个小错误,但它的确困扰了我很久,所以还是要提醒一下。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值