【五子棋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 其实机器博弈最重要的就是打分,分数也就是权重,把棋子下到分数大的地方, ...
随机推荐
- Find Minimum in Rotated Sorted Array
package leetcode; /* * * 注意问题: * 1. 原序列升序.降序问题,两种情况都要考虑 * 2. 边界问题,如果只有两个元素时要单独考虑,在num[mid]==num[left ...
- MongoDB 入门之基础 DML
此文章主要记录部分主要的 MongoDB Collection 的 DML 操作. 文章中的 Collection 名字为 yourColl,每一次操作包含以下两条初始数据 { "_id&q ...
- uva-465(overflow)
这道题很奇葩啊,WA了4发...妈的,用c++也不至于,输出竟然要原样输出... 例如: 0000000000000000006 * 000000000000001 输出是 0000000000000 ...
- 03_Swift2基础之基本数据类型+相互转换
1. 整数 整数就是没有小数部分的数字,比如`42`和`-23`.整数可以是`有符号`(正.负.零)或者`无符号`(正.零). Swift 提供了,,和位的有符号和无符号整数类型.这些整数类型和 C语 ...
- Rock-Paper-Scissors Tournament[HDU1148]
Rock-Paper-Scissors TournamentTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- [转]expect的安装
转自:http://blog.chinaunix.net/uid-20639775-id-2453085.html Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令,它可以用来 ...
- jQueryUI日期显示
<script type="text/javascript" src="js/My97DatePicker/WdatePicker.js">< ...
- js+css立体旋转
纯 CSS3 制作可口可乐罐 这个效果相信大家很多人看过了,纯css实现的立体可口可乐罐,看起来相当高大上~ 于是今天我这小菜鸟试着研究下,稍微遗憾的是,没有看到源码,还是直接F12吧,貌似实现也不 ...
- Java_动态加载类(英文)
It is possible to load and reload classes at runtime in Java, though it is not as straightforward as ...
- flex lineChart 显示所有的数据节点
.If you're using <mx:LineSeries>, then set the following property:itemRenderer="mx.charts ...