【五子棋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 其实机器博弈最重要的就是打分,分数也就是权重,把棋子下到分数大的地方, ...
随机推荐
- 旧版API的TextInputFormat源码分析
TextInputFormat类 package org.apache.hadoop.mapred; import java.io.*; import org.apache.hadoop.fs.*; ...
- POJ2711 Leapin' Lizards(最大流)
比较形象的是地图每个点都拆成三个点,这三个点限制流量为0或1,于是再一分为二,这样每个点都被拆成6个点... 其实拆两个点,连容量为柱子高的边,这样就行了.. 这题我掉坑了,“1 lizard was ...
- HTTP协议---HTTP请求中的常用请求字段和HTTP的响应状态码及响应头
http://blog.csdn.net/qxs965266509/article/details/8082810 用于HTTP请求中的常用请求头字段 Accept:用于高速服务器,客户机支持的数据类 ...
- CSS抗锯齿 font-smoothing 属性介绍
CSS3里面加入了一个“-webkit-font-smoothing”属性. 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更清晰舒服. 加上之后就顿时感觉页面小清晰了. 淘宝也在用哦! 它有三 ...
- Codeforces Testing Round #10 A. Forgotten Episode
水题,注意数据范围 #include <iostream> using namespace std; int main(){ long long n,a; cin >> n; ...
- AngularJS的Filter用法详解
上一篇讲了自定义Directive,本篇是要讲到AngularJS的Filter. Filter简介 Filter是用来格式化数据用的. Filter的基本原型( '|' 类似于Linux中的管道模式 ...
- Codeforces Beta Round #7
A题,应该是水题,我没看懂... B题,这题很多坑,注意x是LL,而且x = 0的情况,所以初始化要为-1,最后这题是内存管理啊..操作系统学的不好,题意读不懂啊. 申请内存的时候,是从头找 如果这一 ...
- iOS 获取UIView 动画的实时位置的方法
[self.animationView.layer.presentationLayer frame].origin.x
- get,post 区别,HTTP通信
GET & POST GET 1.GET 的本质是"得" 2.从服务器拿数据,效率更高 3.从数学的角度来讲,GET 的结果是"幂等" ...
- Emmet:HTML/CSS代码快速编写神器
本文来源:http://www.iteye.com/news/27580 ,还可参考:http://www.w3cplus.com/tools/emmet-cheat-sheet.html Em ...