许南山
丛
磊
孙风平
(北京化工大学信息科学与技术学院,北京100029)
摘
要
介绍了传统人机博弈PVS(PrincipalVariationSearch,主要变例搜索)算法,并在历史启发的基础上,设计了利用
多处理器及超线程技术计算速度更快的并行PVS算法,并在算法中加入了自学习能力,使五子棋AI模拟人的思维。关键词
AIPVS并行自学习
文献标识码A
中图分类号TP301
文章编号1002-8331(2006)30-0045-03
ParallelImplementationofGobangAIwithSelf-LearningAbility
XUNan-shanCONGLeiSUNFeng-ping
(SchoolofInformationScienceandTechnology,BeijingUniversityofChemicalTechnology,Beijing100029)
Abstract:IntroducetheclassicchessalgorithmPVS(PrincipalVariationSearch).AndbasedonHistoryHeurismalgorithm,designtheParallelPVSalgorithmwhichperformsbetterbyusingmultiprocessororhyper-thread.Addself-learningabilitysothatGobangAIsimulateshumanthinking.Keywords:AI,PVS,parallel,self-learning
1引言
人机博弈的AI理论,由于其涉及的知识范围广、难度大,
历来成为各高校人工智能研究的热门。目前绝大部分对弈算法都是基于冯・诺依曼(JohnVonNeumann)于1928年提出的极大极小博弈树理论。1963年Brudno成功将这一理论发展,根据避免搜索极大极小博弈树中的不必要的节点,形成了
Alpha-Beta剪枝搜索。而PVS算法正是在Alpha-Beta算法的
基础上,根据一种最优解假设思想产生的算法。麻省理工学院的国际象棋机器人StarSocrates就是采用的PVS算法。
由于盘面预测的计算量非常大(比如对于五子棋的中盘走法,预测四步的局面数可以达到一百万),所以作为专业的五子棋AI必须采用多线程为基础的并行运算。此外为了避免人用固定棋谱获得胜利,AI还必须具有自学习能力。
基于以上考虑,本文提出一种以传统局面存储表、走法历史启发、评估函数为基础,考虑胜利层数的有自学习能力的并行的PVS算法。
以得出,C最终值也必然小于或等于16。又因为B已经得出为
图
1
棋盘节点搜索示例图
18,说明A的最终值一定是B的值,而不会是C的值。也就是
说在搜索得出C节点的子节点D的值后,则表明E、F不必再搜索,因为最后C的值对于A已无意义。基于这种思想的搜索
剪枝就叫Alpha-Beta剪枝。实际上Alpha-Beta剪枝的根源是由于极大极小博弈树存在着这样的两个规律:
如果目前节点A是该AI走,也就是求子节点中的最大值,那么:
(1)A的子节点的值一定要比A的父节点的前兄弟节点中(深度优先搜索里同一父节点下,搜索排在前面的节点是后面节点的前兄弟)的最大值还大,否则舍弃此节点。
(2)A的子节点的值(或称为已搜索完的A的子节点的最大值)一定要比A的前兄弟节点中的最小值还小,否则舍弃该子节点和该子节点的所有后兄弟节点,也就是发生Beta剪枝。
如果A节点是该用户走,也就是求子节点中的最小值,那么:
(3)A的子节点的值一定要比A的父节点的前兄弟节点中的最小值还小,否则舍弃此节点。
(4)A的子节点的值(或称为已搜索完的A的子节点的最小值)一定要比A的前兄弟节点中的最大值还大,否则舍弃该子节点和该子节点的所有后兄弟节点,也就是发生Alpha剪枝。
,A计算机工程与应用2006.30
2算法设计
在对弈中,根据下一步由谁来走,计算机对任何一个局面
都应该给出一个评估值,我们把这个操作称为评估函数。然后根据评估函数返回的值,来选择下一步的走法。在这里假设评估值越大表明对AI越有利,评估值越小则表明对AI越不利。那么每次AI选择都是从它可能的走法子节的最终返回评估值中选择最大点,而用户总是从候选走法节点的最终评估值中选择最小点,从而形成一棵极大极小搜索树,然后根据深度优先搜索,可以最后得到固定搜索深度下的一个最好的走法。
不过在这种搜索结构下,存在着些不必要搜索的子节点。比如:图1中方形框节点是该AI走,圆形框节点是该人走,A节点是该AI走,它需要从B和C当中选取最大的值。目前已经得出B为18,当搜索C节点时,因为C是该人走,所以C需D、F,45
速度起着至关重要的影响。根据五子棋的特点,可以产生一个棋面限制框,记录当前棋面所有棋子的最左、最右、最上、最下点构成的矩形,而且基本可以认为下一步棋的位置不会脱离这个框3步以上。这样在棋子较少的开局阶段就大大减少了候选节点的数量。此外根据候选节点离中心点(天元)的距离和此次搜索的前面搜索布局中该节点的得分(对于所有层次结果中的最优节点被认定其为好节点,给予一定的得分),进行排序(历史启发排序),能够大大提升搜索速度。
RECTLimit){
/*PVS搜索函数,参数同CreatePVSThread*/
if有一方五子连珠,则返回相应的极值(比如AI胜返回9999,
用户胜则返回-9999);
if当前布局已在前面搜索的更深层次(在局面储存表中)中出
现过,则返回储存表中对本布局的评估值;
if该局面已经到了搜索树的叶子节点,则返回相应的评估值;产生当前所有可能的下一步走法PossibleSteps,并把其按历史
得分排序;
PVS算法是一种体现最优步假设的算法,它的思想是与其
判断哪个节点最好,不如先假设一个节点最好,然后再证明后面的节点确实比它差或者强。这种思想的来源是在历史启发的基础上,经过历史启发排序后的第一个节点有些情况下就是最优节点。
棋盘大小:15*15,黑(7,8)表示黑子位于棋盘第7行第8列。
表1
搜索深度
走法(AI执白后手)黑(7,7);白(8,8)黑(8,7);白(9,7)黑(7,9);白(7,8)
if(该AI走){
走出Possibles[0]这一步,并产生新的棋盘限制框newlimit;
intbest=PVSSearch(depth-1,Alpha,Beta,PossibleSteps[0],newlimit);for1toPossibleSteps.size-1PossibleStepsdo{
if(best>=Beta)发生Beta剪枝,记录PossibleSteps[0]的历史得
分,返回best;
搜索节点数量统计
首节点为最优点(个)
总共搜索节点(个)
else{
Alpha=Max(best,Alpha);//更新Alpha
走出PossibleSteps[i]这一步,并产生新的棋盘限制框newlimit;
333
439301391
321026397212
intscore=PVSSearch(depth-1,alpha,alpha+1,PossibleSteps[i],newlimit);
/*利用宽度为1进行最小窗口试探搜索,因为Alpha和Beta差距越小,剪枝率越高,这么做的目的是证明PossibleSteps[i]比已得的最好结果差(比最好结果小)。*/
表1的实验数据证明,结合历史启发的PVS搜索更具效率。那么如何让PVS并行运算呢?因为进行Alpha-Beta剪枝,所以各兄弟节点的值是有影响的,在这种情况下可行的办法是在第一层用一个线程分配器把第二层的候选节点分配给多个线程,每个线程包含着从第二层一个候选节点开始的PVS搜索,然后等所有线程结束后,进行结果汇总,选出最大值。需要历史启发注意的是,由于多个线程同时对布局储存HASH表、表等多个资源进行共同操作,所以只要是涉及这些方面的执行代码都需要进行同步处理。图2是其处理过程。
if(score>alpha&&score<beta)//假设失败
{best=PVS(Depth-1,score,Beta,Possibleteps[i],newlimit);//重
新搜索
if(Depth==MaxDepth)//如果到根节点(总搜索树第二层节点)BestResult[线程序号]=PossibleSteps[i];//记录最优值}elseif(score>best)
{best=score;//更新best值if(Depth==MaxDepth)
BestResult[线程序号]=PossibleSteps[i];}撤消PossibleStep[i]的走法。
}//endelse}//endfor
对BestResult[线程序号]加分(历史得分,因为其是一个好走
法);
把BestResult[线程序号]记录到局面储存HASH表中,因为该局
图2
面已经被搜索过。
PVS算法线程分配图
returnbest;}//end该AI走
else{//该人走略,与该AI走步骤类似,区别是AI节点取子节点
的最大值,而该人走的节点是取子节点的最小值。}
线程分配器的伪代码如下:
CreatePVSThread(intDepth,intAlpha,intBeta,POINTJustStep,RECTLimit){
/*线程分配器函数,Depth是搜索深度,Alpha、Beta是初始剪枝值,JustStep是上一步位置,Limit是棋盘限制框*/
产生当前所有可能的下一步走法PossibleSteps,并计算相应的
新限制框newlimit;
}
在最后主线程得到所有PVS线程结束的消息后,选出所有的
BestResult[线程序号]中最大值所对应的走法,也就是对这个布
局所产生的Depth搜索深度下的最好走法。
foreachPossibleStepsdo
{产生一个线程,其中包含对PossibleSteps[i]的PVS搜索
PVSSearch函数。当该线程终止时,将当前线程数-1,并判断如果当前线程数为0,则通知所有PVS子线程成功结束,取出所有线程返回值,选取最大值的走法。}
3算法测试数据
以下是当人先走出第一步天元位置后,AI计算第一步的
时间(单位:s)。
}
线程容器内的PVS搜索伪代码如下:
,,
4算法增强
4.1胜利和失败局面的层数因素
462006.30计算机工程与应用
第2 / 3页
表2
搜索深度
测试结果
并行PVS+历史启发
s
0.030.211.96128.86
的P(L/A)均为1,而赢者在Depth步走法内的P(W/A)均为1。而倒数Depth次以外的步数有没有可能导致必输呢(比如最后阶段通过多个冲四,可以在AI预测步数之外产生必胜局面)?答案是可能的。可以把倒数第Depth局面定为目标局面,从倒数第Depth+1步开始进行层数加深的迭代预测,直到该步局面不会一定导出这个目标局面为止,而在这步以后的局面都是必输局面。规定Pre(A)=A的前次走法,PrePre(A)=A局面的前次走法的前次走法(等于悔棋一步)。进行复盘的伪代码如下:
if(倒数第Depth步该输者走)CM=倒数第Depth步的局面;else
CM=倒数第Depth-1步的局面;for(;;){
对PrePre(CM)这个局面进行深度为2的PVS搜索;
PVS0.060.459.365294.581
PVS+历史启发
0.040.2312.02531.553
2345
(注:硬件环境为P4(HP)2.8GHz,内存768M)
处理,AI胜返回最大,AI输返回最小,但事实上即使对于必胜和必输局面,层数也应该影响返回值。因为下棋时如果能2步获胜,下棋者不会选择4步获胜的走法。对于必输局面层数就更重要,AI必须选择层数多的必输走法,因为有可能用户并没有看出必杀的走法,而浪费了机会,这样就会使AI化险为夷。所以在返回极值时,要把层数考虑进去,像:
ReturnValue=9999-weight*Depth;(AI胜)ReturnValue=-9999+weight*Depth;(AI输)
Depth越大,表示越靠近根节点。这样当AI胜利时,对于越靠
近根节点的局面,就返回越大值,反之亦然(weight可以由具体评估函数确定)。
if(得到的预测最佳走法不等于CM)break;else{
P(L/PrePre(CM))=1;P(W/Pre(CM))=1;CM=PrePre(CM);}}
4.2等好局面的随机走法
由于AI总是选择评估值最好的走法走,这样导致在相同
的布局,AI总走出相同的下一步。而事实上,除了必杀招或者必防招,一个局面很多时候没有绝对最好的走法,而是有一些都近似不错的走法,那么可以把这些评估值差距在一定范围内的走法汇集起来,然后随机选择它们中的一种走法,避免AI的走法的固定模式。
对于上面的伪代码,可以将BestResult[线程序号]改为一个走法队列,里面存放最好的N(一般N小于5)个走法,然后在所有线程结束时,从所有的BestResult走法中得到最好的走法,然后把评估值与最好走法的评估值之差在一定范围Range内的走法都选进来,从中随机选一个走法。Range值的确定要参考具体的评估函数。
这样在每次下完后电脑复盘,更新最后若干走法的导致胜利或失败的概率。等下次对弈时,AI自动把这些数据加到评估函数中去,对于高概率影响AI获胜的走法返回极大值,高概率导致AI输的返回极小值。AI如果发现当前布局的这种走法在以前输过棋,那么它不会选择这个走法,从而达到自学习的效果。
5结束语
随着IntelHP(超线程技术)的实现和将来多处理器PC机
的普及,对于数据计算量大的人机对弈问题必然要求应用并行的思想去处理。超快搜索速度和必要的复盘必然带给下“反思”棋AI更多智慧。(收稿日期:2005年12月)
4.3自学习能力
上面的并行PVS搜索算法还没有自学习的能力,这样AI
在下棋时会重复以前出现过的所以需要在每盘棋结束“昏招”。时,对输方(尤其当AI输时)进行一定步数的复盘。而这个步数一定要大于搜索的Depth(因为输方在Depth深度预测中并没有预见到它的不利)。因此如果用P(L/A)表示在A走法下导致输棋的概率,而P(W/A)表示A走法下导致获胜的概率,那么最后输者在Depth步走法(叫为输者的最后一个必输局面)内
参考文献
1.陆汝钤.人工智能[M].北京:科学出版社,1995
2.NilsJNilsson.郑扣根,庄越挺译.ArtificialIntelligenceANewSyn-thesis[M].北京:机械工业出版社,2000
3.FDLaramée.ChessProgramming[M].WroxPressLtd,19994.DNLLevy.ComputerChessCompendium[M].Springer-Verlag,1988
(上接22页)
制造系统—CIMS,2003;9(5):384 ̄389
4.EmmelhainzM,EmmelhainzL,StockJ.Consumerresponsetoretailstock-outs[J].JournalofRetailing,1991;67(2):138 ̄147
5.WangCX,BenarochM.SupplychaincoordinationinbuyercentricB2Belectronicmarkets[J].InternationalJournalProductionEconomics,2004;92(2):113 ̄124
6.SunD.Inventorymanagementine-business.Workingpaper,Pennsyl-vaniaStateUniversity,USA,2001
2.AberdeenGroup.Makinge-sourcingstrategic:fromtacticaltechnologytocorebusinessstrategy[R].TechnicalReport,AberdeenGroupInc,2002
3.CampoK,GijsbrechtsE,NisolP.Towardsunderstandingconsumerre-sponsetostock-outs[J].JournalofRetailing,2000;76(2):219 ̄242
计算机工程与应用2006.3047