吴昊品游戏核心算法 Round 2 (特别篇附加版)—— 中国象棋AI的某些想法(转载自厦门大学的一篇本科生毕业论文)

 吴昊的一些想法:棋类的规则的复杂,其AI也随着一起复杂,有些时候,方法还是多样化的,比如,搜索和博弈算法是具有一些客观性的,但是,这些客观性如果 可以和某些主观性(比如,人为地确定的一些规则)结合起来,则可以起到一些更好的效果。目前,中国象棋AI水平最高的是巫师象棋,其在2008年的智运会 上夺得了中国象棋AI的冠军。其最新的引擎据说是目前世界水平第一的中国象棋大师的棋力的两倍左右。相比中国象棋来说,AI目前最难的还是围棋。目前围棋 AI最牛的软件是“手谈”,但是,即使这样,其水平也最多是业余一段左右。我听说日本围棋界的相关报道显示,假设真有一种“每一步棋都是最强的手筋”,也 就是最大效率的话,可以让曾经如日中天的赵治勋两子,此如果为实的话,估计也是基于一定概率的情况推算出来的。

 

(图为目前中国象棋界AI最牛B的巫师象棋)

 

摘 要

 

计 算机博弈是人工智能研究的一个重要分支,被专家门称为人工智能界的果蝇,意思是说人类对计算机博弈的研究衍生了大量的研究成果,这些成果在人工智能领域产 生了重要影响。国际象棋计算机博弈研究已经有了五十多年的历史,IBM公司在1997年开发出了超级计算机“深蓝”战胜了当时世界国际象棋大师卡斯帕罗 夫,标志其水平已达到国际象棋世界冠军水平。而中国象棋的历史更为悠久,虽然中国象棋计算机博弈研究起步晚于国际象棋,但起点高,国际象棋计算机博弈研究 的成果为我们提供了很多的借鉴技术。近年来随着研究的不断深入,中国象棋计算机博弈越来越成为继国际象棋后计算机博弈研究的热点之一。

本文在对目前主流的计算机博弈技术进行全面的综述后,对构成计算机博弈系统的四个组成部分进行了优化和改进,特别是针对静态估值算法不能应对局势变化的固有缺点,提出了动态局势再评估算法。在此之上实现了一个中国象棋计算机博弈系统,论文主要研究了以下3方面的问题:

第一、对计算机博弈系统的四个组成部分及基础技术进行了研究,包括数据结构,着法生成,搜索算法,估值算法。

第二、研究了建立在Alpha-Beta搜索算法基础之上的各种优化技术。主要讨论了窗口探测,静寂搜索,历史启发,深层迭代,Null Move5个方面的优化方法,并根据实验结果结合置换表技术提出了具体的组合方案。

第三、论文针对目前广泛使用的静态估值算法不能应对局势变化的固有缺点,提出了动态局势再评估算法。通过引入“局势因子”,使得估值算法根据当前局面形势做出攻防策略。

关键词:人工智能;中国象棋;博弈算法;动态局势再评估;局势因子

 

 Abstract

 

Computer game is an important branch of artificial intelligence research. It is described as a fruit fly of the artificial intelligence by experts. That’s to say human’s research to the computer game has achieved massive research results. These achievements have played an important influence on a more widespread domain. Throug overseas researchers’ exploration of chess gambling system for more than 50 years, IBM Corporation developed super computer ”DarkBlue” in1997,and has defeated world chess master Ksparov; while the Chinese chess history is more glorious. The research of Chinese chess computer game is later than the research of chess computer game, but it based on the computer game’s research results. With the deeper study of research, Chinese chess computer game becomes one of the most active parts of computer game research area recently.

After summarizing related researches on Chinese chess computer game. Some key problems are studied and discussed in this dissertation. Based on above work,an integrated Chinese chess computer game system are designed and developed. The whole work mainly focuses on the following three aspects:

1. Introduce the key component parts of a Chinese chess computer game system which involve date structure, generate legal moves, search algorithms and evaluate algorithms.

2. Make a study on the optimization of search algorithm based on the Alpha-Beta algorithm which included Principal Variation Search, quiescence search, history heuristic, interative deepening, null-move pruning and so on.

3. This paper provides an algorithm called “dynamic situation evaluate algorithm” which avoids the drawback of static evaluate. As the introduction of “decision factor”, computer can make decisions by situation.

Key words: artificial intelligence; Chinese chess; game algorithm; dynamic situation evaluate algorithm; decision factor

 

目录

 

第一章 绪论... 8

1.1 选题背景和研究意义... 8

1.2 中国象棋计算机博弈的发展历程... 9

1.3 国内外研究现状... 10

1.4 本文的主要工作和论文结构... 11

第二章 背景知识... 13

2.1 数据结构... 13

2.1.1 棋盘表示... 13

