资源下载地址:https://download.csdn.net/download/sheziqiong/86775681
资源下载地址:https://download.csdn.net/download/sheziqiong/86775681

基于信心上界蒙特卡洛搜索树(UCT)实现四子棋

算法

本次实验采用信心上界蒙特卡洛搜索树(UCT)实现,算法简要描述如下:

搜索树上每一个节点表示一个局面。对某节点 x,x 的第 i 个子节点

表示节点 x 的局面在第 i 列落子后形成的下一局面。以当前局面作为树根进行搜索。对于每个节点,统计经该节点及其子节点所表示的局面出发进行的所有博弈,记录博弈的总场数 n 及总获胜场数 m,则对该节点获胜概率的估计为

。为了估计出准确的获胜概率,需要进行足够多次的博弈试验。每次试验均从树根所表示的局面出发,执行如下策略:

若当前局面在搜索树上已被节点 x 表示,且由此局面落子一步产生的所有次局面,均已由 x 的子节点表示,则选择 UCB 信心上界最大的子节点所对应的落子。若记节点 x 记录的总试验次数和获胜次数分别为 n 和 m,x 的子节点

其中 c 为比例系数,本实验中 c=1,具体取值在后文有讨论。此处“获胜”指的是相对于当前节点所表示的玩家而言;

若当前局面在搜索树上已被节点 x 表示,但由此局面某一落子产生的次局面,并没有由 x 的子节点表示,则选择执行此落子,并在树上扩展出新的节点记录此新局面;

若当前局面在搜索树上没有被任何节点表示,则随机执行一落子。但 ① 若执行某落子可直接获胜,或 ② 不执行某落子将直接落负,则执行此落子。

每次试验后更新树上节点记录的信息。执行足够多次试验后,选择根节点的所有子节点中估计胜率

将收敛于真实胜率,择其最大的一项作为正式决策。

UCT 算法平衡了探索与利用:某策略尝试次数较少时,其信心上界较高,算法将尝试足够多陌生的决策(探索);某策略估计胜率较高时,其信心上界也高,算法将专注于这些策略,避免在胜率过小的局面上浪费过多计算量(利用)。

上述算法并非朴素的 UCT 算法,有如下两点改进值得注意:

  • 若节点 x 还没有子节点,并非一次性扩展出其所有子节点,而是一个一个地扩展(见上述步骤 2),避免在扩展某一个节点时一次性浪费太多计算量。
  • 步骤 3 并非随机策略,而是能感知下一步必胜或者必败的局面。判断必胜或必败并不需要花费多少计算量,但此举有效避免了纯粹随机策略的盲目性。

测量与评价

为了评价本算法,做了如下若干测量。虽然随机噪声较大,但也能说明一定问题。

蒙特卡洛算法需要试验次数达到一定后,估计胜率

才能收敛于真实胜率。为了分析算法执行的试验次数是否足够,选择若干参照 AI 与之对弈,每组数据测量 20 轮游戏,其中一半作为先手,另一半作为后手。测量程序运行时间(正比于试验次数)与胜率的关系如下:

参照 AI;;运行时间 10.dll 20.dll 30.dll 40.dll 50.dll 60.dll 70.dll 80.dll 90.dll 100.dll
0.5s 1 1 N/A 1 0.95 0.95 0.95 0.85 0.95 0.85
1.0s 1 1 N/A 1 0.95 1 1 1 0.95 0.65
1.5s 1 1 N/A 0.9 1 1 0.95 1 1 0.6
2.0s 1 0.95 N/A 1 1 0.95 0.85 1 1 0.75
2.5s 1 0.95 N/A 1 1 0.95 1 0.95 1 0.75

可以看出,0.5s~2.5s 范围内,胜率与运行时间没有统计意义上的差异。可以认为试验次数已经足够。

UCB 信心上界式中有比例系数 c,为确定最佳的 c 取值,做以下测量。仍然每组数据测量 20 轮游戏,其中一半作为先手,另一半作为后手。

参照 AI;c 70.dll 80.dll 90.dll 100.dll
0.1 0 0.1 0.05 0
0.4 0.9 1 0.85 0.55
0.7 0.95 0.95 1 0.75
1.0 1 0.85 0.95 0.8
1.3 1 1 1 0.7
1.6 1 0.95 0.95 0.5
1.9 0.95 0.9 0.75 0.6

绘制图像:

可以看出 c≤0.5 或 c≥1.5 时胜率显著下降,但 0.5<c<1.5 时胜率没有显著区别。本实验中选择 c=1 作为最终参数。

其他改进的尝试

除在“算法”一节所述的两点改进外,我还尝试了其他改进方法如下,但实验表明其效果不好,故没有被采用于最终版本中。

UCT 算法的一项缺点是:某一个较优的决策须被尝试足够次数后,其价值才能反映在估计胜率

中,浪费了许多计算量。这是由于某一节点的胜率是由其所有子节点胜率的加权平均得来,而非其子节点胜率的最大值得来。

我试图将某节点的获胜可能设为随机变量,假设其服从正态分布 N(μ,σ),以 μ+σ 作为替代的信心上界进行蒙特卡洛搜索。每一节点的获胜可能定义为其子节点获胜可能的最大值。虽然若干正态分布的最大值所服从的分布并没有解析解,但可以通过简单函数拟合,通过此方法可估计出树上每一节点的获胜可能,最后选择获胜可能期望最大的决策。

