基于Java实现的AI导论-Othello

资源下载地址:https://download.csdn.net/download/sheziqiong/85656467
资源下载地址:https://download.csdn.net/download/sheziqiong/85656467

一、引言

如黑白棋,又称反棋(Reversi)、奥赛罗棋(Othello)等,游戏使用围棋的棋盘棋子,在8*8的棋盘上,黑白双方分别落棋,翻动对方的棋子,直到棋盘占满或无合法棋子可下,游戏结束,根据双方棋子数量判断胜负。

二、实验

2.1 读源代码中的Minimax算法

算法分为两个函数执行,一个是初次决策的decide函数,其中又调用了递归函数miniMaxRecursor来执行后续层minimax值的计算。不同于分别计算min,max值,在这两个函数中使用了flag为+1和-1乘上节点分数来表示max和min的效果,这样就可以都用max的方法来计算,维护起来比较简便。

搜索原理是这样的。本质上是深度优先,展开一条树枝直到底层(游戏结束,或达到设定的max_Depth),然后返回其启发式函数值作为这一点的评分,对于每一个非底层节点,根据其是max层还是min层来分别求它的孩子节点中最大/小的值作为它的值,一直回溯到根节点,选择每一个可行操作中评分最高的一项作为返回,若存在多项评分相同的情况则随机返回其中之一。

对于叶子节点的好坏,这里使用了Huristic函数进行判断,函数的详细内容将在第三部分阐述。

2.2 加入Alpha-Beta剪枝后的性能评估

Alpha-Beta剪枝的原理原本是这样的,对每一个max节点,记录其最大孩子节点的value作为他的alpha值(即可行下界),对每一个min节点,记录它最大孩子节点的value作为beta值(可行上界)。我们首先设alpha为负无穷而beta为正无穷,由于minimax本身是深度优先的,所以在按深度展开的过程中,不断由下向上更新逐级父辈节点的alpha或beta值。在一个节点的第一个孩子搜索完毕时,这个节点就拥有了非无穷的alpha-beta值,这时再展开他的另一个孩子时,如果孩子的beta小于父辈的alpha或者孩子的alpha大于父辈的beta,则父亲节点必不可能选择走这个孩子的路径(选择另一个孩子对父亲更有利),所以这个孩子节点的子树就可以被砍掉了,到这就实现了一次alpha-beta剪枝。在由下向上探索的过程中,可以不断地由这种方法砍掉一些子树。

然后讲一下Alpha-Beta剪枝在这里的代码实现。我们修改miniMaxRecursor方法,给他加入两个值alpha,beta,用来表征它的“父亲”alpha和beta值。

在这里插入图片描述

在for循环中,我们把局部变量alpha和beta传入下一层的搜索,这就体现了为什么alpha和beta是表示“父亲”的alpha-beta值。每当计算出一个下层节点的value值,就按照上述算法分析,比较并更新局部变量alpha、beta,于是在调用for循环中下一个下层搜索之前,alpha-beta的值始终是最新的。而判断这个函数是否应该立刻终止,不必继续搜索下去,也就是这一支被剪掉了的条件也十分简单,就是alpha>=beta,因为不论这个节点是Min还是Max,这都是唯一的判断无价值条件。而由于min和max总是交替出现出现的,所以事实上在每一次调用过程中,函数的alpha或者beta值是不更新的,更新的是另一个,然后一旦更新到满足alpha>=beta,也就相当于表现了上述算法的效果,于是剪枝。

在这里插入图片描述

时间评估:为了能充分体现算法时间复杂度,直接将时限设为1000000,使用自我对抗。原始算法在maxdepth=6的时候开始,单步时间已经长的令人无法接受,于是决定只测试到7层。而加入剪枝后的算法在第7层表现依旧良好,于是又测试了8层。可以发现加入alpha-beta剪枝后,即使在8层深度的情况下,算法也比原始算法的第7层要块,可见剪枝效果是十分显著的。完整的时间表格如下 表1.0 所示。

扫描二维码关注公众号,回复: 14281453 查看本文章

​ 表1.0

最大层;步平均耗时ms 2 3 4 5 6 7 8
原始版本平均 0.4375 2.5666666 6.67741935 60.19354 510.67 10947.1 Null
原始版本最大 2 11 40 311 2676 73881 Null
改进版平均 0.515151515 1.54838709 7.615384615 10.34375 58.258 212.7272 2637.39
改进版最大 2 7 39 35 178 978 11842

2.3 启发式函数的理解与改进

原始启发式函数的设计包含这几个部分。其一,如果游戏胜利或失败,winconstant项给予一个很大的正/负值,如果还没结束这一项为0。其二,piecedifferential项,表示了电脑比你多的棋子数量。其三,moveDifferential项,表示了电脑比你多的可走位置数。其四,cornerDifferential项,表示电脑比你多占有的四角数量。