2.1.2 置换表... 14

2.2 着法生成... 15

2.3 搜索算法... 16

2.3.1 博弈树的基本概念... 16

2.3.2极大极小算法... 17

2.3.3 负极大值法... 19

2.3.4 Alpha-Beta搜索算法... 20

2.4 估值算法... 22

2.5 本章小结... 23

第三章 搜索算法的优化... 24

3.1 窗口探测... 24

3.1.1渴望搜索... 24

3.1.2 极小窗口算法... 25

3.2 静寂搜索... 26

3.3 历史启发... 26

3.4 深层迭代... 27

3.5 Null Move. 29

3.6 内存优化... 29

3.7 本章小结... 30

第四章 动态局势再评估算法... 31

4.1 静态评估算法详述... 31

4.1.1 对子力和攻击性的评估... 31

4.1.2 对棋子位置附加值的评估... 31

4.1.3 对灵活性的评估... 32

4.1.4 对棋子的协调性和保护性的评估... 32

4.1.5 静态估值函数... 33

4.2 静态估值函数的缺陷... 33

4.3 局势因子及动态局势再评估函数... 33

4.4 动态局势再评估算法的步骤... 36

4.5 本章小结... 36

第五章 中国象棋计算机博弈系统——出棋制胜的设计与实现... 38

5.1 系统设计... 38

5.1.1中国象棋通用引擎协议层(UCCI) 38

5.1.2 “出棋制胜”软件系统结构图... 39

5.2 详细设计... 39

5.2.1 棋盘棋子表示... 39

5.2.2 着法生成... 40

5.2.3 搜索算法... 43

5.2.4 评估算法... 45

5.2.5 置换表... 45

5.3 实验结果和相关问题的讨论... 46

5.4 本章小结... 47

第六章 总结... 48

致谢... 49

参考文献... 50

Contents

 

Chapter 1 Introduction. 8

1.1 Research Topics’ Background and Significance. 8

1.2 Chinese Chess Computer Game’s Developing Process. 9

1.3 The Status Quo at Home and Abroad.. 10

1.4 The Main Work and Structure of this thesis. 11

Chapter 2 Background Knowledge. 13

2.1 Date Structure. 13

2.1.1 Chess Board Expression. 13

2.1.2 Transposing Table. 14

2.2 Moves Generation. 15

2.3 Search Algorithms. 16

2.3.1 game tree’s concept 16

2.3.2 Minimax Algorithm.. 17

2.3.3 Negamax Algorithm.. 19

2.3.4 Alpha-Beta Algorithm.. 20

2.4 Evaluate Algorithm.. 22

2.5 Chapter Summary. 23

Chapter 3 The Optimization of Search Algorithm.. 24

3.1 Window Detection. 24

3.1.1 Eager Search. 24

3.1.2 Principal Variation Search. 25

3.2 Quiescence Search. 26

3.3 History Heuristic. 26

3.4 Interative Deepening. 27

3.5 Null Move. 29

3.6 Memory Optimization. 29

3.7 Chapter Summary. 30

Chaper 4 Dynamic Situation Evaluate Algorithm.. 31

4.1 Static Evaluate Algorithm.. 31

4.1.1 The Evaluation of The Chessman’s Value. 31

4.1.2 The Evaluation of The Chessman’s Position. 31

4.1.3 The Evaluation of The Chessman’s Movability. 32

4.1.4 The Evaluation of The Chessman’s Compatibility. 32

4.1.5 Static Evaluate Method. 33

4.2 Static Evaluate Method’s Disadvantage. 33

4.3 Decision Factor and Dynamic Situation Evaluate Algorithm.. 33

4.4 The Steps of Dynamic Situation Evaluate Algorithm.. 36

4.5 Chapter Summary. 36

Chaper 5 Chinese Chess Computer Game System.. 38

5.1 System Design. 38

5.1.1 Universal Chinese Chess Protocol (UCCI) 38

5.1.2 The Structure of The System.. 39

5.2 Detailed Design. 39

5.2.1 Chess Board Expression. 39

5.2.2 Moves Generation. 40

5.2.3 Search Algorithms. 43

5.2.4 Evaluate Algorithm.. 45

5.2.5 Transposing Table. 45

5.3 The Experimental Results and Discuss Related Issues. 46

5.4 Chapter Summary. 47

Chapter 6 Summary. 48

Acknowledgement 49

References. 50

 

 

第一章 绪论

 

1.1 选题背景和研究意义

