基于Java的六子棋人工智能系统的设计研究.docx
《基于Java的六子棋人工智能系统的设计研究.docx》由会员分享,可在线阅读,更多相关《基于Java的六子棋人工智能系统的设计研究.docx(11页珍藏版)》请在冰豆网上搜索。
![基于Java的六子棋人工智能系统的设计研究.docx](https://file1.bdocx.com/fileroot1/2023-1/27/f7475c0e-4f2b-4f2b-97c4-9432f507d6e6/f7475c0e-4f2b-4f2b-97c4-9432f507d6e61.gif)
基于Java的六子棋人工智能系统的设计研究
基于Java的六子棋人工智能系统的设计研究
邱烨,杨旭,王伟
中国矿业大学计算机科学与技术学院,徐州(221008)
摘要:
六子棋作为一个刚刚兴起不久的棋类游戏,其计算机博弈算法的研究还相对较少。
六子棋是复杂度很高的棋类游戏,研究它是很有挑战的一件事。
本系统就是对六子棋计算机博弈技术的一次尝试。
本系统主要完成了人人对战和人机对战。
系统主要通过对当前局面的所有棋型进行静态估值,然后再采用了优化的Alpha-Bate搜索技术来实现AI。
最后,本文探讨了一些提高电脑智能的方法。
相信随着科技的发展,人工智能对人们的帮助将会越来越明显,越来越大。
关键词:
计算机博弈;六子棋;Java;Alpha-Bate搜索技术;人工智能
中图分类号:
TP311
1.引言
人工智能(ArtificialIntelligence),其英文缩写为AI。
它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学[1]。
人工智能作为计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。
人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。
但不同的时代、不同的人对这种“复杂工作”的理解是不同的。
而计算机博弈则被认为是人工智能领域最具挑战性的研究方向之一,它涉及人工智能中的推理技术、搜索方法和决策规划等,它的研究为人工智能带来了很多重要的方法和理论,产生了广泛的社会影响和学术影响以及大量的研究成果。
而代表计算机博弈技术的各种棋类游戏在其各自的计算机博弈技术研究中已经取得了相当丰硕的成果,且其计算机博弈系统也日趋完善,基本上能达到大师级水平,比如“深蓝”。
六子棋作为最近几年才兴起的棋类游戏,对其计算机博弈技术和算法的研究相对较少。
六子棋的发明者台湾吴毅成教授给出了六子棋的公平性问题以及基于迫着(Threats)的胜利策略,但是对于其计算机博弈问题没有给出更加深刻的阐述,同时也没有全面解决六子棋计算机博弈问题。
最近几年,国际上也有与智能六子棋的设计与实现相关的大赛举办,由此可见对该问题的研究是相当热门和紧迫的。
因此,基于Java的智能六子棋系统的实现将是对六子棋博弈问题的一次探索。
2.系统总体设计
2.1系统设计目标
本系统开发的总体任务是实现具有一定棋力的六子棋程序,其能够与一般的六子棋爱好者对弈。
当然,也要能实现人人对弈。
图1结构模型
图2系统流程图
2.2开发设计思想
(1)该系统的实现主要是对六子棋的数据结构,棋子触发,搜索算法[2],评估函数等进行设计和实现的过程。
(2)界面操作应当简单化,做到实用、方便,以满足不同层次使用者的需要。
(3)系统总体实现以下规范:
删除不必要的冗余,实现程序代码标准化,软件统一化,确保软件的可扩展性,可维护性和实用性。
3.主要技术实现
3.1界面设计及事件响应
本系统界面包括棋盘部分,用户面板部分,游戏信息及选项部分,当前状态部分和系统选项部分。
其中为了实现的方便,棋盘背景和棋盘触发面板是分开设计的,即在主框架中添加了背景,并放置了用户面板部分(游戏信息及游戏选项部分),当前状态部分和系统选项部分,然后另外单独设计了棋盘触发面板覆盖于棋盘背景之上。
也许你会问怎么没有棋子信息的部分呢?
其实,棋子信息部分就隐藏在了棋盘触发面板里了。
同时,为了方便触发,当前状态部分,系统选项部分和游戏选项部分是直接嵌入到了主框架中的[3]。
下面是具体的各个类:
ChessFrame//主框架类,直接实现了棋盘背景,当前状态,系统选项和游戏选项
ChessJPanel//棋盘触发面板类
GameJPanel//游戏信息类,用于显示游戏信息
PlayerJPanel//用户面板类,用于用户信息显示及选择
ChessShow//棋子信息类,用于棋子的显示,其嵌入到了类ChessJPanel中
当前状态部分
系统选项部分
游戏信息及游
戏选项部分
图3界面
对于事件的处理,本系统主要处理单击事件和鼠标点击事件,并设立线程监视按钮的可用情况(如在开始游戏之前是不能悔棋的,在游戏开始后但没有悔棋
前是不能重下的等等)以及是否该电脑走棋,游戏一方是否胜利等。
对于游戏是否胜利,为了防止局面评估的不完善造成结果的失常,系统中还单独设立了检查函数checkBlackWin()和checkWhiteWin()。
下面是checkBlackWin()的算法:
(1)得到当前下的棋子的坐标P(x,y),因为下一子即连成六子,故设为下一子检测一次;
(2)假设有八个方向,N、S、W、E、WN、WS、EN、ES分别代表各个方向上当前方的棋子数(均包括点P),开始搜索各个方向,同类子则加一,不同类子或者无子均结束搜索;
(3)判断(N+S)>=7,(W+E)>=7,(WN+ES)>=7,(WS+EN)>=7之一是否成立,成立则修改标志isBlackWin为true,然后其会被相应的处理函数(其他线程)做进一步处理。
checkWhiteWin()算法类似。
3.2评估函数的设计
3.2.1理论分析
评估函数是对棋局的综合评估,简单来说,就是对当前局面的黑白棋分别评分,以确定当前的形势,为搜索引擎提供评判标准。
该函数的好坏直接决定解题能力强与弱,只有有了良好的评估函数才能对结果予以保证,否则搜索得到的结果很可能与期望相距甚远。
一个优秀的棋手通常都能对当前棋局做出合理的判断,以便取舍和协调棋子的关系,同时合理地组织己方棋子的进攻,以控制棋局向着利于自己的方向发展。
由此可见,想依靠几个简单的评估函数是不可能良好地抽象这整套评价模式的,因为要考虑和变化的因素实在是太多。
3.2.2评估函数的实现
考虑到六子棋是靠连接的同色棋子的数目取胜的,因此单独考虑每个棋子的值,然后求和是不合适的。
于是,我们可以对棋型进行估值,也即是对前面定义的那些棋型各赋一个值(这里就用各自的英文符号代替这个值),然后统计当前局面中黑白双方各自所包含的各棋型的数量(用count+黑白代号(B或W)+各自英文符号表示),再计算出当前局面下黑白双方各自的值(用Bvalue表示黑方的估值,Wvalue表示白方的估值),接下来再用当前方的估值减去对方的估值就可以得到当前方当前的估值VALUE了,即
VALUE=|Bvalue-Wvalue|
=|Cl×(countBCl-countWCl)+C6×(countBC6-countWC6)+…+
D2×(countBD2-countWD2)+S1×(countBS1-countWS1)|
为了实现这个估分的过程,在系统中实现了类ChessValue,其包括以下内容:
privateboolean[][]pieces;//当前局面棋子分布
privateboolean[][]blacks;//当前黑子分布
privateboolean[][]whites;//当前白子分布
privateint[][]types;//该位置的棋子所处的棋型类型
privatebooleanblackwin,whitewin;//黑白棋子是否已经胜利
privatefinalString[]chesstype={"S1","D5","D4",//各类棋型
"D3","D2","S2","S3","A2","I3","A3","S4","S5","A4","A5","C6","Cl"};privateint[]black,white;//各方该类型的棋型在当前局面中的数量
privatefinalint[]typescore={0,1,1,1,1,5,8,//各棋型所对应的值
10,16,20,48,50,80,200,1000,1000};
privateintwhitescore,blackscore;//当前黑白棋子各自的估值
游戏开始后,一方下完子便会让系统更新当前局面所包含的黑白双方各类棋型的数量,然后根据各棋型对应的值算出当前局面黑白双方各自的估值,以便对当前局面进行评估。
当然,这样得到的估值是静态的,很多动态的因数就被屏蔽了,与实际还是有很多差距的。
但考虑到实现的方便以及在大多数情况下的可行性,暂且采用这种方法。
3.3走法生成
走法生成是指将一个局面的所有可能的走法罗列出来的那一部分程序,也就是用来告诉其它部分下一步可以往哪里走的模块。
各种棋类的规则不同,走法生成的复杂程度也有很大的区别。
一般说来,在一种棋类游戏中,双方棋子的种类越多,各种棋子走法的规则也越多,则在程序中,走法生成的实现就越复杂。
考虑到在六子棋的对弈程序中,黑白双方交换下子,没有吃子、提子等规则的存在,只要有一方首先在棋盘的水平、垂直、斜线方向上形成连续的六颗棋子,就获得胜利。
因此,对于六子棋的走法生成来说,棋盘上的任意的空白位置都是合法的位置。
但是,在实际中,有些位置显然是不应该首先考虑的,比如对局时一般不会把棋子直接下在边界上。
另外有一点需要注意,那就是我们当前要下的棋子的位置与上一次对方下的棋子的位置是有很大关联的,也就是说我们当前下子可能是用来限制对方的子,让其不能连成六颗,或者是避开对方的子,让自己的子连成六颗,这样一来,我们考虑的较优的走法生成的位置范围就应该在上一次对方下子的周围。
在本程序中,定义了一个函数searchArea()用来得到当前局面下的规定数量的合法的走法prostill[361][4],然后再在这个走法集合中进行Alpha-Bate搜索,选出当前最合适的走法。
在函数searchArea()中,主要从两方面来筛选,一是看是否在搜索到的关键路径中,二是是否在前面几子的周围。
3.4搜索技术
3.4.1博弈树
几乎所有的棋类问题,都可以用博弈树来描述。
博弈树是把计算机和用户所有可能的走法和局面罗列出来的一颗树。
黑白双方交替地按合理走法把树展开,树的每一个节点都表示某一个特定局面。
根节点表示的是当前需要计算的局面,中间节点表示的是对弈过程中的某一个局面,叶子节点是树的最底端,表示可以推导的局面。
叶子节点和根节点之间的最大距离,称为搜索深度。
整个博弈树描述的是从当前局面出发,包含所有可能的对弈过程的搜索树。
六子棋计算机博弈问题也就转化为寻求最佳路径的问题。
我们假设博弈树是有限的,这样我们就不会遇到永无止境的棋局或者一步有无限多种着法的棋局。
一般搜索树中有三种类型的结点:
(1)偶数层的中间结点,代表棋手甲要走的局面;
(2)奇数层的中间结点,代表棋手乙要走的局面;
(3)叶子结点,代表棋局结束的局面,即棋手甲或乙获胜,或者是和局。
3.4.2“最小-最大”原理与Alpha-Bate算法
我们考虑两个玩家对弈,分别为MAX和MIN。
MAX先走,之后两人交替走步直到游戏结束。
游戏用产生式系统描述。
由于不可能对完整解图进行搜索,我们定义一个静态估计函数f,以便对游戏状态的当前势态进行估值。
一般规定有利于MAX的状态取f(s)>0,有利于MIN的状态取f(s)<0。
用井字棋为例给出极大极小搜索的5个步骤。
(1)生成整个博弈树,即扩展树的每个节点。
(2)用静态估值函数f对每个叶节点进行估值,得出每个终节点的评价值。
(3)用终节点的估值来得到其搜索树上一层节点的估值。
如图40所示A1走步的MIN结点选择走步,应选A15,由A15走步得到的估值是A1走步中最小的,同样A2、A3的MIN也选择最小值走步。
(4)重复(3)过程在MAX层取其分支的最大值,MIN层取其分支的最小值,一直回溯到根结点。
(5)最终,根结点选择分支值最大的走步走,如图22中,A3走步为根的最佳走步。
这就是极大极小搜索过程(MINIMAXdecision)。
图4极大极小搜索
α-β剪枝搜索:
α-β剪枝搜索是一种基于α-β剪枝(α-βcut-off)的深度优先搜索(Depth-firstsearch)。
它去掉了一些不影响最终结果的分支而返回与极大极小搜索相同走步的过程,其过程可描述如下:
(1)α剪枝:
若任一极小值层节点的β值小于或等于它任一先辈极大值层节点的α值,即α(先辈层)≥β(后继层),则可中止该极小值层中这个MIN节点以下的搜索过程,这个MIN节点最终的倒推值就确定为这个β值。
(2)β剪枝:
若任一极大值层节点的α值[5]大于或等于它任一先辈极小值层节点的β值,即α(后继层)≥β(先辈层),则可中止该极小值层中这个MAX节点以下的搜索过程,这个MAX节点最终的倒推值就确定为这个α值。
其伪代码如下:
publicintchessAlphaBeta(nPly,nAlpha,nBeta){
if(gameover)
returnEveluation;//胜负已分,返回估值
if(nPly==0)
returnEveluation;//搜索到叶子节点,返回估值
if(IsMinNode)//判断当前节点是何种节点{
//是取极小值的节点
for(eachpossiblemovem){//对每一可能的走法m
makemovem;//生成新节点
score=chessAlphaBeta(nPly-1,nAlpha,nBeta);//递归搜索子节点
unmakemovem;//撤销搜索过的节点
if(scorenBeta=score;//取极小值
if(nAlpha>=nBeta)
returnnAlpha;//剪枝,抛弃后继节点
}
}
returnnBeta;//返回最小值
}
else{//是取极大值的节点
for(eachpossiblemovem){//对每一可能的走法m
makemovem;//生成新节点
score=chessAlphaBeta(nPly-1,nAlpha,nBeta);//递归搜索子节点
unmakemove;//撤销搜索过的节点
if(score>nAlpha){
nAlpha=score;//取极大值
if(nAlpha>=nBeta)
returnnBeta;//剪枝,抛弃后继节点
}
}
returnnAlpha;//返回最大值
}
}
在本系统中,通过定义函数searchProperChess()来对当前棋局的各个位置进行筛选,以得到合理走法集合prostill[361],然后再对该集合进行α-β剪枝搜索,通过相应的局面估计来得到当前较优的走法。
不过在系统中,采取了从整体进行考虑的方式,即将“两步”棋看作“一步”棋来看。
当然,在这个比较过程中,系统也有相应的一步棋就连成六子的“出口”。
3.5开局库
本系统实现了一个简单的开局库,即把前面讨论的各种常见开局存储到了程序中。
为了开局的灵活性,本系统采用随机的方法随机选择适当的开局样式,然后再执行。
下面是电脑下第一颗子(黑子)时的程序代码:
publicvoidFirstSecondChess(){
//其实现开局时第一颗子下在棋盘中间部分(横纵坐标在7~13之间)
inti,j;
Randomr;
if(count==-1&&isComputerDoing){
r=newRandom();//产生随机数
i=Math.abs(r.nextInt())%6+6;//简单处理
r=newRandom();//产生随机数
j=Math.abs(r.nextInt())%6+6;//简单处理
setPosition(i,j);//下子处理函数
}
}
4.改进的方案的设计
本系统亟待改进的便是要进一步提高电脑的AI,这也是智能六子棋游戏的关键。
在本程序中,我只是初步实现了定值估值和搜索算法的集合,这离高等级的AI还相距甚远,要真正的提高电脑AI还有很多步,例如,本程序中,我只是去搜索了局部最优,没有进一步寻找全局最优,如果玩家多想几步,电脑就应付不了了。
目前有以下几种方法提高电脑棋力:
一是动态估值,二是增加细致的特定棋形的判断,三是将局部最优和全局最优结合起来,四是完善开局库和增加学习功能。
对于第一点,主要在于攻守转换和急手处理,这个要综合多方面的因素,需要从以往的经验等出发多尝试,工作量较大且不易拿捏。
而第二点呢,增加棋型的判断也是重要的,我程序中的判断还是很不全面,以至于某些棋型的优势没有被发掘出来,这与实际存在些差异的,不过这主要是个数学问题。
第三点,这个也很重要,同时也是最容易实现的,因为实际上这个就是增加搜索深度,然后考虑整体和局部的估值,用递归可以实现。
在实际情况下,这点就是多考虑几步,从整体考虑的意思了。
当然,增加搜索深度后,程序的效率又不得不考虑了,否则电脑下一步棋要等很久,这个是很受不了的。
对于第四点,这在对局中非常有用,带有完善开局库和有学习功能的六子棋将是难以战胜的,不过这个是一个极其繁琐的过程,其中完善开局库的学习功能较容易实现。
5.结束语
基于人工智能和计算机博弈,本文设计了一个可以实现人机和人人对弈的六子棋人工智能系统。
六子棋作为一个刚刚兴起不久的棋类游戏,其计算机博弈算法的研究还相对较少。
现在做的比较好的智能六子棋系统有NCTU6、X6、EVG等。
六子棋是复杂度很高的棋类游戏,因此,研究它是很有挑战的一件事。
本文很好的利用人工智能的思想完成了设计,达成了涉及的目标。
参考文献
[1]李果.六子棋计算机博弈及其系统的研究与实现[D].重庆:
重庆大学,2007.04
[2]GeorgeELuger.ArtificialIntelligence:
StructuresandStrategiesforComplexProblemSolving,FifthEdition[M].北京:
机械工业出版社,2005
[3]王小春.PC游戏编程(人机博弈)[M].重庆:
重庆大学出版社,2003
[4]蔡自兴,徐光祐.人工智能及其应用(第三版)[M].北京:
清华大学出版社,2003
[5]六子棋主页.http:
//www.connect6.org/
TheresearchdesignofConnect6AIsystembasedonJava
QiuYe,YangXu,WangWei
SchoolofComputerScienceandTechnology,ChinaUniversityofMiningandTechnology,
XuZhou(221008)
Abstract
Asanewchessgame,Connect6hasn’tattractedenoughattentiontotheresearchofitsrelativealgorithms.ItisachallengetotakepartintheresearchbecauseConnect6hasthehighgame-treeandstate-spacecomplexities.ThissystemisatryingofConnect6computergametechnologyanditismainlycompletedfortheman-mangameandsimpleman-computergame.Ingames,thesystemfirstlysumsthestaticvalueofallthechesstypesofthecurrentsituation,andthenoptimizestheAlpha-BetasearchtechnologytoachieveAI.Atlast,thisarticlediscussessomewaystoimprovetheartificialintelligenceofthesystem.Withthedevelopmentofscienceandtechnology,AIwillhelppeoplemoreandmore.
Keywords:
computergame;Connect6;Java;Alpha-Betasearchtechnology;ArtificialIntelligence.