关于多线程搜索,有很多方法来实现,很多文章推荐基于MTD(F)的方式。好处不言而喻,不过我的程序中采用的是基于PVS的多线程搜索。实现起来主要是这几个方面问题需要解决:1、置换表的互斥访问。2、局面的复制。3、线程同步。逐个说一下这几方面的实现:1、置换表的互斥访问。置换表的作用时保存和读取搜索过的局面。所以使用读写锁即可。代码非常简单,声明一个ReaderWriterLock,在保存置换表时使用写锁,读取时使用读锁。2、局面复制。 完整的复制position类,方法有很多,我的代码是创建了一个new函数的重载,然后复制全部值。当然完全可以二进制序列化来创建一个全新对象。这种技术在“3D微观. Read More
开局库制作的方法和检索方式。 Read More
VCT,VCF的思路和核心代码 Read More
该文被密码保护。 Read More
内嵌ASM的方法和ASM代码如何编辑 Read More
经过这半年左右的学习和探索,现在对五子棋AI有了一定的认识,给大家发出来现在的版本。因为最近有些事情很生气,要是年轻时真就先灭了这些王八羔子,省的它们继续祸害好人。不过它们也祸害不了几天了,祸害人者人祸害之。心情不好,就少打几个字,说一下基本思路:1、每一个点的重要性,决定于四个方向上的棋型;棋型是可以相互转化的,可以枚举出每一种变化以及它们之间的关联关系。 例如:(0=白、1=黑、2=空,程序中和下面全文均如此) 一行空棋 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 当白棋要下的时候,就要考察更好的点,我们如果给这一行棋评分如下0 1 1 1 1 1 1 1 1 1 1 Read More
这些天重新整理了一下整个程序,头发都白了几十根。对整个程序进行了初步的重新设计,现在可以2秒内搜索8层,搜索速度仅仅有七八千(棋力比以前要高,执黑执白都基本能和F6下到40手以上,呵呵,不过输多。可能代码中还有某些错误导致极少数情况下棋型识别或评价不正确,我还没找到)。涉及到前面的几个话题,重新认识一下:1、棋盘表示:使用前一篇提到的原理,逐个手工矫正9长度棋型两万来个,并由它生成了5-15长度的其他棋型,但是因为使用内存和初始化速度的原因,没有生成9以上的XML,只保存了5-9的XML,9以上的进行计算。这应该是整个程序速度限制的最大原因了。2、局面评估、走法生成:这都是由棋盘表示法决定的. Read More
更新棋盘表示方法,以求得到更高的效率。 Read More
今天更新这一版本的程序,主要做了以下修改:
1、将常量放在一个单独类
2、用向量类代替棋盘类并更改记录方式
3、新的评价方法
4、根据棋型生成key
5、下子时只更新被改变的向量
6、实现双置换表
7、使用:历史表、alpha-beta剪裁、空步剪裁、冲棋延伸、主要变例搜索、迭代加深技术。不使用静态搜索等技术。
8、统计相关信息,以便计算置换表命中率、每秒搜索节点数、等等信息。
遗留问题:
1、棋型提取和评价函数。虽然找到了更优的棋型提取方法和评价函数,并且理论上速度可以达到与象棋引擎接近甚至更快的速度,但是代码还没写。
2、更好的剪裁方式。虽然现有的剪裁方式已经不错了,但是只要挖掘就还能找到更好的方法。就像代码中的棋盘剪裁更新一样。
接下来解释一下置换表和更新的这些部分的代码,以便下载源程序后更快的看完它。 Read More
实现静态搜索。 Read More