棋类游戏中人机博弈的设计

  以典型的棋类游戏-象棋为例,象棋是一种完全知识博弈(Games of Perfect Information),意思是指参与双方在任何时候都完全清楚每一个棋子是否存在,位于何处。只要看看棋盘,就一清二楚了。跳棋、围棋、象棋、五子棋等都属于完全知识博弈。扑克游戏,还有麻将等大都不是完全知识博弈,因为你不清楚对方手中有什么牌。

  本文将要介绍的技术可或多或少地应用于完全知识博弈,尽管不同的游戏在细节上有很大差异,但在本文中所介绍的搜索算法上对特定的游戏知识依赖不多,不同于走法的生成,局面的评估,对具体的游戏规则有极大程度依赖。

1. 人机博弈的要点

人机对弈的程序,至少应具备如下几个部分:

①某种在机器中表示棋局的方法,能够让程序知道博弈的状态。

②产生合法走法的规则,以使博弈公正地进行,并可判断人类对手是否乱走。

③从所有合法的走法中选择最佳的走法的技术。

④一种评估局面优劣的方法,用以同上面的技术配合做出智能的选择。

⑤一个界面,有了它,这个程序才能用。

本文将简要介绍上面列出的所有内容。

1.1棋盘表示(Board Representations)

  棋盘表示就是使用一种数据结构来描述棋盘及棋盘上的棋子,通常是使用一个二维数组。一个典型的中国象棋棋盘是使用9×10的二维数组表示。每一个元素代表棋盘上的一个交点。一个没有棋子的交点所对应的元素是0,一个黑帅对应的元素是1,黑士则用2表示等等,依此类推。棋盘的数据表示直接影响到程序的时间及空间复杂度。为了追求更高效率,研究人员针对不同棋类提出了多种不同的表示方法。

1.2 走法产生(Move Generation)

  博弈的规则决定了哪些走法是合法的。对有的游戏来说,这很简单,比如五子棋,任何空白的位置都是合法的落子点。但对于象棋来说,就有马走日,象走田等一系列复杂的规则。走法产生是博弈程序中一个相当复杂而且耗费运算时间的方面。不过,通过良好的数据结构,可以显著地提高生成的速度。

1.3 搜索技术(Search Techniques)

  对于计算机来说,直接通过棋盘信息判别走法的好坏并不精确。除了输赢这样的局面可以可靠地判别外,其他的判断都只能做到大致估计。判别两种走法孰优孰劣的一个好方法就是察看棋局走下去的结果。也就是向下搜索若干步,然后比较发展下去的结果。为了避免差错,我们假定对手的思考也和我们一样,也就是,我们想到的内容,对手也想到了。这就是极大极小搜索算法的基本原则。极大极小搜索算法是本书中所有搜索算法的基础。

  极大极小搜索算法的时间复杂度是O(bn)。这里b是分枝因子(branching factor),指棋局在各种情况下的合法走步的平均值;n是搜索的最大深度,也就是向下搜索的博弈双方的走步之和。例如向下搜索甲乙双方各走一步的情形,n就是2。显然对于象棋这种分枝因子在40左右的棋类游戏,时间开销随着n的增大会急剧的增长,不出几层就会超出计算机的处理能力,这将导致在有限时间内得不到令人满意的结果。

  人们在开发高效的搜索算法上投入了大量的研究。在过去的几十年中,一些相当成功的改进大大提高了极大极小搜索的效率。Alpha-Beta剪枝、迭代深化、置换表、历史启发等手段的综合应用将搜索效率提高了几个数量级。

1.4 估值(Evaluation)

  然而,现有的计算机的运算能力仍然十分有限。不可能一直搜索到分出输赢的那一步,在有限搜索深度的末端,我们用一些静态的方法,来估计局面的优劣。这些方法在很大程度上依赖于具体的游戏规则和我们对于该游戏的经验知识,其中相当一部分不完全可靠。例如,中国象棋的程序通常将一个炮赋予远高于一个兵的价值,但一个兵在高手的运用之下往往可以产生不次于炮的作用。

  写出一个好的估值函数并不是一件轻松的事,它需要你对所评估的棋类相当了解,最好是一个经验丰富的高手。然后还要进行无数次的试验,经历几番失败后才可能得到一个令人满意的估值函数。

原文地址:https://www.cnblogs.com/klchang/p/4604941.html