摘要:本文简单的介绍了计算机博弈算法。计算机博弈在某种形式上属于人工智能,而本文只介绍一下其中的一种简单形式——零和博弈,并给出了一个实例――黑白棋。
关键字:搜索,估值,剪枝,Alpha-Beta,零和博弈
引言
随着计算机处理速度的飞速提高,人们很早就提出了疑问:计算机是否会超越人类?世界国际象棋大师已被计算机打败,计算机已经超过了人类?看完本文,相信你会对计算机棋手的智能有所了解。
概念
什么是博弈?狭义地说,博弈中的博是指赌博,而弈就是下棋。赌博并不提倡,在这里所说的博弈就单指下棋。就一局棋而言,一方获胜,则另一方失利,在某些棋类中,如果双方僵持不下,则形成和棋。总之,在一局棋的任何一个时刻,一方获得的利益就相当于另一方的损失。也就是说,不会出现“双赢”的局面。这类问题被称为零和博弈,因为双方的所得加在一起等于0。
优胜劣汰
人类在下棋时一定会选择对自己最有利的走法,计算机也一样,人们编写的下棋程序也继承了人类的思考方法,即找到对自己最有利的走法。这种最有利的走法通常是可以赢得胜利的走法,比如象棋中某个走法可以将对方将死,又如黑白棋中棋子数多的一方胜利,那么我们的走法就要尽量是自己的棋子多,而对手的棋子少,当然,这样的黑白棋棋力很弱,后面会讲到这个问题。
搜索算法
但是棋类游戏不可能一步就决出胜负,象棋中不可能第一步就将对方将死;而对某个棋局的判断也不可能完全精确,在黑白棋中,初局时棋子多并不一定最终取得胜利,因为对手可能在后面的博弈过程中将局面扭转。想想人类下棋时,一般会假设我走这步,那么对手会怎样回应,如果对手回应了某一步,我再走哪一步,如果对手回应了另外某一步,我又该怎么走;然后再假设我走另外的某一步,如此反复下去。这个过程叫做搜索。
在这里我们要先回顾一下“树”这种数据结构以及树的遍历,如图一。
图一
图一是一个三层,12节点的树。树的遍历有深度优先遍历和广度优先遍历(如果对这些概念不清楚,请参考数据结构的书籍),深度优先遍历由于编程简单,内存占用小,在博弈中用的较多。现在我们假设一个棋局,计算机先走,它可以有若干种走法,而对应每种走法,计算机的对手又有若干种走法,将这句话展开,就得到了类似图一的一棵树。就拿图一来说,初始棋局是A,此时计算机有3种走法,分别导致棋局B、C、D,对于棋局B,计算机的对手有3种走法,分别导致棋局E、F、G,对于棋局C,对手的走法又导致棋局H、I,等等。
那么对于初始棋局A,计算机应该选择哪种走法呢?显然,计算机要选择B、C、D中对自己最有利的,对于这种有利与不利而言,计算机一般以分值来表示,比如对计算机越有利,分值越高,不少程序为了直观,将对双方平等的局面设为0分。但B、C、D局面并不是棋局结束,棋局还要继续下去,而且轮到对手走棋了,这时对于棋局B,对手也要从E、F、G中选择一个对他自己最有利的,对于棋局C,对手要从H、I中选择一个对他自己最有利的。注意,对对手最有利就是对自己最不利,因此,B的得分应该是E、F、G中最小的,C的得分应该是H、I中最小的,等等;而A的得分应该是B、C、D中最大的。这就是极大极小搜索的基本原理。
关于搜索,还有一个重要的问题,就是计算机的对手。在搜索过程中,计算机需要假设一个对手,而这个对手要是足够聪明的。那么这个对手是谁呢?实际上这个对手就是计算机自己。
如果我们将这棵树不停的扩展下去,直到棋局分出输赢,那么我们就建立了一棵完整的博弈树,称为最大最小树,树中包含了下棋过程中所有可能出现的棋局,而且树的叶子节点都是可以分胜负的棋局。这真是一个好办法,只要建立这棵完整的博弈树就可以找到一条通往胜利的路,真是太好了。但是稍加分析就知道,这棵树根本建立不起来。比如象棋,可以把一个棋子来回的移动,这棵树就没有了尽头;对于黑白棋来说,虽然棋局结束是肯定的,但是这棵树上的节点也是天文数字,即使1秒钟能生成10^10个节点,这棵树的生成时间也是天文数字。因此建立完整博弈树是完全不实用的。
局面估值