设为首页 - 加入收藏
广告 1000x90
您的当前位置:二四六天天好彩308K文字资料 > 博弈树搜索 > 正文

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

来源:未知 编辑:admin 时间:2019-06-10

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

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

  有了对于算法的清楚的了解,就可以实际进行程序的编写了。不过显然,编程才是真正麻烦的事情。

  (1)像Segmentation Fault这类错误还是比较好调试的,至少是相对比较好调,尽管我是用的是貌似很土鳖的DevC++。用排除法追溯回错误的源头就好了。

  (2)因为信心上限的估计值可能为负值,所以在选取最大值的时候,max的初值应该设置为一个绝对值很大的负数,比如RAND_MAX什么的。千万不要设置成0就完事了。

  (3)在扩展完新的节点开始进行模拟的时候,注意棋权的归属,也就是第一步到底是谁落子,弄反了将会出现的情况就是信心上限估计值大部分情况都是负值,因为对方总是至少比你多一个子。比较正常的情况是,在刚开局的时候使用UCT求解,越靠近中间的可落子位置访问次数越多(趋势比较明显),信心上限值也越大(相对于前者趋势并不明显),可以据此进行相应的调试。

  (4)由于在搜索树策略函数中对计算时长进行了限制,所以出现落子超时的情形很有可能是因为出现了死循环的情况,可以用排除法检查一下仅有的几个while循环,确定错误的原因。比如,注意随机数取模的范围,防止找不到可以落子的位置而陷入死循环。

  (1)首先得把谁是user谁是machine理解清楚:这种称呼方式是针对人机对战的,所以machine指的是我所写的AI,而user也就对应了对手,弄反了的结果可能就是你的AI将以很大的概率为对手助攻;

  (2)Node中depth这一描述节点深度的属性是可以被忽略的,最初主要是想用深度作为计算信心上限的一个依据,但测试发现效果并不理想,所以作罢;

  (3)对于这种不长不短的程序还是要慢慢写,变量名合理一些,结构清晰一些,不仅减少了错误的出现还利于调试,总之真正在编写上多花一些时间是值得的。

  1实验任务简介在M行N列的棋盘中,棋手每次只能在每一列当前的最底部落子,如果某一列已经落满,则不能在该列中落子,目标是在横向、纵向、两个斜向共四个方向中的任意一个方向上,使自己的棋子连成四个(或四个以...博文来自:weixin_33676492的博客

  前言:   来万物花开这家创业公司实习,也真是一波三折。先实习了三天,每天下午到公司工作到晚上。工作时间是每天下午到晚上9.30。结果每天上午没法用心干实验室的活了,下午在公司工作的时候,总是提心吊胆...博文来自:This is bill的专属博客

  又是一年高考出分时,感慨颇多。两年前的我高考失利,比平时成绩差了许多,所谓的“一定能上一本A”也成了一个笑话,固然是抹不去的伤痛,高考是我前二十年受到的最大的一次打击,可以说是唯一的一次打击,只能说,...博文来自:printf_王小白

  我们已经知道UCB算法能够更快地找到靠谱的着手点,续上一篇的问,能不能再优化?首先要知道的是,为什么UCB算法比盲目的蒙特卡罗局面评估收敛得更快?我的理解,是因为在算法执行的过程中,UCB算法能不断根...博文来自:coolsooner

  题意:给定一个四子棋的棋盘,问是否存在先手必胜的策略思路:极大极小算法。暴力搜索会T,这里加上剪枝,当发现agt;=b时可以直接返回,这里agt;=b证明找到一种合理策略,最后再用...博文来自:的博客

  实验楼上的一门课,改了部分代码,pygame部分只看了程序框架。课程链接,不知道先手是不是有必胜的算法,感觉很难赢AI。#-*-coding:utf-8-*-#!/usr/bin/pythonimpo...博文来自:沉浸如海

  1.必胜:无论对方走什么都可以必胜。即:轮己方走时,有true则true,轮对方走时,全true为true。2.竞赛中的题目通常是搜到底然后利用alpha-beta剪枝优化,根据兄弟节点的值及时剪枝。...博文来自:YueLings Blog

  极大极小搜索策略一般都是使用在一些博弈类的游戏之中:理论上可以穷举所有的走法,这就需要生成整棵博弈树。这样就会使得时间复杂度非常的大。怎么解决这个问题呢?因此搜索时可以限定博弈树的深度,相当于只往前看...博文来自:samscream的博客

  UCT是怎么走对征子的呢?我想,elife前辈的话一定是对的,否则,MC法不可能有目前的领先地位,一定是有某些地方我们还没有理解到位,出了差错。关于我提出的问题,其实不仅仅是征子的问题,征子只是我用来...博文来自:zhp818的专栏

  实质上可以看成一种增强学习蒙特卡罗树搜索(MCTS)会逐渐的建立一颗不对称的树。可以分为四步并反复迭代:(1)选择从根节点,也就是要做决策的局面R出发向下选择一个最急迫需要被拓展的节点T;局面R是第一...博文来自:Jaster_wisdom的专栏

  蒙特卡洛算法是AlphaGo的核心之一当要求问题在有限的采样步骤以内,必须给出一个解的时候,不要求最优性,就是蒙卡特罗算法两个小实验蒙特卡洛算法的两个小实验。1.计算圆周率pi。原理:先画一个正方形,...博文来自:m0_37876745的博客

  当然,整个开发时间不是三小时,而应该有16个小时左右吧。不过,加入这“AI”功能,可是花了我三个小时呀,比我原来想象的超出了50%的周期,而且效果比想象中还要差很多(我原以为可以把此程序写成永远不会输论坛

  注意事项1要在工程设置里,连接选项的对象库模块中添加opengl32.libglu32.libglaux.lib2 要设置创建的工程类型不是控制台程序而是win32程序按键说明F1    且换全屏与否...博文来自:时时除草,时时耕耘

  引言前面已经介绍了两种bandit算法—ϵ\epsilon-greedy算法和softmax算法。现在我们来总结下这两种算法的共有属性:两种算法在每一轮选择时,默认都是选择到目前为止最好的臂;除此之外...博文来自:但行好事,莫问前程

  照例还是先公布代码 以及编译好的可执行程序,下载地址:博文来自:oyd的专栏

  这是一个高难度的Java3D智力游戏,规则很类似于[b]五子棋[/b],可以说是五子棋的三维立体版本,所以我给他取了一个中文名字,[b]立方四子棋[/b]。试着玩了几盘,都输给电脑了。[url=htt...博文来自:一望无际

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

  围棋中的蒙特卡洛方法其思想很简单,对于当前棋局,随机地模拟双方走步,直到分出胜负为止。通过多次模拟,计算每个可下棋点的获胜概率,选取获胜概率最大的点走棋。在围棋程序中实际使用的是一种被称为蒙特...博文来自:wydbyxr的博客

  第一次使用AndroidStudio时你应该知道的一切配置练习:能够画出9*9格,有两个棋手A,B,交替输入列...博文来自:墨痕未染的博客

  人机对战初体验Python基于Pygame实现四子棋游戏博文来自:的博客

  前段时间看到有小朋友玩一种智力玩具,是一种棋类的木制玩具,玩家双方从木质的小盒子顶部放入棋子,棋子落下,双方谁先实现四子连珠(横着竖着斜着均可),即为胜利。见下图:哈哈,这个创意真不错,作为一个码农,...博文来自:Hello,World!

  平面四子棋事先声明:代码是我自个儿写的,规则不是我发明的~~~~。我觉得我真是太不务正业了!规则在一个7*12的棋盘里,下四子棋。只不过,这个棋盘是竖立着的,它的棋子是从上往下掉的。比如说:如果该红棋...博文来自:致上

  摘要:用于解决多臂赌博机UCB1算法已经被扩展成了解决极大极小树搜索的UCT算法。我们开发了一套Monte-Carlo围棋程序,MoGo,这是第一个使用UCT算法实现的计算机围棋程序。我们解释了为...博文来自:weixin_33804990的博客

  经常混淆于此,特地研究了一下,记录在此以备忘。整个地球分为二十四时区,每个时区都有自己...博文来自:hknaruto的专栏

  本文转自:蒙特卡洛算法,实际上就是用频率估计概率。首先我们知道一个边长为2的正方形面积...博文来自:weixin_37559696的博客

  今天开始研究SamplingMethods,接下来会分为四部分进行讲解。本文是开篇文章,先来讲讲蒙特卡洛算法。  Contents   1.蒙特卡洛介绍  2.蒙特卡洛的应用  3.蒙特卡洛积分   ...博文来自:ACdreamer

  最近在做爬虫的时候遇到了一个问题,在用requests的session方法保持cookie的时候发现requests不能保持手动构建的cookie。起初以为requests只能自动保持由服务器返回的s...博文来自:falseen的博客

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

  总结一下微信的本地图片加载有以下几个特点,也是提高用户体验的关键点 1、缩略图挨个加载,一个一个加载完毕,直到屏幕所有缩略图都加载完成 2、不等当前屏的所有缩略图加载完,迅速向下滑,滑动停止时立即加载...博文来自:lvshaorong的博客

  一、前言最近由于研究需要,要用到线性判别分析(LDA)。于是找了很多资料来看,结果发现大部分讲的都是理论知识,因此最后还是看的一知半解,后来终于找到了个英文的文档,作者由PCA引入LDA,看过后豁然开...博文来自:jnulzl的专栏

  原文地址:因为需要用,所以才翻译了这个文档。但总归赖于英语水平很有限,翻译出来的中文有可能...博文来自:ymj7150697的专栏

  那个清华镜像的版本又太低,尝试了很多办法,最终方案却很简单: 首先更新pip(非anaconda使用者请跳过这步): conda install pip conda update pip ...博文来自:数据分析之路

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  原文地址:反置页表作者:hilg 在分页系统中为每个进程配置一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。在现代计算机系统中通常允许一个进程的逻辑地址空间非常大,因此就有很多页表...博文来自:月光轩辕的专栏

  花了几天,终于把matlab版的人脸检测运行成功了,虽然正确率不是很高,看着各种论文上的人脸检测正确率都出奇的高,我是不怎么相信的,有的论文连基于平均脸的人脸检测正确率都能达到98%,汗啊~~  也许...博文来自:海海人生

  磁盘读写速度的关键之一:Cache     cache技术最近几年,在磁盘存储技术上,发展的非常迅速,作为高端存储,cache已经是整个存储的核心所在,就是中低端存储,也有很大的cache存在,包括...博文来自:pzk417的专栏

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  最近做一个项目,关于用户数据和表单上传的项目,碰到了不少坑,这里总结的分享给大家,希望能够帮助大家。(小白,欢迎大家多交流)多的就不说了,直接来代码吧!!1、上传组件 说明一下,项目是基于vue框架...博文来自:woyidingshijingcheng的博客

  一、概述最近在springboot项目引入thymeleaf模板时,使用非严格标签时,运行会报错。默认thymeleaf模板对html5标签是严格检查的。二、在项目中加NekoHTML库在Maven中...博文来自:Luck_ZZ的博客

  最近想写个图书管理软件,用到了数据库,但是由于是小白,弄了好半天才把数据库搞明白。虽然网上有一些教程,但大多都是长长的文字叙述,所以想写一个图文版的连接教程并把这两天的经验记录下来。 1、首先打开ac...博文来自:u012784288的博客

  gameover1993:楼主,用UCT算法实现实现,智能度怎么样!我最近都在研究UCT,但实现起来老是出现问题。还有,楼主你那个bestChild不考虑没有访问的的节点吗!

本文链接:http://mzi-ads.com/boyishusousuo/578.html

相关推荐:

网友评论:

栏目分类

现金彩票 联系QQ:24498872301 邮箱:24498872301@qq.com

Copyright © 2002-2011 DEDECMS. 现金彩票 版权所有 Power by DedeCms

Top