一种机器博弈的亚马逊棋ai算法

文档序号:10618496阅读:1267来源:国知局
一种机器博弈的亚马逊棋ai算法
【专利摘要】一种机器博弈的亚马逊棋AI算法包括搜索算法和估计算法;其中,搜索算法将生成的可行招法排序,最大可能的将能引发剪枝或能得到较好效果的招法:通过为每一个效果赋值以判定招法的好坏,排在前面;搜索算法还体现在不同阶段采用不同策略:搜索深度越小的层次,生成的招法会被裁剪的越小;而在较深的层次需要展开全招法,即不对招法进行裁剪;估值算法通过加入区域占领参数occupy,使对占领格子的判断更准确;在不同阶段采用不同估值参数,基于步数判断棋局进行到了哪个程度,再决定使用哪种参数,再根据局面对估值参数进行动态调整;此外,还采用优化的多线程:使共享资源尽量少以及使各线程间有互斥地共享有价值的资源。
【专利说明】
-种机器博弈的亚马逊棋AI算法
技术领域
[0001] 本发明主要设及捜索算法、多线程运用W及估值函数,尤其设及一种机器博弈的 亚马逊棋AI算法,属于人工智能博弈、捜索算法、估值算法领域。
【背景技术】
[0002] 1.机器博弈
[0003] 计算机博弈(也称机器博弈),是一个挑战无穷、生机勃勃的研究领域,是人工智能 领域的重要研究方向,是机器智能、兵棋推演、智能决策系统等人工智能领域的重要科研基 础。机器博弈被认为是人工智能领域最具挑战性的研究方向之一。国际象棋的计算机博弈 已经有了很长的历史,并且经历了一场波欄壮阔的"搏杀","深蓝"计算机的胜利也给人类 留下了难W忘怀的记忆。时至今日,每年仍有很多不同棋类的人机对战W及机器间博弈在 包括中国的世界各地定期举行。我们研究的亚马逊棋作为国内计算机博弈锦标赛W及国际 计算机博弈竞赛(ICGA)的重要比赛项目已有多年的竞赛积累,两项比赛的冠军亦在不断地 更迭中不断进步。
[0004] 亚马逊棋(Game of the Amazons),是由阿根廷人Walter Zamkauska在 1988年推 出的两人棋类,是奥林匹亚电脑游戏程式竞赛的比赛指定棋类-。
[0005] 由于局面过于复杂,仅第一步就有两千屯百多种走法,故该棋类多不用于人类之 间比赛,而是用于计算机博弈相关方面的比赛与研究。
[0006] 10*10方格棋盘。
[0007] 每方各4枚棋子,W黑白两色区分敌我,称为亚马逊(Amazons) ;92枚棋子双方共 用,称为箭(Arrows)。
[000引初始布置后,双方轮流动一己子,方向可朝纵横斜八方,距离无限制至空棋位,中 途不得有子。在移动至目标棋位后,从该棋位检视其可移动范围,然后在运范围的任一空格 放置一枚箭。箭放定后,就不得移动或移除。
[0009] 直至一方无法行棋则输掉此游戏。
[0010] 2.AlphaBe1:a 剪枝算法
[0011 ] AlphaBeta剪枝算法(AlphaBeta pruning algorithm)是一个捜索算法旨在减少 在其捜索树中,被极大极小(Minimax)算法评估的节点数。运是一个常用人机游戏对抗的捜 索算法。它的基本思想是根据上一层已经得到的当前最优结果,决定目前的捜索是否要继 续下去。AlphaBe化剪枝算法是对Minimax方法的优化,它们产生的结果是完全相同的,只不 过运行效率不一样。AlphaBeta剪枝算法的前提假设与Minimax也是一样的,具体体现在如 下Ξ方面:
[0012] 1)双方都按自己认为的最佳着法行棋;
[0013] 2)对给定的盘面用一个分值来评估,运个评估值永远是从一方(捜索程序)来评价 的,己方有利时给一个正数,对方有利时给一个负数;当红方走棋时,如果红方有利时返回 正数,当轮到黑方走棋时,评估值又转换到黑方的观点,如果认为黑方有利,也返回正数;
[0014] 3) -般来说分值大的数表示对己方有利,而对于对方来说,它会选择分值小的着 法。
[0015] AlphaBeta算法严重依赖于着法的寻找顺序,若总是先去捜索最坏的着法,那么 Beta截断就不会发生,即AlphaBeta算法最终会找遍整个捜索树,就像最小最大算法一样, 效率非常低。
[0016] 若程序总是能挑最好的着法来首先捜索,那么数学上有效分枝因子就接近于实际 分枝因子的平方根,运是A1地aBeta算法可能达到的最好的情况。
[0017] 3.多线程技术
[0018]多线程(multithreading)是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整 体处理性能。在一个程序中,运些独立运行的程序片段叫"线程"(化read),利用它编程的概 念就叫做"多线程"或"多线程处理"(Multit虹eading processing)。
[0019] 4.估值函数
[0020] 估值函数用于估计一个局面的效果(正值表示对我方有利,越大越好,负值相反), 估值函数是A1地aBeta算法不可或缺的重要部分,估值函数的好坏一方面决定了剪枝效率, 另一方面也决定了最终招法的优劣程度。
[0021] 针对亚马逊棋捜索算法的研究,经过资料检索,大约有如下几类:
[0022] a)东北大学张柳在2010年发表的"题目为基于极大极小捜索算法的亚马逊棋博弈 系统的研究"的学位论文中,利用经典的AlphaBeta算法、纳什均衡原理W及基于棋子位置 的估值函数设计了一个亚马逊棋的博弈程序。但是该程序的捜索效率依然较低。而且估值 函数较简单,虽然可节省时间,但是其获得的估值不能准确反映招法的真实价值。
[0023] b)在Julien Kloetzer等人发表于Computer Games Workshop 2007论坛上的题目 为"The Monte-Carlo Approach in Amazons"的论文中,他们利用机器博弈领域另一经典 算法,蒙特卡洛算法设计实现了一个亚马逊棋博弈程序。同样的,虽然采用了不同的算法, 其捜索效率并没有得到显著提升;且相对于A1地aBeta算法,采用uct算法的程序中对估值 函数难于掌握,不易编写一个适应捜索深度变化的估值函数,即估值的效果不稳定。
[0024] 其次,针对亚马逊棋估值函数的研究,经过资料检索,除上述论文外,还有W下运 种主流估值:
[00巧]C)在Jens Lieberum发表于Theoretical Computer Science ,Vol. :349,No. 2的题 目为''An evaluation function for the game of amazons"的论文中,采用了基于领地和 位置的估值,并引入了灵活度的概念。该估值算法具有一定准确性,但该算法对占领格子与 被棋子围堵的情况考虑不到位,导致与对方抢占地盘时容易失利,或出现被对方围堵在较 小范围内的不利局面;并且该算法对棋子的影响范围的估计不到位,容易出现某棋子被孤 立,形成W-敌多的局面。
[0026] 本申请致力于克服上述效率较低及估值不准确的问题,旨在提出更高效率的捜索 算法,W及更准确的用于亚马逊棋博弈的估值函数。