计 算机博弈是人工智能研究的一个重要分支,被专家门称为人工智能界的果蝇,意思是说人类对计算机博弈的研究衍生了大量的研究成果,这些成果在人工智能领域产 生了重要影响。国际象棋计算机博弈研究已经有了五十多年的历史,IBM公司在1997年开发出了超级计算机“深蓝”战胜了当时世界公认第一的国际象棋大师 卡斯帕罗夫,标志其水平已超过国际象棋世界冠军。而中国象棋的历史更为悠久,早在2000多年前的战国时代就已经有了关于象棋的记载。中国象棋计算机博弈 的难度绝不会低于国际象棋,表1.1是几种棋类游戏空间复杂度和树复杂度对比,其中中国象棋的空间复杂度是国际象棋的100倍,而树复杂度则达到了1027倍。

 

表1.1 几种棋类空间复杂度和树复杂度对比

 

 

中 国象棋计算机博弈起步晚,七十年代末才有相关的研究文献,比国际象棋晚了近20年,相对国际象棋计算机博弈技术还不够成熟。但近年来通过许多中国象棋软件 编程爱好者和多个象棋开发团队的努力,使中国象棋软件水平有了长足的进步,慢棋已达到业余大师水平,快棋可以和象棋大师对抗。但要设计出打败人类的中国象 棋软件,还需要一段发展过程。

人工智能的先驱者们曾认真地表明:如果能够掌握下棋的本质,也许就掌握了人类智能行为的核心;那些能够存在于下棋活动中的重大原则,或许就存在于其它任何需要人类智能的活动中。因此对于中国象棋人机博弈问题的研究意义重大。

 

1.2 中国象棋计算机博弈的发展历程

计算机中国象棋是在计算机国际象棋博弈的基础上发展起来的。

第 一个棋弈程序写于电脑被真正发明之前,这是一个非常有趣的事实。它是由数学家阿伦·图灵(Alan Turing)所编写的,他知道可编程电脑即将出现,一旦发明出来,就有下棋的能力。图灵的伟大成就是领导专家小组破译了纳粹德国的“谜”密码,因此对第 二次世界大战的决定性结束作出了贡献。战争结束不久,他就写下了能够让机器下棋的指令。由于当时还没有一台机器能够执行这些指令,于是他就自己执行(即图 灵根据他所写的算法去运算,严格根据运算得出的结果去走棋),充当一个“人类CPU”,每走一步需要半个多小时。

国际象棋计算机博 弈的重大突破应归属于C.Shannon1950年发表的两篇有关计算机博弈的奠基性文章(Programming A Computer for Playing Chess 和A Chess-playing Machine)。1946年美籍匈牙利数学家约翰·凡·诺依曼(John von Neumann)被指派设计一台强大的计算机器以加快工作进度的任务。到了1950年,一台叫“MANIAC一号”的巨型机被交付使用,它内装有数千个电 子管和开关,每秒能执行10,000条指令,它也可以编程。科学家并不马上用它来设计核弹,而是先试验一下这台机器,而首先做的事情之一就是编写一个下棋 的程序,这是一个缩小的6x6棋盘,没有象。虽然这么简化了但程序要搜索四层的深度仍需要12分钟。

50年代中期,这台机器下了三局棋。第一局是自己对自己,白胜。第二局是对一位让王后的强棋手,这局棋进行了10个小时,结果人类大师胜。第三局机器的对手是一位刚学棋一个星期的的年轻姑娘,结果程序23回合得胜。这是在智力博弈中人类首次负于电脑。

1958 年,匹兹堡大学的三位科学家奈维尔、肖恩和西蒙(Newell, Shaw and Simon)有重大发现:可以从搜索树中剔除相当大的部分而不影响最后结果,他们把这叫Alpha-Beta算法。很重要指出的是,这是一个纯数学领域的 技巧,独立于任何国际象棋知识而生效。

1958年,IBM704成为第一台能同人下棋的计算机,名为“思考”思考速度每秒200步。60年代中期,科学家德里夫斯断言,计算机将无法击败一位年仅10岁的棋手。

1967年,MIT的Greenblatt等人在PDP-6机器上利用软件工具开发的Mac Hack VI程序,参加麻省国际象棋锦标赛,写下了计算机正式击败人类的记录。

从1970年起,ACM(Association for ComputingMachinery)开始举办每年一度的全美计算机国际象棋大赛。从1974年起,三年一度的世界计算机国际象棋大赛开始举办。

1975 年,电脑科学家肯·汤普森(Ken Thompson)觉得不能等待速度快5一25倍的百万美元级超级电脑来用于提高下棋能力。他和贝尔实验室的同事一起决定建造一台专门用途的机器,使用了 价值大约20,000美元的几百个芯片。他们把这台机器叫做“尤物”(belle),它只会下国际象棋。它能够每秒搜索大约18万个局面(而当时的超级电 脑只能搜索5000个)。“尤物”在比赛中可以搜索八至九层那么深,因此可以和大师同场竞技。从1980年到1983年它赢得了世界电脑国际象棋和所有其 它电脑竞赛冠军,直到被价钱贵上千倍的克雷X-MPs巨型机(Cray X-Mps)取代为止。

