Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用蒙特卡洛树搜索实现围棋落子算法

使用蒙特卡洛树搜索实现围棋落子算法

作者头像
望月从良
发布于 2019-04-28 02:44:04
发布于 2019-04-28 02:44:04
3.1K0
举报
文章被收录于专栏:Coding迪斯尼Coding迪斯尼

上一节我们完成了最大最小搜索树,加上alhpa-beta剪枝算法实现了围棋落子走法。它存在一个问题是,树搜索的层次不高,尽管如此,围棋机器人下棋时还是要多次扫描棋盘,进行复杂的运算比较后才能做出决定,这个过程异常耗时,以至于好几分钟都无法运算完。

在计算机科学中,当面对一个计算量大的复杂问题时,一种常用的做法就是引入概率和随机性,我们不一定要寻找理论上的最优做法,我们只要以一定的概率寻找到相对优越的做法即可。本节我们引入一种带有随机性的树搜索算法叫蒙特卡洛树搜索,它属于蒙特卡洛随机化算法中的一个分支,这种算法的特性是使用概率和随机化的方法去分析极度复杂和棘手的问题。之所以把这类算法叫做蒙特卡洛,是因为在摩洛哥有一片赌场区就叫蒙特卡洛。

接下来我们看看蒙特卡洛算法步骤。该算法有两个特点,一是对棋盘进行随机模拟,二是根据模拟的结果进行统计。假设当前有一个棋局,其中轮到黑棋落子:

根据上图,我们把当前棋盘状况抽象成一个树节点,它有两个值,’/‘左边的值是获胜的数量,右边的值是模拟次数,比如说给定一个棋盘局面,我让两个围棋机器人在当前局面下随机落子直到分出胜负为止,假设当前棋盘是黑棋落子,我们让机器人下100盘后,黑棋赢了70盘,那么节点中的值就是70/100。

算法第二部是根据当前节点展开,如果当前棋盘是黑棋落子,同时黑棋有3种走法,于是上面节点就可以展开三个子节点,每个子节点对应黑棋采取相应走法后的棋盘状况:

接着我们构造两个机器人,然他们基于三个叶子节点的棋盘状况随机落子,直到分出胜负:

父节点对应的棋盘轮到黑棋落子,黑棋有三种落子方式,于是衍生出三个子节点,然后我们构造机器人在三个子节点对应的棋盘上模拟对弈直到分出胜负,假设第一个节点模拟结果是黑棋胜,第二个棋盘模拟结果是黑棋输,第三个节点模拟结果是黑棋胜,于是三个子节点的值变为1/1,0/1,1/1,然后我们把子节点的结果上传到父节点:

算法每次都会以某种规则选择一个叶子节点进行机器人模拟对弈,然后将结果上传到它的所有父节点。上图模拟后表明第一个节点胜率是100%,第二个节点是0,第三个节点是100%,如此说明黑棋以第一种和第三种方式落子所得的赢面更大,当然这是不一定的,因为当前结果只是一次随机模拟的结果,很可能中间节点对应走法更好,只不过随机模拟时,因概率性问题没得到好结果而已,对于这个问题我们后面会有办法处理。

接下来我们选择一个赢率大的节点继续展开,例如我们选择第二层第一个节点,此时轮到白棋落子,假设此时白棋有两种落子方式,于是我们根据这两种落子方式形成两种棋盘,对应两个子节点:

接着我们在展开后的节点对应棋盘上进行随机模拟对弈,也就是让两个机器人在当前棋盘上随机落子,得到结果后,将结果上传到父节点进行综合:

注意到此时第二层第一个节点的赢率下降到2/3,因此下次再选择时,根据赢率最大原则,我们选择第一层第3个节点展开:

从这一系列流程中,我们发现一个问题,那就是如果一直对赢率最大的节点展开模拟,中间节点就永远得不到展开模拟的机会,很可能中间节点对应的走法才是最好的,但是由于随机模拟的方式,它的优势因概率的原因没有展现出来,毕竟我们只对它进行一次模拟,模拟次数太少就不足以在统计上说明它的优劣。同时我们还要注意一个问题,那就是每次模拟我们都对一个叶子节点展开后,将其变成父节点,然后再对其展开的叶子节点进行模拟对弈。

我们到底是继续对当前赢率最大的节点展开模拟,还是尝试一下当前赢率比较小的节点,这种两难抉择在算法上叫做exploitation-exploration,exploitation是压榨的意思,它意味着我们将资源投入到当前看起来回报最高的地方,exploration表示探索,它意味着我们尝试一下把资源投入到目前看起来回报不高的地方,探索很可能会带来新的收获,如何以科学的方法平衡这两种选择,是算法设计上一个难点。

我们如何决定到底是exploitation还是exploration呢?我们用一个数学公式来计算:

其中w是当前节点的胜率,N对应的是符号’/‘右边的数字,也就是从该节点开始包括它的子节点总共模拟了多少盘棋局,n是当前节点孩子节点中符号’/‘右边对应的数字。temperature用于控制exploitation和exploration的比例,如果这个值大,意味着你更愿意冒险,也就是你愿意多尝试把资源投入到当前赢率小的节点,如果该值小,意味着你比较保守,你更愿意把资源投入到当前赢率更大的节点,一般而言这个值取1.5的效果比较好,这个公式有它对应的数理统计原理,在这里我们不深究。

举个实际例子,就上图而言,对于顶层节点,我们如何选取三个子节点中的某一个进行模拟呢?此时N=7,如果我们选定第一个子节点,那么n=3,子节点对应的赢率是2/3,带入公式计算: 2/3 + 1.5 * (log(7) / 3) ^(1/2) = 1.87

对于第二层第二个节点而言,n=1, 带入上面公式有: 0 + 1.5 * (log(7) / 1) ^ (1/2) = 2.1

根据上面运算结果,2.1 > 1.64,因此此时应该对第二层中间节点进行展开,随着节点不断展开,每个节点的赢率发生不同变化,上面公式计算的结果也就不同,因此每次都有可能选择不同节点进行展开模拟。

这里还需要注意的问题有,每次选定一个节点后,如果当前节点对应的棋盘,其对应落子方有n种走法,那么我们要一下子为其展开n个子节点,然后对每个子节点进行模拟博弈。还有一个问题是,算法什么时候该结束呢?一般而言我们设定模拟博弈的总次数,每个子节点模拟博弈一次,总次数就减少一次,当总次数减少到0后,树的根节点选择一个赢率最大的子节点对应的落子方式作为它的下一步走法。