【发明内容】

[0027] 本发明的目的是克服现有捜索算法捜索效率较低、估值不准确、估值效果不稳定、 W及对占领格子与棋子围堵情况考虑不周的问题,提出了一种机器博弈的亚马逊棋AI算 法。
[0028] -种机器博弈的亚马逊棋AI算法包括捜索算法和估值算法两方面;
[0029] 其中,捜索算法方面,将生成的可行招法排序,最大可能的将能引发剪枝或能得到 较好效果的招法,具体的,通过为每一个效果赋值W判定招法的好坏,排在前面;捜索算法 还体现在不同阶段采用不同策略:在捜索未到达最底层时,生成的招法会被裁剪;而当捜索 到达最底层时需要展开全招法,即不对招法进行裁剪;
[0030] 估值算法方面,一方面,通过加入区域占领参数occupy,使对占领格子的判断更准 确;另一方面,在不同阶段采用不同估值参数,基于步数判断棋局进行到了哪个程度,再决 定使用哪种参数,再根据局面对估值参数进行动态调整;
[0031] 此外,捜索算法中还采用优化的多线程:一方面使共享资源尽量少,W防止等待资 源消耗的时间;另一方面,使各线程间有互斥地共享有价值的资源,从而提升AlphaBeta算 法的效率;具体优化参数主要包括全局变量A1地aB,MultiThread函数中变量i,将变量best 引入AlphaBe化函数,W及改进AlphaBe化算法中对返回和更新be化值的机制;
[0032] 另外,在A1地aBeta的最底层采用更新排序,其它层采用估值排序;
[0033] -种机器博弈的亚马逊棋AI算法,主要设及如下函数:
[0034]
[0035]
[0036] -种机器博弈的亚马逊棋AI算法,具体步骤如下:
[0037] 步骤一、声明全局变量并初始化下棋步数为0;
[0038] 具体的,步骤一中声明的全局变量主要如下:
[0039] 1.1声明A1地aB用于记录多线程中综合的最好估值;
[0040] 1.2声明maxdepth定义捜索深度;
[0041 ] 1.3声明MOVEi记录各线程各自的最好招法的编号;
[0042] 1.4声明BestMove记录全局的最好招法;
[0043] 1.5声明qstep和kstep用于估值函数;
[0044] 1.6声明51';
[0045] 1.7声明to化ITime记录一盘棋开始到目前的总用时;
[0046] 1.8声明movestack用于存储招法,moves1:ack又称招法找;
[0047] 其中,qstep的含义为四个棋子中沿单一方向连续行进到达的某一格子所需的最 少步数;
[004引kstep的含义为四个棋子中方向任意地单步行进到达的某一格子所需的最少步 数;ST的含义为记录最顶层捜索到了第几个招法;
[0049]步骤二、捜索并选择可用的招法,又具体包括如下步骤:
[0化0] 步骤2.1调用入口函数sea;rch_a_goo血ove;
[0051 ] 步骤2.2在函数36曰'油_曰_邑00(11]10¥6中初始化部分全局变量:其中所述的部分全局 变量主要包括全局变量AlphaB;
[0化2] 所述的A1地aB初始值为-INF;
[0053] 步骤2.3根据下棋步数得出捜索深度值Μ;
[0054] 具体步骤为:
[0055] 步骤2.3.1当步数step小于Κ1,则捜索深度值Μ为4;
[0056] 步骤2.3.2当步数step大于等于Κ1小于Κ2,则捜索深度值Μ为5;
[0057] 步骤2.3.3当步数step大于等于Κ2,则捜索深度值Μ为6;
[005引其中,优选的Κ1为32,也可W是大于20小于38的整数;
[0059] 其中,优选的Κ2为48,也可W是大于30小于60的整数;
[0060] 步骤2.4调用^日日1日1〇¥日_日¥日1生成招法;
[0061 ] 步骤2.5对生成的每一个招法调用Evaluate函数,并对所有招法调用Evaluate函 数的返回值进行排序;
[0062] 步骤2.6根据步数和对步骤2.5调用createMove_eval生成的招法进行裁剪,具体 为:
[00创 2.6.1当步数step小于K3且招法数大于K4,则保留排序在前K4的招法;
[0064] 2.6.2当步数step大于等于K3且招法数大于K5,则保留排序在前K5的招法;
[0065] 其中,优选的K3为32,也可W是大于6小于36的整数;
[0066] 其中,优选的K4为300,也可W是大于200小于400的整数;
[0067] 其中,优选的K5为400,也可W是大于300小于500的整数;
[0068] 步骤2.7当总用时to化ITime超过14分钟,则将捜索深度值Μ设为4;
[0069] 步骤2.8调用Mu 11 i Τ虹ead函数启动多线程;
[0070] 步骤2.9等待直至步骤2.7的所有线程运行结束,删除多线程并返回;
[0071] 步骤Ξ、调用createMove生成可行招法,将满足条件的招法连同估值一起存入招 法找返回:
[0072] 所述的满足条件是所产生的招法落子点或落障碍处,至少有一点满足五步W内有 对方棋子;
[0073] 具体的,步骤Ξ的执行过程包括:
[0074] 步骤3.1对本方四个棋子中的每一个棋子做如下3.11和3.12两个操作,得出一个 可行招法;
[0075] 3.11从棋子出发遍历上下左右四个方向,再遍历每个方向上最多10个可行步,找 到符合落子的格子,再遍历所有符合落子的格子,对每一格子执行3.12;
[0076] 3.12从每一可落子的格子出发,遍历上下左右四个方向,再遍历每个方向上最多 10个可行步,找到可W设置障碍的格子;
[0077] 步骤3.2根据步骤3.1得出的可行招法分别做如下四类操作:
[0078] 步骤3.2.1调用createMove得到可行招法后直接存入招法找,继续捜索其他招法; [00巧]步骤3.2.2调用。的日*日1〇乂日_日乂日1执行招法,调用估值函数,得到执行招法后的估 值(可认为即为该招法的估值),将估值和招法都存入招法找;
[0080] 步骤3.2.3调用createMove_select在产生招法后先对招法进行检查,是否满足如 下条件:
[0081] 所产生的招法落子点或落障碍处,至少有一点满足五步W内有对方棋子;
[0082] 再将满足条件的招法加入招法找;
[0083] 步骤3.2.4沈6曰*6]\1〇¥6_3616(316¥曰1结合3.2.2和3.2.3,将满足条件的招法连同估 值一起存入招法找;
[0084] 步骤3.3遍历结束后,返回;
[00化]步骤四、调用处理多线程的函数MultiT虹ead,具体为:
[0086] 步骤4.1声明变量i,为全局变量ST设置互斥锁,在互斥锁内将ST的值赋给i,并给 ST加1;然后释放ST的互斥锁;
[0087] 步骤4.2遍历步骤Ξ生成的所有顶层招法;
[00则步骤4.2.1对遍历到的每个招法,在模拟棋盘上执行AlphaBeta捜索,返回该招法 的估值;再撤销在模拟棋盘上该招法的执行;
[0089] 步骤4.2.2若步骤4.2.1返回招法的估值大于当前线程的最好估值,则修改当前线 程最好招法,并记录新的最好估值;
[0090] 步骤4.2.3为全局变量AlphaB设置互斥锁,在互斥锁内判断如果当前线程最好估 值大于全局最好估值AlphaB,则修改全局最好招法及AlphaB,并更新全局最好招法 BestMove,然后释放A1地aB的互斥锁;
[0091] 步骤五、调用A1地aBeta函数进行捜索;
[0092] 步骤5.1判断捜索深度,进行相应操作:
[0093] 5.11若捜索到达最底,即传入的参数d邱地==0,则调用估值函数Evaluate,并返 回估值;
[0094] 5.12否则,调用createMove_selecteval 或 createMove_eval 生成招法,同时,对每 个生成招法调用Evaluate进行估值,生成全部招法后根据估值,即Evaluate返回值对招法 进行排序,具体为:
[00巧]5.12.1在20步W内有选择性的生成招法,即调用createMove_selecteval函数来 生成招法;
[0096] 5.12.2否则生成全部招法,即调用createMove_eval函数来生成招法;
[0097] 步骤5.2根据捜索深度对招法进行裁剪,具体为:
[0098] 5.2.1当捜索深度d邱th为1时不裁剪招法;
[0099] 5.2.2当捜索深度d邱th为2且招法数大于K6,则保留排序在前K6的招法;
[0100] 5.2.3当捜索深度depth为3且招法数大于K7,则保留排序在前K7的招法;
[0101] 5.2.4当捜索深度d邱th为4且招法数大于Κ8,则保留排序在前Κ8的招法;
[0102] 其中,优选的Κ6为300,也可W是大于250小于350的整数;
[0103] 其中,优选的Κ7为200,也可W是大于150小于250的整数;
[0104] 其中,优选的Κ8为100,也可W是大于80小于120的整数;
[0105] 步骤5.3判断当前招法数是否为0,并进行相应操作:
[0106] 5.31若生成的招法数为0,说明棋局已经结束,返回-1肥+(111曰加6口地-(16口地);
[0107] 5.32若生成的招法数不为0,则继续步骤5.4;
[0108] 步骤5.4对产生的招法估值,并返回该层的最好估值或第一个大于be化的估值,具 体为:
[0109] 步骤5.4.1声明变量best,并初始化为-1,将当前最好估值赋值给best;
[0110] 步骤5.4.2遍历执行步骤5.1和5.2产生的所有招法并进入下一层A1地aBeta,递归 直至返回估值;
[0111] 步骤5.4.3得到步骤5.4.1的估值后,若估值大于best,则将得到的估值赋给best;
[0112] 步骤5.4.4若估值大于be化,则返回估值;
[0113] 步骤5.4.5遍历结束后,若有更好的招法,则记录并更新;
[0114] 步骤 5.4.6 返回best;
[0115] 步骤六、调用估值函数Evaluate;
[0116] 步骤6.1调用Evaluate该函数计算qst邱和kst邱;
[0117] 步骤6.2再计算四个基础变量:*1、*2、(:1、〇2;运四个值在每次调用估值函数时都 初始化为0,具体包含如下操作:
[011引步骤6.2.1通过a和b确定tl的值:
[0119] a.当某个格子双方qst邱值相同时,对于当前行棋颜色给予tlx分奖励,非当前行 棋给予-tlx分的惩罚,再将此奖励或惩罚的分数加在tl上;
[0120] 其中,所述的11X分数范围为0.0到1.0;
[0121] b.当我方qst邱值较小时,使tl获得一个加分score,反之获得一个负分-score;的 值为能Wqst邱所代表的步数到达该格子的棋子的个数,即对于一个可最少步数到达 的格子,记录能W最少步数到达的棋子的数量;
[0122] 其中,所述的score分数范围为大于1的整数,原则上不设上限;
[0123] a、b同时运用W防止出现W-敌多的局面;
[0124] 步骤6.2.2计算t2的值,具体为:遍历所有kst邱,当我方kst邱值较小则t2加1,当 对方kst巧值较小则t2减1;
[012引步骤6.2.3计算cl及c2的值,具体为:
[01%] cl + =(pow(2.0,-qstep[thread][i][ j][0])-pow(2.0,-qstep[thread][i][ j]
[0127] c化=min(l,max(-l,(kstep[thread][i][j][l].st-kstep[thread][i][j][0] .st)/6.0));
[01 %]注:thread表示当前线程数,i、j对应棋盘上格子,最后一维为0代表我方,1代表对 方;
[0129]步骤6.3声明计算变量occupy,并赋occupy初值为1,当某格子只有我方可到达则 将occupy加一,否则将occupy减1,即occupy记录了我方当前局面已经占领的空格子数量;
[0130] 步骤6.4声明并计算变量3111114[2];
[0131] 其中,所述的sumA[2]代表双方棋子的灵活度,计算方法如下:
[0132] 步骤6.4.1对于每一个棋子计算其灵活度:寻找该棋子一步即可到达的所有空格 子,对于每一个空格子记录棋子与空格子的距离记为i,再计算该空格子周围8个格子中为 空的格子数量记为N;计算A = N*pow(2.0,-i);对于所有棋子一步可到达的空格子都能得到 运样一个A,棋子的灵活度AM即为所有运样的A的和;
[0133] 步骤6.4.2sumA为四个棋子各自AM的和;对于双方都计算灵活度,可W得到双方各 自的sumA;
[0134] 至此,经过步骤一到步骤六,完成了一种机器博弈的亚马逊棋AI算法。
[0135] 有益效果
[0136] 本发明一种机器博弈的亚马逊棋AI算法与现有亚马逊棋AI算法相比,具有如下有 益效果:
[0137] 1.本发明所述算法在多线程策略中,全局变量A1地aB不止在A1地aBeta的最顶层 被修改,而是在内层触发某种条件时就能被修改,此策略的应用显著地提高了捜素速度,即 提升了算法效率;
[0138] 2.本发明所述算法在多线程策略中,声明变量i并为其设置互斥锁,保证同一时刻 里只有一个线程能访问该变量;i使得多个线程可W像一个线程运行时一样,从0到η逐个捜 索招法,在有招法排序的前提下,此策略可W提高剪枝效率;
[0139] 3.本发明所提算法,在全盘运行时间为15分钟W内的情况下,可实现将Α1地aBeta 捜索的最低层数由3层提升至4层,即表示本算法可W在全盘运行时间不允许超过15分钟的 情况下,比同类算法的对手多考虑一步;
[0140] 4.本发明所提算法在有益效果1的基础上,后期的最深思考层数可达6层,经测试 层数继续加深依然可
[0141] 5.本发明所提估值算法中,代表灵活度的值sumA的计算方法的改进使得估值函数 对占领格子,与被围堵的判断更精准,使得在运两个情况出现时,最终给出的招法更合理有 效。
【附图说明】
[0142] 图1为本发明一种机器博弈的亚马逊棋AI算法的流程图;
[0143] 图2为本发明一种机器博弈的亚马逊棋AI算法及其实施例中使用的亚马逊棋盘。
[0144] 实施方式
[0145] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例 中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例是 本发明的一部分实施例,而不是全部实施例。
[0146] 需要说明的是程序中有全局变量step,记录双方从开局到当前局面共执行的步 数,初值为零。
[0147] 实施例1
[0148] 当step大于等于6小于10时,设置默认捜索深度Μ为4;带估值的生成招法,按估值 排序招法找,剪枝留下排序在前Κ4的招法;交付多线程运行。
[0149] 各线程分别调用Α1曲aBeta函数,采用选择性生成方式生成下一层招法,按估值排 序,然后剪枝,根据深度不同使招法分别不超过Κ6,Κ7,Κ8个。
[0150] 遍历生成的招法,执行之,再次调用Α1地aBeta进入下层。
[0151] 捜索深度在递归过程中递减,直至为0,则调用估值函数,并返回;不再调用 A1地aBeta。该估值采用对灵活度更敏感的参数。
[0152] 根据规则更新al地a,be化,best值,修改A1地aB。遍历所有招法后再向上层返回。
[0153] 直至返回到顶层,在Multi化read函数中根据规则更新该线程最好招法。
[0154] 所有线程结束后,综合各线程最好招法选出全局最好招法。
[0155] 实施例2
[0156] 当step大于等于20小于32,在实施例3的基础上采用更全面的招法生成,即在生成 招法时没有选择性。
[0157] 实施例3
[0158] 当step大于等于32小于48,设置默认捜索深度Μ为5;带估值的生成招法,按估值排 序招法找,剪枝留下排序在前Κ5的招法;后续步骤与实施例1相同。
[0159] 综上所述,W上仅为本发明的较佳实例而已,并非用于限定本发明的保护范围。凡 在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保 护范围之内。
【主权项】
1. 一种机器博弈的亚马逊棋Al算法,其特征在于: 一种机器博弈的亚马逊棋AI算法包括搜索算法和估值算法两方面; 其中,搜索算法方面,将生成的可行招法排序,最大可能的将能引发剪枝或能得到较好 效果的招法,具体的,通过为每一个效果赋值以判定招法的好坏,排在前面;搜索算法还体 现在不同阶段采用不同策略:在搜索未到达最底层时,生成的招法会被裁剪;而当搜索到达 最底层时需要展开全招法,即不对招法进行裁剪; 估值算法方面,一方面,通过加入区域占领参数occupy,使对占领格子的判断更准确; 另一方面,在不同阶段采用不同估值参数,基于步数判断棋局进行到了哪个程度,再决定使 用哪种参数,再根据局面对估值参数进行动态调整; 此外,搜索算法中还采用优化的多线程:一方面使共享资源尽量少,以防止等待资源消 耗的时间;另一方面,使各线程间有互斥地共享有价值的资源,从而提升AlphaBeta算法的 效率;具体优化参数主要包括全局变量AlphaB ,MultiThread函数中变量i,将变量best引入 AlphaBeta函数,以及改进AlphaBeta算法中对返回和更新beta值的机制; 另外,在AlphaBeta的最底层采用更新排序,其它层采用估值排序。2. 如权利要求1所述的一种机器博弈的亚马逊棋AI算法,其特征还在于: 一种机器博弈的亚马逊棋AI算法,主要涉及如下函数:3.如权利要求1所述的一种机器博弈的亚马逊棋Al算法,其特征还在于: 一种机器博弈的亚马逊棋AI算法,具体步骤如下: 步骤一、声明全局变量并初始化下棋步数为O; 步骤二、搜索并选择可用的招法; 步骤三、调用createMove生成可行招法,将满足条件的招法连同估值一起存入招法栈 返回: 所述的满足条件是所产生的招法落子点或落障碍处,至少有一点满足五步以内有对方 棋子; 步骤四、调用处理多线程的函数MultiThreacU具体为: 步骤4.1声明变量i,为全局变量ST设置互斥锁,在互斥锁内将ST的值赋给i,并给ST加 1;然后释放ST的互斥锁; 步骤4.2遍历步骤三生成的所有顶层招法; 步骤4.2.1对遍历到的每个招法,在模拟棋盘上执行AlphaBeta搜索,返回该招法的估 值;再撤销在模拟棋盘上该招法的执行; 步骤4.2.2若步骤4.2.1返回招法的估值大于当前线程的最好估值,则修改当前线程最 好招法,并记录新的最好估值; 步骤4.2.3为全局变量AlphaB设置互斥锁,在互斥锁内判断如果当前线程最好估值大 于全局最好估值AlphaB,则修改全局最好招法及AlphaB,并更新全局最好招法BestMove,然 后释放AlphaB的互斥锁; 步骤五、调用AlphaBeta函数进行搜索; 步骤5.1判断搜索深度,进行相应操作: 5.11若搜索到达最底,即传入的参数depth= = 0,则调用估值函数Evaluate,并返回估 值; 5 · 12否则,调用createMove_selecteval或createMove_eval生成招法,同时,对每个生 成招法调用Evaluate进行估值,生成全部招法后根据估值,即Evaluate返回值对招法进行 排序,具体为: 5.12.1在20步以内有选择性的生成招法,即调用createMove_selecteval函数来生成 招法; 5.12.2否则生成全部招法,即调用createMove_eval函数来生成招法; 步骤5.2根据搜索深度对招法进行裁剪,具体为: 5.2.1当搜索深度depth为1时不裁剪招法; 5.2.2当搜索深度depth为2且招法数大于K6,则保留排序在前K6的招法; 5.2.3当搜索深度depth为3且招法数大于K7,则保留排序在前K7的招法; 5.2.4当搜索深度depth为4且招法数大于K8,则保留排序在前K8的招法; 其中,优选的Κ6为300,也可以是大于250小于350的整数; 其中,优选的Κ7为200,也可以是大于150小于250的整数; 其中,优选的Κ8为100,也可以是大于80小于120的整数; 步骤5.3判断当前招法数是否为0,并进行相应操作: 5.31若生成的招法数为0,说明棋局已经结束,返回-1即+(11^1(16口1:11-(16口1:11); 5.32若生成的招法数不为0,则继续步骤5.4; 步骤5.4对产生的招法估值,并返回该层的最好估值或第一个大于beta的估值; 步骤六、调用估值函数Evaluate; 步骤6.1调用Evaluate该函数计算qstep和kstep; 步骤6.2再计算四个基础变量4142、(31、(:2;这四个值在每次调用估值函数时都初始 化为0,具体包含如下操作: 步骤6.2.1通过a和b确定tl的值: a. 当某个格子双方qstep值相同时,对于当前行棋颜色给予tlx分奖励,非当前行棋给 予_t IX分的惩罚,再将此奖励或惩罚的分数加在11上; 其中,所述的tlx分数范围为0.0到1.0; b. 当我方qstep值较小时,使tl获得一个加分score,反之获得一个负分-score;的值为 能以qstep所代表的步数到达该格子的棋子的个数,即对于一个可以以最少步数到达的格 子,记录能以最少步数到达的棋子的数量; 其中,所述的score分数范围为大于1的整数,原则上不设上限; a、b同时运用以防止出现以一敌多的局面; 步骤6.2.2计算t2的值,具体为:遍历所有kstep,当我方kstep值较小则t2加1,当对方 kstep值较小则t2减1; 步骤6.2.3计算cl及c2的值,具体为: cl+=(pow(2.0,-qstep[thread][i][j][0])-pow(2.0,-qstep[thread][i][j][I])); c2+=min(I,max(-l,(kstep[thread][i][j][l].st~kstep[thread][i][j][0].st)/ 6.0)); 注:thread表示当前线程数,i、j对应棋盘上格子,最后一维为0代表我方,I代表对方; 步骤6.3声明计算变量occupy,并赋occupy初值为1,当某格子只有我方可到达则将 occupy加一,否则将occupy减1,即occupy记录了我方当前局面已经占领的空格子数量; 步骤6.4声明并计算变量81111^[2] ; 至此,经过步骤一到步骤六,完成了一种机器博弈的亚马逊棋AI算法。4.如权利要求3所述的一种机器博弈的亚马逊棋AI算法,其特征还在于: 一种机器博弈的亚马逊棋AI算法,步骤一中声明的全局变量主要如下: 1.1声明AlphaB用于记录多线程中综合的最好估值; 1.2声明maxdepth定义搜索深度; 1.3声明MOVEi记录各线程各自的最好招法的编号; 1.4声明BestMove记录全局的最好招法; 1.5声明qstep和kstep用于估值函数; 1.6声明ST; 1.7声明totalTime记录一盘棋开始到目前的总用时; 1 · 8声明movestack用于存储招法,movestack又称招法栈; 其中,qstep的含义为四个棋子中沿单一方向连续行进到达的某一格子所需的最少步 数; kstep的含义为四个棋子中方向任意地单步行进到达的某一格子所需的最少步数;ST 的含义为记录最顶层搜索到了第几个招法。5. 如权利要求3所述的一种机器博弈的亚马逊棋AI算法,其特征还在于: 步骤二又具体包括如下步骤: 步骤 2.1 调用入口函数 search_a_goodmove; 步骤2.2在函数search_a_goodmove中初始化部分全局变量:其中所述的部分全局变量 主要包括全局变量AlphaB; 所述的AlphaB初始值为-INF; 步骤2.3根据下棋步数得出搜索深度值M; 步骤2.4调用createMove_eval生成招法; 步骤2.5对生成的每一个招法调用Evaluate函数,并对所有招法调用Evaluate函数的 返回值进行排序; 步骤2.6根据步数和对步骤2.5调用createMove_eval生成的招法进行裁剪; 步骤2.7当总用时totalTime超过14分钟,则将搜索深度值M设为4; 步骤2.8调用MultiThread函数启动多线程; 步骤2.9等待直至步骤2.7的所有线程运行结束,删除多线程并返回。6. 如权利要求5所述的一种机器博弈的亚马逊棋AI算法,其特征还在于: 步骤2.3具体为: 步骤2.3.1当步数step小于Kl,则搜索深度值M为4; 步骤2.3.2当步数step大于等于Kl小于K2,则搜索深度值M为5; 步骤2.3.3当步数step大于等于K2,则搜索深度值M为6; 其中,优选的Kl为32,也可以是大于20小于38的整数; 其中,优选的K2为48,也可以是大于30小于60的整数。7. 如权利要求3所述的一种机器博弈的亚马逊棋AI算法,其特征还在于: 具体的,步骤三的执行过程包括: 步骤3.1对本方四个棋子中的每一个棋子做如下3.11和3.12两个操作,得出一个可行 招法; 3.11从棋子出发遍历上下左右四个方向,再遍历每个方向上最多10个可行步,找到符 合落子的格子,再遍历所有符合落子的格子,对每一格子执行3.12; 3.12从每一可落子的格子出发,遍历上下左右四个方向,再遍历每个方向上最多10个 可行步,找到可以设置障碍的格子; 步骤3.2根据步骤3.1得出的可行招法分别做如下四类操作: 步骤3.2.1调用createMove得到可行招法后直接存入招法栈,继续搜索其他招法; 步骤3.2.2调用(^册〖洲〇代_^&1执行招法,调用估值函数,得到执行招法后的估值(可 认为即为该招法的估值),将估值和招法都存入招法栈; 步骤3.2.3调用createMove_select在产生招法后先对招法进行检查,是否满足如下条 件: 所产生的招法落子点或落障碍处,至少有一点满足五步以内有对方棋子; 再将满足条件的招法加入招法栈; 步骤3.2.4(^6&七6]\1〇¥6_8616(^6¥&1结合3.2.2和3.2.3,将满足条件的招法连同估值一 起存入招法栈; 步骤3.3遍历结束后,返回。8. 如权利要求3所述的一种机器博弈的亚马逊棋AI算法,其特征还在于: 步骤5.4具体为: 步骤5.4.1声明变量best,并初始化为-1,将当前最好估值赋值给best; 步骤5.4.2遍历执行步骤5.1和5.2产生的所有招法并进入下一层AlphaBeta,递归直至 返回估值; 步骤5.4.3得到步骤5.4.1的估值后,若估值大于best,则将得到的估值赋给best; 步骤5.4.4若估值大于beta,则返回估值; 步骤5.4.5遍历结束后,若有更好的招法,则记录并更新; 步骤5.4.6返回best。9. 如权利要求5所述的一种机器博弈的亚马逊棋Al算法,其特征还在于: 步骤2.6具体为: 2.6.1当步数step小于K3且招法数大于K4,则保留排序在前K4的招法; 2.6.2当步数step大于等于K3且招法数大于K5,则保留排序在前K5的招法; 其中,优选的K3为32,也可以是大于6小于36的整数; 其中,优选的K4为300,也可以是大于200小于400的整数; 其中,优选的K5为400,也可以是大于300小于500的整数。10. 如权利要求3所述的一种机器博弈的亚马逊棋AI算法,其特征还在于: 步骤6.4声明并计算变量81111^[2]; 其中,所述的sumA[2]代表双方棋子的灵活度,计算方法如下: 步骤6.4.1对于每一个棋子计算其灵活度:寻找该棋子一步即可到达的所有空格子,对 于每一个空格子记录棋子与空格子的距离记为i,再计算该空格子周围8个格子中为空的格 子数量记为N;计算A = N*pow(2.0,-i);对于所有棋子一步可到达的空格子都能得到这样一 个A,棋子的灵活度AM即为所有这样的A的和; 步骤6.4.2sumA为四个棋子各自AM的和;对于双方都计算灵活度,可以得到双方各自的 sumAo
【文档编号】A63F3/00GK105999689SQ201610369682
【公开日】2016年10月12日
【申请日】2016年5月30日
【发明人】史继筠, 宋鑫, 赵峻瑶, 孙云霄
【申请人】北京理工大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1