80年代中期,电脑科学家、卡梅隆 大学的汉斯·贝利纳(Hans Berliner)教授接手肯·汤普森放下的工作。贝利纳的几个学生包括华人许锋雄等自行研究叫“芯测”的机器,后来则是“深思” (Deep Thought)。它只花5000美元但每秒搜索50万个局面。就在它诞生的同一年,就因在一次比赛中击败了一位大师而震惊了国际象棋界,成了第一台国际 象棋大师级的计算机。许锋雄等后来加入了IBM,和其他人合作制造了IBM现在的“深蓝” (Deep Blue)。1997年深蓝在“回敬赛”中战胜棋王卡斯帕罗夫,标志者计算机国际象棋博弈达到了一个新的里程碑。

   计算机中国象棋的研究历史较短,文献和报道均很少。台湾学者在七十年代末开始了计算机中国象棋的研究工作,并在八十年代初开发和出版了苹果机(6502) 和IBM PC机(8088)象棋程序。1983年南开大学开发了残局程序,并在随后的几年里开发了全局程序。但由于中国象棋在计算机实现方面比国际象棋更加复杂, 而且中国象棋博弈技术研究落后于国际象棋,所以中国象棋软件还远未达到世界冠军水平。但近年来通过许多中国象棋软件编程爱好者和多个象棋开发团队的努力, 使中国象棋软件水平有了长足的进步,慢棋已达到业余大师水平,快棋可以和象棋大师对抗。当然要设计出打败人类的中国象棋软件,还需要象开发国际象棋软件那 样有大量的商业金钱投入,比如要组建由中国象棋特级大师和最优秀象棋软件开发设计人员组成的开发团队,使用世界上最先进的超级计算机等。

 

1.3 国内外研究现状

中 国象棋计算机博弈研究开始于70年代,比较著名的软件有台湾的吴身润的《中国象棋》、光谱公司出品的《将族111》、晨业编制的《象棋水浒战》、《象棋武 林帖》而且涉足这个领域比较早的是台湾的一些专家学者。近几年,在内地也涌现出一批对中国象棋人机博弈问题感兴趣的高校、单位及个人,而且进入21世纪以 后,中国象棋计算机博弈的研究受到越来越多的学者的关注,比较著名的博弈软件如表1.2所示。

 

图1.1 知名象棋程序一览[1]

 

近 年来,在各高校,团队和众多中国象棋爱好者的努力下,取得了可喜的成绩。每年一届的中国象棋计算机博弈的国际奥林匹克大赛,这其中有2003年的世界冠军 “纵马奔流”,2004年的世界冠军“谢谢象棋大师”,2005年的世界冠军“象棋奇兵”,2006年的世界冠军“棋天大圣”,而且今年又由东北大学、清 华大学等高校承办了在北京举行的首届中国象棋人机博弈大赛,这些都体现了中国象棋的人机博弈的研究的受关注程度。

2006年8月, “浪潮杯”全国首届机器博弈锦标赛暨研讨会于北京举行,仅设有中国象棋的比赛。赛后,组织了5个软件对5位象棋大师的人机大战,最终软件方取得了胜利。其 后,“棋天大圣”作为软件的冠军挑战中国棋王许银川,两战皆和。这次比赛拉开了国内机器博弈发展的序幕,从此,越来越多的学者开始投入到这个人工智能学科 中非常重要的领域中。

 

1.4 本文的主要工作和论文结构

本文的主要内容是在分析计算机博弈关键技术的基础上,将博弈搜索和动态局势再评估算法应用到中国象棋计算机博弈系统的设计与实现上。论文主要研究以下4部分的内容:

(1) 数据结构,包括棋盘表示,置换表

(2) 着法生成,产生所有合法着法

(3) 搜索算法,基于Alpha-Beta搜索算法的优化

(4) 估值算法,提出一种可行的动态局势再评估算法

本文后继章节安排如下:

第二章、对计算机博弈系统的四个组成部分及基础技术进行了研究,为后续章节及中国象棋计算机博弈程序设计打下基础。

第三章、研究了建立在Alpha-Beta搜索算法基础之上的各种优化方法。主要讨论了窗口探测,静寂搜索,历史启发,深层迭代,Null Move5个方面的优化方法,并根据实验结果结合置换表技术提出了具体的组合方案。

第四章、论文针对目前广泛使用的静态估值算法不能应对局势变化的固有缺点,提出了动态局势再评估算法。通过引入“局势因子”,使得估值算法根据当前局面形势做出攻防策略。

第五章、结合第三章提出的搜索方案和第四章的动态局势再评估算法,搭建中国象棋计算机博弈系统。并对搜索方案和动态局势再评估算法进行实验验证。

