【五子棋AI循序渐进】——多线程搜索
关于多线程搜索,有很多方法来实现,很多文章推荐基于MTD(F)的方式。好处不言而喻,不过我的程序中采用的是基于PVS的多线程搜索。实现起来主要是这几个方面问题需要解决:
1、置换表的互斥访问。
2、局面的复制。
3、线程同步。
逐个说一下这几方面的实现:
1、置换表的互斥访问。
置换表的作用时保存和读取搜索过的局面。所以使用读写锁即可。代码非常简单,声明一个ReaderWriterLock,在保存置换表时使用写锁,读取时使用读锁。
2、局面复制。
完整的复制position类,方法有很多,我的代码是创建了一个new函数的重载,然后复制全部值。当然完全可以二进制序列化来创建一个全新对象。这种技术在“3D微观分子模型”一篇中创建球、圆柱模型的副本时使用过。
3、线程同步
这里涉及到几个方面的问题。
首先是根节点搜索分离。因为多线程设计时是最基本的从根节点建立线程搜索。根节点搜索函数实际上是一个α-β搜索的简化函数,在程序代码中未使用置换表、内部迭代加深、深度判定等代码,并且将根节点一律视为PV节点处理(不会发生β截断),所以根节点搜索函数只有深度、PV走法两个参数。
然后是封装搜索函数。因为需要向线程传递多个参数:α、β、PV走法、深度、局面等,所以需要重新封装,以便各个线程搜索中互相独立(不包括共享的置换表)。所以需要建立一个搜索类。
最后是线程同步。代码现在只写了基础的部分。只是在根节点分离并初始化多个线程搜索类,然后启动全部搜索线程,等待全部线程结束后,按最佳分值找出最佳走法路线进行返回。这里涉及到另一个主要问题,也就是“殊途同归”,这类现象在五子棋中很多,但也不像某些棋类那么多,所以如果能够高效的处理“殊途同归”问题,可以大量减少多线程资源浪费,从而更充分的利用多线程的优势。但是遗憾的是,这部分代码我还么有写。解决“殊途同归”问题,现在的设计思想是使用置换表技术,因为虽然“殊途”,但在“同归”节点上它们就形成了同一局面,这样可以利用置换表技术,当一个线程在搜索时,其他线程就放弃该分支(这意味着需要再定义一个常量和一个调用函数…………因为前几天在优化VCT\VCF逻辑时需要返回路径中断就曾经使用过这种方法,优势是只需要改几行代码),在后续搜索中,搜索该局面的线程会分辨在其分支中这种局面的优劣,优则与其他线程比较,劣则在搜索它的线程中就被淘汰了。所以这种做法是可行的。
估计这是这系列文章的最后一篇。因为除了一些细节的优化(例如分步或分类生成走法而不一次性生成)暂时还没有新的想法,翻遍了很多参考资料,其中包含了很多近年来一些新的思想和做法,但是绝大多数是与已经应用的技术相同或更落后的一些技术,偶尔看到几篇有启发的研习一番之后发现也都在使用,但属于“殊途同归”,即初衷差不多但是实现角度不同可最终结果基本一致,向“子树复用”技术与正在使用的一项独创启发技术运行过程虽然不相同,但结果基本一致,而且这项启发的复用深度被定义得比“子树复用”要深,而实际实现只有十行代码。
但是,令人不解的是,即使现在在E5200的CPU上可以达到NPS=80K的程度(如上面所说未优化多线程的“殊途同归”,大约可以比单线程多搜索1层,但非常复杂的局面下甚至没有提高),棋力也不如F6(不开启开局库,而且今天又在的全局VCT中发现了一个问题,真败家)。如果修复了这处错误并且解决多线程“殊途同归”问题再实现了分步生成走法,棋力还与F6棋力相差一些,就非常有必要使用“有害剪裁”和“单步延伸”这样的一些局部搜索方式来解决问题了。
【五子棋AI循序渐进】——多线程搜索的更多相关文章
- 【五子棋AI循序渐进】关于VCT,VCF的思考和核心代码
前面几篇发布了一些有关五子棋的基本算法,其中有一些BUG也有很多值得再次思考的问题,在框架和效果上基本达到了一个简单的AI的水平,当然,我也是初学并没有掌握太多的高级技术.对于这个程序现在还在优化当中 ...
- 【五子棋AI循序渐进】——开局库
首先,对前面几篇当中未修复的BUG致歉,在使用代码时请万分小心…………尤其是前面关于VCF\VCT的一些代码和思考,有一些错误.虽然现在基本都修正了,但是我的程序还没有经过非常大量的对局,在这之前,不 ...
- 【五子棋AI循序渐进】——整合完成
经过一年多的学习和探索,终于在今天得到了一些回报,在实现PVS多线程和加入了一个新的启发模式之后,搜索速度达到了120K左右,现在整合了VCF/VCT引擎.PVS混合引擎之后,棋力与连珠fiver6基 ...
- 使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细)
五子棋AI实现 五子棋游戏介绍 五子棋的定义 五子棋是全国智力运动会竞技项目之一,是具有完整信息的.确定性的.轮流行动的.两个游戏者的零和游戏.因此,五子棋是一个博弈问题. 五子棋的玩法 五子棋有两种 ...
- 五子棋AI教程
https://github.com/Chuck-Ai/gobang 我写了非常详细的中文教程,教你如何一步步编写自己的五子棋AI: 五子棋AI设计教程第二版一:前言 五子棋AI设计教程第二版二:博弈 ...
- 五子棋AI清月连珠开源
经过差不多两年的业余时间学习和编写,最近把清月连珠的无禁手部分完善得差不多了.这中间进行了很多思考,也有很多错误认识,到现在有一些东西还没有全面掌握,所以想通过开源于大家共同交流. 最近一直发表一些五 ...
- 五子棋AI大战OC实现
Gobang 五子棋AI大战,该项目主要用到MVC框架,用算法搭建AI实现进攻或防守 一.项目介绍 1.地址: github地址:Gobang 2.效果图: 二.思路介绍 大概说下思路,具体看代码实现 ...
- 五子棋 AI(AIpha-beta算法)
博弈树 下过五子棋的人都应该知道,越厉害的人,对棋面的预测程度越深.换句话讲,就是当你下完一步棋,我就能在我的脑海里假设把我所有可能下的地方都下一遍,然后考虑我下完之后你又会下在哪里,最后我根据每次预 ...
- 人机ai五子棋 ——五子棋AI算法之Java实现
人机ai五子棋 下载:chess.jar (可直接运行) 源码:https://github.com/xcr1234/chess 其实机器博弈最重要的就是打分,分数也就是权重,把棋子下到分数大的地方, ...
随机推荐
- C#生成PDF总结
(一)C#生成PDF总结 (1)iTextSharp控件对iTextSharp研究还可以表格.文字.各种GDI对象,图片,水印,文字旋转(2)aspose的控件(3)PDF Library这个类库(只 ...
- Linux下使用vsftp
参考网址: http://wenku.baidu.com/view/4339434bc850ad02de80419c.html?re=view root用户无法ftp登录,显示530 Permissi ...
- Java NIO之缓冲区Buffer
Java NIO的核心部件: Buffer Channel Selector Buffer 是一个数组,但具有内部状态.如下4个索引: capacity:总容量 position:下一个要读取/写入的 ...
- webpack练手项目之easySlide(二):代码分割(转)
在上一篇 webpack练手项目之easySlide(一):初探webpack 中我们一起为大家介绍了webpack的基本用法,使用webpack对前端代码进行模块化打包. 但是乍一看webpack ...
- 这次,雅虎真的撤销QA团队了
在一个软件开发过程中取消了质量保证团队会发生什么?更少,而不是更多的错误,以及一个大大加快的开发周期. 至少,根据雅虎的经验,确实如此.该公司的首席设计师Amotz Maimon,以及科学与技术高级副 ...
- 《深入浅出Windows Phone 8.1 应用开发》基于Runtime框架全新升级版
<深入浅出Windows Phone 8.1 应用开发>使用WP8.1 Runtime框架最新的API重写了上一本<深入浅出Windows Phone 8应用开发>大部分的的内 ...
- 自己收集原生js-2014-2-23
(function(){})( window.EventUtil={ addHandler:function(element,type,handler){ // alert(1); if(elemen ...
- Ubuntu Gnome 14.04.2 lts 折腾笔记
unity感觉不爽,于是来折腾gnome3 = = 首先去官网下载ubuntu gnome 14.04.2 lts的包(种子:http://cdimage.ubuntu.com/ubuntu-gnom ...
- 【BZOJ】3456: 城市规划
http://www.lydsy.com/JudgeOnline/problem.php?id=3456 题意:求n个点的无向连通图的方案.(n<=130000) #include <bi ...
- 【ZOJ】1015 Fishing Net
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1015 题意:给出一个n个点的无向图,询问是否为弦图,弦图定义为对于图中任意 ...