实验表明,此方法胜率不如朴素算法。我认为可能由以下原因所致:

  • “测量与评价”一节的分析表明,朴素算法中尝试次数已经足够,UCT 浪费的计算量并没有过多负面影响;
  • 若干正态分布变量的最大值不再服从正态分布,按此方法估计会产生偏差。

资源下载地址:https://download.csdn.net/download/sheziqiong/86775681
资源下载地址:https://download.csdn.net/download/sheziqiong/86775681

基于信心上界蒙特卡洛搜索树(UCT)实现四子棋相关推荐

  1. 人机对战初体验:Python基于Pygame实现四子棋游戏

    人机对战初体验-四子棋游戏 继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩 ...

  2. 基于LC3模拟器的简单游戏设计:简易四子棋

    一.实验目的 分析和理解指定的需解决问题. 利用LC-3的汇编代码设计实现相关程序. 通过LC-3仿真器调试和运行相关程序并得到正确的结果. 二.实验内容 四子棋是一款普遍流行的简易型桌面游戏,据说, ...

  3. python人机对战的实验步骤_人机对战初体验:Python实现四子棋游戏

    继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩,展现出的围棋技艺已经到了人 ...

  4. java四子棋实验报告_Python 实现劳拉游戏的实例代码(四连环、重力四子棋)

    游戏规则:双方轮流选择棋盘的列号放进自己的棋子, 若棋盘上有四颗相同型号的棋子在一行.一列或一条斜线上连接起来, 则使用该型号棋子的玩家就赢了! 程序实现游戏,并将每局的数据保存到本地的文件中 首先我 ...

  5. 四子棋 freepython

    四子棋,是黑白棋的一种.是一种益智的棋类游戏.黑白两方(也有其它颜色的棋子)在8*8的格子内依次落子.黑方为先手,白方为后手.落子规则为,每一列必须从最底下的一格开始.依此可向上一格落子.一方落子后另 ...

  6. 深圳大学计系汇编语言实验--四子棋游戏

    题面 四子棋是个双人游戏,两人轮流下棋,棋盘由行和列组成的网格,每个选手每次下一个子直到两人中有一人的棋子连成一条水平线.垂直线或者是对角线. 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通 ...

  7. 四子棋游戏--bingo game

    最近自己编了一个四子棋的游戏.说明如下: 游戏简介: 一种常见的四子棋游戏,可以是人机对战,两人对战,或者网上对战. 游戏的双方轮流落子,每人持有21颗子.棋子共有6*7个位置,玩家的棋子总是落到 当 ...

  8. vb四环棋的实现,平面四子棋,四连环游戏

    vb四环棋的实现,平面四子棋 首先我们百度一下,什么是平面四子棋 相信很多小伙伴见到这幅图片都不陌生. 那么在代码中怎么实现呢?我们用vb代码为例子. 先看效果图 我们设计o和x是需要下的棋子,如果没 ...

  9. 深圳大学 计系1实验四—四子棋实验

    实验要求 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通过键盘和输出窗口轮流交互操作,棋盘由6 X 6的网格组成. 游戏规则如下: 两位选手依次轮流落子: 选手不能悔棋: 有子的地方不能继续 ...

  10. 全国大学生软件创新大赛一等奖作品 —— HyllCube 三维四子棋

    2011 年 9 月,那时刚升大三.和另外三位童鞋组队参加了第四届英特尔杯全国大学生软件创新大赛.最终,在北京的总决赛中,成功获得一等奖~ 时间过得真快,没想到,到现在已经有 8 年了~ 整个比赛过程 ...

最新文章

  1. Hibernate学习之hibernate状态
  2. 七问唐骏:真的性格好就能成功?
  3. 第三讲:Asp.Net+Autofac+EF/ADO.NET Winform OA(3)-启用DevExpress皮肤功能
  4. 【转载】性能测试浅谈
  5. STM32那点事(2)_时钟树(下)
  6. 迁移桌面程序到MS Store(8)——通过APPX下载Win32Component
  7. 【算法】剑指 Offer 50. 第一个只出现一次的字符
  8. django文件——django + jquery-file-upload上传篇(二)-- 插件实现文件上传+进度条显示 +拖入文件上传...
  9. iOS边练边学--UITableViewCell的常见属性设置
  10. 渗透测试工程师前景_网络安全工程师教你:Kali Linux之Metasploit渗透测试基础(一)...
  11. 备案后才允许上线 网站ICP备案步骤详解
  12. linux shell 中的idd,shell脚本入门教程.pdf
  13. [spfa][数论]JZOJ 4722 跳楼机
  14. Wireshark抓包体验
  15. excel单元格下拉选项怎么设置_单元格下拉效果怎么实现?
  16. 图像可视化——matplotlib绘图入门基础
  17. 银河麒麟桌面操作系统V10创建热点
  18. 关于Linux软件工程师的招聘要求
  19. 数字信号处理(七)FIR数字滤波器的设计
  20. 【回收站】恢复oracle中误删除drop掉的表

热门文章

  1. 用黑莓手机来使电脑上网
  2. 访问页面出错:The requested URL / was not found on this server. 网站打开出现404
  3. 七甲川荧光染料IR820 NHS ester,新吲哚菁绿-活化酯,New Indocyanine Green-nhs ester
  4. python之Continuity循环
  5. Unity 2D游戏制作流程用到的技巧
  6. [转]基于大规模语料的新词发现算法
  7. Kubernetes 污点介绍
  8. asp.net将图片变成圆形
  9. arduino 联动ULN2003驱动板营造夏日炫酷小风扇
  10. 查找算法——adjacent_find