最后总结本文的研究工作和结果,并就本文的后续研究提出自己的思考、见解和展望。

 

第二章 背景知识

 

本章主要介绍构建一个计算机博弈系统所需的基础知识和框架,为实现中国象棋博弈程序打下基础。

计算机象棋对弈是一种双人完备信息的博弈过程[2],其核心思想并不复杂,实际上就是对博弈树节点的估值过程和对博弈树搜索过程的结合[3]。博弈程序的任务就是对博弈树进行搜索找出当前最优的一步走棋,而当前最优的判断由估值算法给出。

根据上述过程,一个完整的计算机象棋博弈系统包含一下四部分:

1,数据结构:由棋盘表示,置换表等组成;

2,着法生成器:产生指定局面下所有合法的着法;

3,搜索算法:对博弈树进行搜索,由着法生成器生成扩展节点;

4,估值算法:依据特定局面博弈双方的优劣形势给出的一个估值。

其中,搜索算法和估值算法是计算机博弈的核心,这四个部分相互配合运转起来,就可以实现计算机象棋博弈系统。

 

2.1 数据结构

       在一个搜索体系中,对研究目标构造一个好的数据结构,既能使搜索快速地进行,更能大大提高搜索的效率。好的数据结构往往要考虑三个方面的问题:1、占用的 空间数量2、操作速度3、使用方便与否。一般的,紧凑的数据表示会赢得空间上的优势,但往往会延长某些操作的时间。然而在某些例子中,巧妙的数据结构设计 可以同时减少时间和空间上的消耗,如下文提到的位棋盘。

 

2.1.1 棋盘表示

       典型的中国象棋棋盘如图2.1,中国象棋的棋盘有9列10行,共90个点。

一般来说,棋盘既可以用9*10的二维数组表示,也可以用一维数组表示。现在我们来比较一下这两种表示方法:

(l),二维数组,表示比较直观,譬如棋盘横坐标从左开始0到8,纵坐标从上到下为0到9的话,棋盘左上角的点就是Board[0][0],整个棋盘坐标用Board[9][10]来定义,这样表示比较直观。

 

图2.1中国象棋棋盘数组表示[4]

 

 (2)一维数组,举个例子,棋盘第一行0,1,2,3,4,5,6,7,8,第二行9,10,11,12,13,14,15,16,17,如此类推,用一维数组表示坐标。计算棋盘上某个点的横坐标纵坐标,只需作N%9和N/9计算便可。

比较两种方式,由于在搜索、评价时,访问用一维数组的方式访问棋盘比用二维数组的方式快(少了一次地址偏移操作),采用的一维数组有速度上的优势。

引 入位棋盘可以进一步提高着法生成和盘面估值的效率。国际象棋着法生成中最著名的辅助方法莫过于位棋盘了。位棋盘是由前苏联KASS工A小组于60年代提出 的数据结构。国际象棋的位棋盘其实就是一个64位长度的变量,用来记录国际象棋棋盘上的某些布尔值。因为国际象棋棋盘上有64格,所以用64位二进制数正 好与之对应。位棋盘就是棋盘的每一格用0或1来表示,用来判断每个格子的状态是“是”还是“否”。而中国象棋棋盘总共有90个点,故可以用3个32位的字 来表示。

一个完整的中国象棋棋盘局面需要用14个比特棋盘来表示:红帅,黑将,红仕,黑士等等。另外再用两个比特棋盘来表示“所有红子”和“所有黑子”的位棋盘,可以加快运算速度。还可以通过再加入位棋盘来表示被某种棋子所攻击到的棋子,这样可以进一步走法产生的效率。

 

2.1.2 置换表

      在象棋里,有很多着法可以到达相同的位置。有不同的路线可以达到同样位置的,这种现象称为“置换”(Transposing)。

置 换表存储的是已经搜索过的结果,它通常使用类似于散列表(Hash Dictionary)的数据结构来达到最快的查询速度。在搜索某个局面时,结果(包括局面分析的值、搜索深度、最佳着法等)就存储到置换表里。当搜索新 的局面时,我们先从置换表里找,如果已经有这种局面,那么就可以利用它,省去重复的搜索。

这种处理有以下很多好处:

1. 加快速度。在置换情况发生得很多时(特别是残局局面里,棋盘上棋子很少时),90%以上的局面可以在表中找到。

      2. 任意深度。假设你需要对某个局面搜索到一个指定的深度,例如4步(也就是两个回合),如果置换表里有这个局面而且已经搜索了6步,那么你不仅可以跳过这次搜索,还可以得到比预期更精确的结果。