其五较为复杂,stabilityDifferential项,注释的内容写得是获得稳定矩阵的值,经过阅读源代码发现,他是统计双方已经不会再改变的棋子的数量数之差。其基本原理是分别遍历每一个行、列、斜,观察非空的第一个“条”(遇到空直接往后看),记录他的头颜色,然后用seen值的不断增加来统计同色“条”的长度,最后如果遇到空或者一条走到头则根据最后一个和前面的颜色的组合来增加或减少seen的值,如果前面全是自己的颜色,而结尾是别人的颜色,则减seen,否则加seen。如果走到某处时颜色改变,则把spot置为新颜色,并重新开始上述上述过程。经过这样一个过程,事实上获得的就是所谓“只要走一步就可以吃掉的对方棋子”数量只差。

以上五项启发式函数的部分,分别乘上一个自己定义的常数作为系数,然后加在一起,就是最终的huristic函数的值。用这个值作为这个“叶子”节点的value,并带入搜索过程来决定选择哪个节点。

有关启发式函数的改进,我们需要对黑白棋游戏进行一些分析,通过百度经验“怎样玩好黑白棋” [1],我们了解到了以下三点(如图A,B,C)。

在这里插入图片描述
在这里插入图片描述

​ 图2.3.1 图2.3.2

如图2.3.1所示,开始时4个子都处于方框1内,我们知道占领“变、角”上的节点是对自己有利的(一般来说)。而占领2框内的点后,一旦对方在2的外围方框内下一个子,我们就可以很容易地通过2中子与边框上的子形成围攻,来占领“边角”。因此占领2中的格子是有利的。

如图2.3.2所示,这4个点一旦占领,对方将非常容易地占领四个角,所以这4个点是应当避免的。

实现的代码过程如下图。getSpotOnLine(line, index);可以获得某条线上某个点的值,0表示空格,1表示超出边界,2表示黑棋,3表示白棋。Hboard表示水平行列表,vboard表示垂直列表,这里用不到斜线列表。按照上述逻辑实现的代码,block2计算本方二环内棋子数量比对面多的值,block4计算最外圈本方棋子数量比对方多的值,semicorner用来计算图2.3.2所示4个角本方比对方多的位置。他们分别设定系数50,100,-200,作为启发式函数的第6、7、8项,如此便完成了对启发式函数的改进。

在这里插入图片描述
在这里插入图片描述

​ 图2.3.3 图2.3.4

在这里插入图片描述
在这里插入图片描述

​ 图2.3.5 图2.3.6

2.4 MTDdecider的理解

我们按照一个十分自然的阅读程序过程来理解MTDdecider,最后再总结一下。

在创建MTDDecider的过程中,通过usemtd变量来决定后续是否使用MTDF算法,下文只分析使用了MTDF算法的过程,因为另一种就是普通的alpha-beta算法。其他参数和minimaxdecider类似,指定了是否用maximizer开始,深度限制,搜索时间。

在这里插入图片描述

Decide函数创建了一个转移表(以哈希表来实现),以备以后存储搜索过的状态,节约时间,然后就调用了真正的决策函数。

在这里插入图片描述

Iterative_deepening函数是真正的决策函数。他的第一部分是迭代加深,在每一个深度不断用MTDF算法获取当前可执行的每一个动作的value值,这里传入MTDF的firstguess值就是a当前的value,可以认为每次获取a的value实际上传入的是a的前一个value值。第二部分统计一下此次搜索的时间、效率等等,最后从最优方案中随机返回一个结果。我们忽略报错和不用MTDF的过程。
在这里插入图片描述

该决策器的的重中之重是MTDF算法,他有一个初始的从负无穷到正无穷的上下界,然后在每一次每一次调用的过程中不断缩小上下界,直到收敛,这个值就是当前节点的alpha-beta剪枝搜索出来的value。这里调用alpha-beta的时候每次都设置alpha=beta-1,所以按照saveAndReturnState的逻辑,他会返回当前的下界或上界,因为alpha-beta之间初始时只有1的间隙,所以剪枝会剪得相当多,因此速度很快。转移表的使用,似的已经计算过value值的节点直接获得值,而不必重复计算,同样大大增加了效率。

总结一下,MTDF用极端限制来使得Alpha-beta算法变得更快,但是同时也要在尝试找到收敛时调用调用它许多次。整体使用了转移表来减少重复搜索,大大提升了效率。

资源下载地址:https://download.csdn.net/download/sheziqiong/85656467
资源下载地址:https://download.csdn.net/download/sheziqiong/85656467

猜你喜欢

转载自blog.csdn.net/newlw/article/details/125312851