更多细节,我们从代码实现中理解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coding迪斯尼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【CC2530开发基础篇】人体红外传感器
热释电人体红外传感器广泛应用于智能家居、安防监控、自动控制等领域,能够通过检测人体的热辐射变化来判断是否有人存在。该传感器通过热释电效应将人体热辐射转化为电信号,进而通过数字信号输出,实现对环境中人体活动的感知。与其他传感器相比,热释电人体红外传感器具有响应速度快、灵敏度高、成本低等优势,特别适用于需要检测人体存在或运动的场景。
DS小龙哥
2025/05/29
1060
【CC2530开发基础篇】人体红外传感器
基于单片机设计的电子柜锁
随着现代社会的不断发展,电子柜锁的应用越来越广泛。传统的机械柜锁存在一些不便之处,例如钥匙容易丢失、密码容易泄露等问题。设计一款基于单片机的电子柜锁系统成为了一个有趣而有意义的项目。
DS小龙哥
2023/11/01
2880
基于单片机设计的电子柜锁
通过51单片机控制SG90舵机按角度正反转转动
本文介绍如何通过51单片机控制SG90舵机实现角度的正反转转动。SG90舵机是一种常用的微型舵机,具有体积小、重量轻、结构简单等特点,被广泛应用于机器人、遥控模型和各种自动控制系统中。
DS小龙哥
2023/11/08
1.7K0
通过51单片机控制SG90舵机按角度正反转转动
基于单片机设计的激光测距仪(采用XKC-Kl200模块)
随着科技的不断进步和应用需求的增加,测距仪成为了许多领域必备的工具之一。传统的测距仪价格昂贵、体积庞大,使用起来不够方便。本项目采用STC89C52单片机作为主控芯片,结合XKC-KL200激光测距模块和LCD1602显示器,实现了一个简易且高效的激光测距仪。这个测距仪可以帮助用户快速准确地测量目标与测距仪之间的距离,并将结果通过LCD1602显示器直观地展示出来。
DS小龙哥
2023/12/01
6060
基于单片机设计的激光测距仪(采用XKC-Kl200模块)
基于单片机的数字温度计设计
数字温度计是一种用于测量和显示环境温度的设备。本文章介绍基于STC89C52主控芯片的数字温度计的设计过程和实现原理。该设计采用DS18B20温度传感器进行温度采集,使用LCD1602显示屏进行温度显示,通过按键设置温度的上限和下限阀值,并通过蜂鸣器进行报警。
DS小龙哥
2023/09/01
1K0
基于单片机的数字温度计设计
基于单片机设计的指纹锁(读取、录入、验证指纹)
指纹识别技术是一种常见的生物识别技术,利用每个人指纹的唯一性进行身份认证。相比于传统的密码锁或者钥匙锁,指纹锁具有更高的安全性和便利性,以及防止钥匙丢失或密码泄露的优势。
DS小龙哥
2023/12/23
7310
基于单片机设计的指纹锁(读取、录入、验证指纹)
MCS-51单片机温度控制系统的设计
注塑机是一种常用的制造设备,用于生产塑料制品。在注塑机的工作过程中,溶胶必须达到一定的温度才能被注入模具中进行成型。因此,在注塑机的生产过程中,温度控制是非常重要的一环。
DS小龙哥
2023/09/07
3780
MCS-51单片机温度控制系统的设计
单片机红外传感器_基于51单片机的声音传感器
我们工作久了,久坐导致的毛病就显现出来了,腰酸背痛颈椎疼,最近看到利用番茄钟工作法挺好,工作25分钟,休息5分钟,既能调整工作节奏,避免精力过分消耗,也能避免久坐导致的身体问题。 我刚开始使用闹钟做提醒,后来尝试番茄钟软件,但是都要手动去操作手机,拿起手机看到信息,然后就会去处理手机上的事情了,起不到作用… 直到有一天收拾东西看到了我大学期间基于51单片机做的一个电子设计,激起了我的灵感,开始了基于51单片机的自动番茄钟,久坐提醒神器的设计和制作。 整体方案硬件部分继承了大学时焊接的电路板,更换了传感器部分,软件部分重新编写了控制部分的代码。 之前的软硬件设计方案可以参考这篇文章《基于51单片机的上下限可调的数字温度控制系统》,本文重点阐述差异部分。
全栈程序员站长
2022/11/15
7450
单片机红外传感器_基于51单片机的声音传感器
C51 单片机开发模拟 PWM 控制舵机
闲话:学习的时候笔记一定要记好,很多东西学的时候感觉用的很熟了,结果一个月不用全都忘记了。再学,发现好像以前都没学过似的。记笔记也是一个学问,记得太多了看不过来,记得太少了又看不懂!
码农UP2U
2024/06/21
3900
C51 单片机开发模拟 PWM 控制舵机
基于单片机设计的超声波测距仪(采用HC-SR04模块)
本项目是基于单片机设计的超声波测距仪,主要采用了STC89C52单片机和HC-SR04超声波测距模块。通过LCD1602液晶显示屏来展示测量的距离信息。
DS小龙哥
2023/11/28
8530
基于单片机设计的超声波测距仪(采用HC-SR04模块)
基于单片机设计的水平仪(STC589C52+MPU6050)
水平仪是一种常见的测量工具,用于检测物体或设备的水平姿态。在许多应用中,如建筑、制造和航空等领域,保持设备的水平姿态是非常重要的。为了实现实时的水平检测和显示,基于单片机设计的水平仪是一个常见的解决方案。
DS小龙哥
2023/11/17
4410
基于单片机设计的水平仪(STC589C52+MPU6050)
基于单片机设计的智能窗帘控制系统
智能家居技术在近年来取得了巨大的发展,并逐渐成为人们日常生活中的一部分。智能家居系统带来了便利、舒适和高效的生活体验,拥有广泛的应用领域,其中之一就是智能窗帘控制系统。
DS小龙哥
2023/10/26
7040
基于单片机设计的智能窗帘控制系统
基于单片机设计的智能水泵控制器
在一些场景中,如水池、水箱等水体容器的管理中,保持水位的稳定是至关重要的。传统上,人们通常需要手动监测水位并进行水泵的启停控制,这种方式不仅效率低下,还可能导致水位过高或过低,从而对水体及相关设备造成损坏。
DS小龙哥
2023/12/02
6450
基于单片机设计的智能水泵控制器
基于单片机设计的太阳能跟踪器
随着对可再生能源的需求不断增长,太阳能作为一种清洁、可持续的能源形式,受到越来越多的关注和应用。太阳能光板通常固定在一个固定的角度上,这限制了它们对太阳光的接收效率。为了充分利用太阳能资源,提高太阳能光板的收集效率,需要设计一个能够自动跟踪太阳光的系统。
DS小龙哥
2023/11/02
4250
基于单片机设计的太阳能跟踪器
基于51单片机四路循迹小车
本系统以设计题目的要求为目的,采用STC89C52单片机为控制核心,利用红外传感器检测轨道,控制电动小汽车的自动循迹,快慢速行驶。
全栈程序员站长
2022/09/10
1.2K0
基于51单片机四路循迹小车
基于51单片机室内灯光控制系统
这是基于STC89C52单片机设计的灯光控制系统,实现对室内灯光的控制,采集光敏传感器,红外线热释电传感器,声音传感器,光照照度传感器等数据进行处理,完成室内灯光的智能控制。
DS小龙哥
2022/02/17
1.1K0
基于51单片机室内灯光控制系统
基于单片机的智能小车设计
随着科技的发展,智能机器人在日常生活中的应用越来越广泛。智能小车作为智能机器人的一种,具有便携性和多功能的特点,在教育、娱乐和工业等领域得到了广泛关注和应用。智能小车可以通过远程控制实现各种动作,如前进、后退、转弯等,并且可以通过搭载传感器实现避障、测距等功能。
DS小龙哥
2023/09/01
7040
基于单片机的智能小车设计
基于单片机的遥控器设计
随着科技的不断发展,红外遥控器已经成为我们日常生活中普遍使用的一种电子设备。它能够给我们带来便捷和舒适,减少人工操作的繁琐性。然而,在实际应用中,有时候我们可能需要制作一个自己的红外遥控器,以便于更好地满足个性化需求。这样的需求可能来自于家庭影音设备的控制、智能家居系统的控制,或者其他自动化控制方案等。
DS小龙哥
2023/09/02
4810
基于单片机的遥控器设计
人体检测–热释电传感器开发
大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。 Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
全栈程序员站长
2022/09/28
5770
人体检测–热释电传感器开发
基于单片机设计的电子指南针(LSM303DLH模块(三轴磁场 + 三轴加速度)
本项目是基于单片机设计的电子指南针,主要利用STC89C52作为主控芯片和LSM303DLH模块作为指南针模块。通过LCD1602液晶显示屏来展示检测到的指南针信息。
DS小龙哥
2023/11/18
4830
基于单片机设计的电子指南针(LSM303DLH模块(三轴磁场 + 三轴加速度)
推荐阅读
相关推荐
【CC2530开发基础篇】人体红外传感器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档