3. 用途广泛。通常每个象棋程序都配有“开局库”(Opening Book),即包含一些常见局面及其最好的着法,这些通常是从已有的记载中提炼的。有了开局库,程序就不必在开局阶段就做傻事了。既然开局库的操作过程和 置换表是一样的(即搜索局面),那么为什么不在棋局一开始就把开局库装入我们的置换表里去呢?如果这样做,即使棋局暂时脱离了开局库,后来又回到开局库里 的局面,那么置换表里保留了这样的局面,我们仍旧有机会用到它。

 

2.2 着法生成

       走法产生是指将一个局面的所有可能的走法罗列出来的那一个模块,也

就是告诉其他部分下一步可以往哪里走的模块。由于各种棋类规则的不同,

走法产生的复杂程度也有很大的区别。例如,五子棋的棋盘上任意的空白点

都是合法的下子点。这样在五子棋的走法模块当中只要扫描棋盘,寻找所有

的空白,就可以罗列出所有符合规则的下一步下子点。

对于中国象棋,生成走法的时候,也可以有两种方法:棋盘扫描法和预

置表法。而且由于象棋的规则更加的复杂,所以就要根据具体的规则来设计

走法,比如象只可以走田字,马只可以走日字,兵不可后退只能前进一步,

用棋盘扫描法就要根据棋子的具体走法在棋盘上反复扫描有效区域,制约条

件和落子状况,时间开销巨大。

预置表法就是最经常使用的着法生成方法,它的基本思想就是时间换空

间的思想.为了节省博弈过程中的生成着法的扫描时间,将动子在棋盘任何

位置、针对棋子的全部可能分布,事先给出可能的吃子走法和非吃子走法的

关系写入一个预置表中,再通过查表,便很快可以得到可行的着法,虽然这

样需要占用一定的空间,但相对现在的硬件环境应该说还是可以接受的,它

可以将着法生成的速度提高几个数量级。

在进行走法产生的时候,往往伴随着搜索进行。对于一个局面的所有直

接后继,你可以有两种选择:一次产生一种走法然后搜索之;或者一次产生

其所有走法然后搜索之。由于存在着剪枝算法,对一个局面的某一走法搜索

之后往往可能不再需要搜索其他后继,也就是说:可能不用产生全部走法就

能够完成搜索。一次产生一种走法看起来似乎更有效率。但是,由于剪枝算

法的剪枝效率很大程度上依赖于节点的排列顺序,往往一次产生所有节点,

然后以某种方法调整其排列顺序会使搜索效率大大提高。所以,在实际使用

中,绝大部分程序都是一次产生一个局面的全部走法,然后调整其搜索顺序。

 

2.3 搜索算法

       本章在阐述了博弈树概念的基础上,分析了基本的博弈树搜索算法,为后继章节中搜索算法优化打下基础。

 

2.3.1 博弈树的基本概念

       如果参加博弈的不是一个主体,而是对抗性的敌我双方,则搜索的进程不仅仅取决于其中一方的意愿,而是取决于对方应付的策略。由此而产生的搜索树,通常称为博弈树[5]。图2.2就是一颗红方走棋时展开的4层博弈树。

 

图2.2 红方走棋时展开的4层博弈树      

吴昊注释:博弈树算法在我以后的一些Round中,比如在黑白棋中,我还会聊到的。

 

       博弈树搜索的目标是在博弈的任何一个中间阶段,站在博弈双方其中一方的立场上,可以构想一颗博弈树。这颗博弈树的根节点是当前时刻的棋局,它的儿子节点是 假设再行棋一步以后的各种棋局,孙子节点是从儿子节点的棋局再行棋一步的各种棋局,以此类推,构造整棵博弈树,直到可以分出胜负的棋局。像这样从根部向下 递归产生的一棵包含所有可能的对弈过程的搜索树,成为完全搜索树。像这样的完全搜索树是非常庞大的,正如表1.1所示,中国象棋的完全搜索树复杂度是10150,IBM 公司目前正在制造全球运算速度最快的超级计算机,估计峰值操作突破一千万亿(即1015)浮点运算的限制。则计算如此一颗完全搜索树需要的时间是10135妙,约3*10127年。 所以不可能建立到棋局结束的完全搜索树,搜索也不必真地进行到分出胜负的棋局,只需要在一定深度范围内对局面进行评价即可。当搜索进行到一定深度,用局面 评价机制来评价棋局,按照极大极小的原则选出最优,向上回溯,给出这一局面的父亲节点的价值评价,然后再继续向上回溯,一直到根节点,最优走步就是这样搜 索出来的。

 

