【五子棋AI】启发算法——开局库

         开局库不是我本身制做的,是在网上下载的“十四地毯普”,而后我把它解析出来,去掉无用信息,进行压缩做为资源放在软件中。由于是执黑必胜的地毯,因此软件执白时不多用到开局库,除非开局库中的局面被证实是好局面(其实无禁手来说,黑棋控盘稍强白棋就没有好局面——即便在地毯普中)。数组

        下面说一下解析LIB类型的地毯普,其实解析LIB根本没有什么难度,RENLIB是开源的,除了它使用的第三方bestmove.dll以外。只须要在它的主页上下载源码看一下就知道了,它是按位记录信息类型的,我用VB.NET复原了一部分解析代码,而后去掉对软件无用的部分。函数

        开局库的重点除了获取以外(五子棋的比较容易,由于有地毯普,不要介意禁手问题)就是保存,这里的保存不是指文件(保存为文件只须要用先序遍历保存,读取时设置一个后进先出记录就很容易复原树),而是指在内存中保存的形式——这种形式要便于根据局面取得招法,并且还有就是局面的对称、旋转局面都要易于查找。开始时我写了一系列的函数来完成这些工做,并且至今这些对称、旋转局面的方法依然存在在代码中。其主要缘由就是把对称、旋转局面合并须要的解析时间太长了…………简直就是久远……但旋转走法很是简单。编码

        不要尝试用树的形式保存,而后去遍历,你会发现当局面上的棋子达到必定数目以后(例如十个),要搜索每种排列将是耗时很是长的。因此咱们使用一个key/value集合来记录走法。而其中的key就取自局面key,这并不意味着搜索开局库还须要addpipe,咱们只须要直接计算key就能够了。这样一来,就避免了全排列——key与顺序无关。value是一个走法数组,个人代码中用了一个list(of integer),由于4字节记录坐标以外,我还记录了其余一些信息——例如走法的好坏。ip

        因而,搜索开局库时,传入当前走法路线mvs(),而后把他们用转换函数转换获得用于搜索的8个key,依次搜索,在最好的一组结果中随机取一个并逆转换便可。内存

        对于五子棋来说,执黑必胜地毯普咱们能够更深刻的利用:树上的叶节点即VCF/VCT的起点。固然也能够这样理解:不管下一步白棋走哪里,黑棋也有VCF或VCT。之因此这样说,是由于在编码时即便知道当前走了叶节点,也不能立刻搜索,固然若是你非要这么作将面临搜索对方全部可能走法或者提早一步进行VCF/VCT搜索,这样作无疑效率低太多。因此个人作法是识别上一步的上一步是叶节点走法,亦即上一步的上一步的上一步在开局库中获得了叶节点走法——也许你会考虑到,这不严格,但实际上若是考虑到走法有好坏记录以及白棋脱谱的状况,能够说这是严格的——这个严格是指必定存在VCT或VCF。资源

        具体实现来讲,就是把走法路线的后几步去掉,而后在开局库中搜索,看看是否达到叶节点,若是是,则进行VCF/VCT搜索找到路径。get


所有文章和源码整理完成,之后更新也会在下面地址:源码

http://www.vbdevelopers.orgpip

http://www.softos.org效率