关于多线程搜索,有很多方法来实现,很多文章推荐基于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循序渐进】——多线程搜索的更多相关文章

  1. 【五子棋AI循序渐进】关于VCT,VCF的思考和核心代码

    前面几篇发布了一些有关五子棋的基本算法,其中有一些BUG也有很多值得再次思考的问题,在框架和效果上基本达到了一个简单的AI的水平,当然,我也是初学并没有掌握太多的高级技术.对于这个程序现在还在优化当中 ...

  2. 【五子棋AI循序渐进】——开局库

    首先,对前面几篇当中未修复的BUG致歉,在使用代码时请万分小心…………尤其是前面关于VCF\VCT的一些代码和思考,有一些错误.虽然现在基本都修正了,但是我的程序还没有经过非常大量的对局,在这之前,不 ...

  3. 【五子棋AI循序渐进】——整合完成

    经过一年多的学习和探索,终于在今天得到了一些回报,在实现PVS多线程和加入了一个新的启发模式之后,搜索速度达到了120K左右,现在整合了VCF/VCT引擎.PVS混合引擎之后,棋力与连珠fiver6基 ...

  4. 使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细)

    五子棋AI实现 五子棋游戏介绍 五子棋的定义 五子棋是全国智力运动会竞技项目之一,是具有完整信息的.确定性的.轮流行动的.两个游戏者的零和游戏.因此,五子棋是一个博弈问题. 五子棋的玩法 五子棋有两种 ...

  5. 五子棋AI教程

    https://github.com/Chuck-Ai/gobang 我写了非常详细的中文教程,教你如何一步步编写自己的五子棋AI: 五子棋AI设计教程第二版一:前言 五子棋AI设计教程第二版二:博弈 ...

  6. 五子棋AI清月连珠开源

    经过差不多两年的业余时间学习和编写,最近把清月连珠的无禁手部分完善得差不多了.这中间进行了很多思考,也有很多错误认识,到现在有一些东西还没有全面掌握,所以想通过开源于大家共同交流. 最近一直发表一些五 ...

  7. 五子棋AI大战OC实现

    Gobang 五子棋AI大战,该项目主要用到MVC框架,用算法搭建AI实现进攻或防守 一.项目介绍 1.地址: github地址:Gobang 2.效果图: 二.思路介绍 大概说下思路,具体看代码实现 ...

  8. 五子棋 AI(AIpha-beta算法)

    博弈树 下过五子棋的人都应该知道,越厉害的人,对棋面的预测程度越深.换句话讲,就是当你下完一步棋,我就能在我的脑海里假设把我所有可能下的地方都下一遍,然后考虑我下完之后你又会下在哪里,最后我根据每次预 ...

  9. 人机ai五子棋 ——五子棋AI算法之Java实现

    人机ai五子棋 下载:chess.jar (可直接运行) 源码:https://github.com/xcr1234/chess 其实机器博弈最重要的就是打分,分数也就是权重,把棋子下到分数大的地方, ...

随机推荐

  1. ural 1073. Square Country

    1073. Square Country Time limit: 1.0 secondMemory limit: 64 MB There live square people in a square ...

  2. apache htpasswd.exe创建密码

    一.使用apache htpasswd.exe创建密码文件,命令请看PHP推荐教程:apache htpasswd命令用法详解 apache htpasswd命令用法实例 1.如何利用htpasswd ...

  3. gson 简要使用

    http://www.cnblogs.com/chenlhuaf/archive/2011/05/01/gson_test.html 发现了google的gson,因为之前对于protocolbuf有 ...

  4. CentOS6.4安装mysql2redis

    1.安装apr 下载:http://apache.dataguru.cn//apr/apr-1.5.1.tar.gz tar zxvf apr-.tar.gz cd apr- vi configure ...

  5. Codeforces Round #243 (Div. 2) A. Sereja and Mugs

    #include <iostream> #include <vector> #include <algorithm> #include <numeric> ...

  6. ACM: Billboard 解题报告-线段树

     Billboard Time Limit:8000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descript ...

  7. Android -- 闹钟服务的使用(单次闹钟)

    1. 效果图

  8. 详解SpringMVC请求的时候是如何找到正确的Controller[附带源码分析]

    目录 前言 源码分析 重要接口介绍 SpringMVC初始化的时候做了什么 HandlerExecutionChain的获取 实例 资源文件映射 总结 参考资料 前言 SpringMVC是目前主流的W ...

  9. GUI之绘画控制

    一.绘制的动力 GUI的绘画是根据消息动作驱动的 主循环应该是 二.绘制的过程 绘画过程应该是这样的: 首先窗口存在上下层关系-> 在绘制时应该从底部窗口开始绘制,逐一绘制 下面是一些特殊的窗口 ...

  10. 优化UITableViewCell高度计算的那些事

    优化UITableViewCell高度计算的那些事 我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化 ...