2.3.2极大极小算法

       极大极小值算法是解决博弈树问题的基本方法。

       在象棋博弈中,极大极小值算法体现在始终站在博弈一方的立场选择着法。因为一方所追求的利益恰是另一方极力避免的,所以在这一方行棋的时候,选择价值极大的儿子节点着法,另一方行棋则选择价值极小的儿子节点着法。这就是一个极大极小过程。

       当然,程序不能也没有必要做到搜索整棵博弈树的所有节点,对于一些己经确定为不佳的走步可以将以它为根节点的子树剪掉。在这个过程中,最为重要的是搜索算 法,高效的搜索算法可以保证用尽量少的时间和空间损耗来达到寻找高价值的走步。但是真的想要博弈程序棋力提高,还必须有一个好的局面评价机制,即估值算法 作后。就是说,用这个估值算法评价的局面价值必须是客观的、正确的,可以确凿的评价局面的优劣以及优劣的程度。如图2.3就是一颗结合估值算法搜索5层的 完全极大极小博弈树。

 

 

图2.3 极大极小搜索

 

       在图2.3中,最底层为当前搜索深度(5层)下对各个可能出现的棋面进行估值的结果,按照由底向上推理,先由黑方选择从第5层各个子节点中选择较小的值推 出第4层各个父节点,然后红方从第4各个节点中选择教大的值向上推出第3层各个父节点,依次交替类推,推出第一层的节点值,从而选择出博弈路 径。      

       以下是极大极小算法的C伪码(并给出相应的注释):


 1 int MiniMax(Position P,int depth)
 2 
 3 {
 4 
 5        int bestValue, value;
 6 
 7        if(Gameover)                            //检查棋局是否结束
 8 
 9               return Evaluation(p);         //棋局结束,返回估值
10 
11        if(depth<=0)                                   //是否叶子节点
12 
13               return Evaluation(p);         //叶子节点,返回估值
14 
15        if(p.color == RED)                  //是否轮到红方走棋
16 
17               bestValue = -MAX;           //是,令初始最大值为极小
18 
19        else bestValue = MAX:            //否,令初始最小值为极大
20 
21        for(each possibly move m)       //对每一可能的走法m
22 
23        {
24 
25               MakeMove(m);                 //产生第i个局面(子节点)
26 
27               value=MiniMax(p,denth-l);//递归调用MiniMax向下搜索子节点
28 
29               unMakeMove(m);             //恢复当前局面
30 
31               if(p.color == RED)
32 
33                      bestValue = max(value,bestValue);     //取最大值
34 
35               else bestValue = min(value,bestValue);      //取最小值
36 
37        }
38 
39        return     bestValue                    //返回最大/最小值
40 
41 }
42 
43 

2.3.3 负极大值法

       普通的极大极小值算法有点麻烦,一方试图取极小值,而另一方试图取极大值,也就是说我们总要检查哪一方要取极大值。负极大值法是一种可以避免此类判断的算 法,负极大值算的值是各子节点的值的负数的极大值。如要这个算法正确运作。例如象棋,估值函数必须对谁走棋敏感,也就是说对于一正的估值的话,则对于一个 该黑方走棋的局面返回负的估值。这样才能保证原来取极大值还是取极大值,原来取极小值则转变成取儿子节点负数的极大值。

       以下是负极大值法的C伪码(并给出相应的注释):


 1 int NegaMax(Position P,int depth)
 2 
 3 {
 4 
 5        int bestValue, value;
 6 
 7        if(Gameover)                            //检查棋局是否结束
 8 
 9               return Evaluation(p);         //棋局结束,返回估值
10 
11        if(depth<=0)                                   //是否叶子节点
12 
13               return Evaluation(p);         //叶子节点,返回估值
14 
15        bestValue = -MAX;           //令初始最大值为极小
16 
17        for(each possibly move m)       //对每一可能的走法m
18 
19        {
20 
21               MakeMove(m);                 //产生第i个局面(子节点)
22 
23               value = - MiniMax(p,denth-l);//递归调用MiniMax,取子节点的负值
24 
25               unMakeMove(m);             //恢复当前局面
26 
27               bestValue = max(value,bestValue);     //取最大值
28 
29        }
30 
31        return     bestValue                    //返回最大值
32 
33 }

 

2.3.4 Alpha-Beta搜索算法

       极大极小算法有个弱点,从简单的例子中还不能明显地看出来——要检查的各种路线的数量是指数形式的,这就意味者工作量会以几何级数增长。

  1. 每方有多少种可能的着法,这个数称为分枝因子(Branch Factor),用B表示;

  2. 考虑的深度用N表示,通常说“N层 ”,“N”是整数,层表示一个棋手走的一步棋。

       例如在象棋中,通常在中局阶段分枝因子大约为35种着法,在黑白棋中大约为8。由于极大极小算法的复杂度是O(BN),所以对一个局面搜索4层就需要检查150万条路线。再增加上去,5层就会把搜索树膨胀到5000万,6层则达到18亿!

       1958年,匹兹堡大学的三位科学家奈维尔、肖恩和西蒙(Newell, Shaw and Simon)有重大发现:可以从搜索树中剔除相当大的部分而不影响最后结果,他们把这叫Alpha-Beta算法。很重要指出的是,这是一个纯数学领域的 技巧,独立于任何国际象棋知识而生效,即它是一个无损,通用的剪枝技巧。

       Alpha-Beta算法的原理是根据当前的信息确定儿子节点的上下界Alpha,Beta,然后根据儿子节点的儿子节点返回值进行剪枝操作。其具体过程如图2.4所示:

      

                                           

图2.4 Alpha-Beta剪枝示意图

 

       图2.4左半部分是一颗极大极小树的片段,节点下面的数字为该节点的值,搜索开始时,A为MAX局面,要从所有的儿子节点中返回最大值,首先搜索第一个子 节点B,假定得到返回值10,那么此时可以确定A的值必定>=10。接着搜索C的第一个子节点D,得到值8,因为C为MIN局面,返回所有子节点最 小值,此时可以确定C的值必定<=8。不论E,F等其他C的子节点可以取道多大的值,C的值都会小于B,不会被A选中,即可剪去对等其他C的子节点 的搜索。此为Alpha剪枝(下界剪枝)。

       图2.4右半部分是是一颗极大极小树的片段,节点下面的数字为该节点的值,搜索开始时,A为MIN局面,要从所有的儿子节点中返回最小值,首先搜索第一个 子节点B,假定得到返回值10,那么此时可以确定A的值必定<=10。接着搜索C的第一个子节点D,得到值12,因为C为MAX局面,返回所有子节 点最大值,此时可以确定C的值必定>=12。不论E,F等其他C的子节点可以取道多小的值,C的值都会大于B,不会被A选中,即可剪去对等其他C的 子节点的搜索。此为Beta剪枝(上界剪枝)。

       如果能尽早的找到值较大的子节点,则能在搜索中剪去很多兄弟节点。所以说Alpha-Beta算法的效率很大程度上受子节点顺序的影响。

       1975年Knuth和Moore给出了Alpha-Beta正确性的数学证明。Alpha-Beta剪枝算法的节点数目为:

ND = 2B D/2-1(D为偶数)

ND = 2B(D+1)/2 + B (D-1)/2 - 1 (D为奇数)

       其中D为搜索深度,B为分枝因子。在不使用Alpha-Beta剪枝时,需要搜索的节点数目是ND = BD,即极大树。所以最理想情况下Alpha-Beta算法搜索深度为D的节点数相当于搜索深度为D/2的不做任何剪枝节点数。

       以下是Alpha-Beta算法的C伪码,用负极大值法实现。


 1 int Alpha-Beta (Position P,int depth,int alpha,int beta)
 2 
 3 {
 4 
 5        int score;
 6 
 7        if(Gameover)                            //检查棋局是否结束
 8 
 9               return Evaluation(p);         //棋局结束,返回估值
10 
11        if(depth<=0)                                   //是否叶子节点
12 
13               return Evaluation(p);         //叶子节点,返回估值
14 
15        for(each possibly move m)       //对每一可能的走法m
16 
17        {
18 
19               MakeMove(m);                 //产生第i个局面(子节点)
20 
21               score = - MiniMax(p,denth-l,-beta,-alpha);
22 
23               unMakeMove(m);             //恢复当前局面
24 
25               if(score >= alpha)
26 
27                      alpha = score;             //保存最大值
28 
29               if(alpha>=beta)
30 
31                      break;                         //beta剪枝         
32 
33        }
34 
35        return     bestValue                    //返回最大值
36 
37 }

 

2.4 估值算法

       现有的计算机的运算能力仍然十分有限,不可能一直搜索到分出输赢的那一步,在有限搜索深度的末端,我们用一些静态的方法,来估计局面的优劣,这就是估值函 数,而估值算法的好坏往往决定了整个系统的棋力。目前主要的估值算法有两种, 线性静态估值和基于人工神经网络的动态估值,而后者正是目前该领域研究的主要方向。

       在第四章,本文提出了一种基于静态评估的动态局势再评估算法,经实验分析,证实了该算法在很大情况下会优与传统的线性静态评估算法。

 

2.5 本章小结

本 章是对构成整个中国象棋计算机博弈系统的关键性技术的一个总体介绍。阐述了各个部分的基本思想,无论是哪种棋类,他们都是由以上几个部分组成的,即:数据 结构,着法生成,搜索算法和估值算法。数据结构和着法生成是整个系统的底层,而搜索算法和估值算法是整个系统的核心,估值算法往往决定了系统的棋力,搜索 算法则解决如何尽快的找到能导致最优解(估值最大)的那步着法,其中搜索算法和估值算法是后续章节的主要内容,也是本文研究的重点。

 

posted on 2013-02-27 20:38  吴昊系列  阅读(1490)  评论(0编辑  收藏  举报

导航