(计算机软件与理论专业论文)电脑象棋的设计与实现.pdf_第1页
(计算机软件与理论专业论文)电脑象棋的设计与实现.pdf_第2页
(计算机软件与理论专业论文)电脑象棋的设计与实现.pdf_第3页
(计算机软件与理论专业论文)电脑象棋的设计与实现.pdf_第4页
(计算机软件与理论专业论文)电脑象棋的设计与实现.pdf_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电脑象棋的设计与实现 中山大学硕上论文2 0 0 4 论文题闩:电脑象棋的设计与实现 专业:计算机软件与理论 硕( 博) 士生:涂志坚 指导老师:姜云飞教授 摘要 计算机博弈是人工智能领域中的一个重要主题,而当前对中国象棋博弈的研 究也在不断地发展着,本文通过对象棋程序“纵马奔流”( 取得了第8 届c o m p u t e r o l y m p i a d 象棋软件金牌) 的数据结构、搜索算法与评价函数的描述,以及对所 采用的数据结构、搜索方法进行基于测试数据集的分析和检验,阐述了一个可达 人类大师水平的象棋程序的设计及实现的原理、方法。且在当中提出了新的 b i t f i l e 、b i 氓a n k 数据结构实现以及t r a n s p o s i t i o n t a b l e 存储的f a i l l o w 修正算法, 有效地提高了实际搜索运算的效率。 关键字:计算机博弈,电脑象棋,启发式搜索 坐堕墨垡堕丝生量塞丝一- ! _ 堕! 盔堂婴圭堕型! t i t l e :d e s i g na n di m p l e m e n t a t i o n o f c o m p m e r x i a n g q i m a j o r :c o m p e e r s c i e n c e n a m e :z h i j i a n t u s u p e r v i s o r :p r o f y u n f e ij i a n g a b s t r a c t c o m p u t e rg a m ep l a y i n gi s a l l i n t e r e s t i n gs u b j e c ti n a r t i f i c i a l i n t e l l i g e n c er e s e a r c h a l s o ,t h er e s e a r c ho nc o m p u t e rx i a n g q i ( c h i n e s ec h e s s ) h a v eb e e nd e v e l o p e dr a 枷d l y i nr e c e n ty e a r si nt h i sa r t i c l ew ed e s c r i b et h ed a t as t r u c t u r e ,s e a r c ha l g o r i t h m s ,a n d e v a l u a t i o nf u n c t i o no fx i a n g q ip r o g r a mz m b l ,w h i c hw o nt h eg o l dm e d a li n 8 “。 c o m p u t e ro l y m p i a dh e l d a t g r a z , a u s t r i a i na d d i t i o n ,t h e r ea r ea n a l y s e s a n d s t a t i s t i c sb a s i n go i lt e s td a t as u i t e st oe x p r e s st h eb e n e f i t st h a tt h es e a r c h i n gm e t h o d s c o u l db r i n g m o r eo v e r , t h i sa r t i c l ep r o v i d e ss e v e r a li n n o v a t i o n ss u c ha st h ed a t a s t n l c n l r eb i t f i l e b i t r a n ka n da ni m p r o v ea l g o r i t h mi nt r a n s p o s i t i o nt a b l es t o r i n g w h e n f a i l s l o w k e yw o r d s :g a m i n gt h e o r y , c o m p u t e rx i a n g q i ,h e u r i s t i c s s e a r c h 电脑象棋的设计与实现中t h 大学硕- i j 论文2 0 0 4 第一章引言 1 1 电脑象棋简介 在人类文明发展的初期,人们便开始进行棋类博弈的游戏了。到了近5 0 年 前,随着电子计算机的诞生,科学家们开始通过电脑模拟人的智能逐步向人类智 能发起挑战,香农( 1 9 5 0 ) 与图灵( 1 9 5 3 ) 提出了对棋类博弈程序的描述,随着电脑 硬件和软件的高速发展,从1 9 8 0 开始,电脑博弈便开始逐渐大规模地向人的智 能发起了挑战,到r1 9 9 7 年,i b m 超级电脑d e e p e rb l u e 击败了当时国际象棋 世界冠军卡斯帕罗夫,成为了人工智能挑战人类智能发展的一个重要旅程碑。 而在空间复杂度以及搜索复杂度比国际象棋更高的中国象棋( 以下简称象 棋) 方面,当前的研究也正蓬勃地发展着,水平也一步步地提高,并出现了不少 优秀的象棋程序,包括台湾大学许舜钦教授及其团队的e l p 、美国吴韧博士的梦 入神机、台湾郑明政的象棋世家、法国p a s c a lt a n g 的x i e x i e 等,出现了研究和 竞技百家争鸣的好景象。随着研究的深入以及电脑硬件速度的增长,在不远的将 来,象棋程序将会向顶尖人类高手发起强而有力的挑战。 表1 - 1 各种棋类复杂度比较 f 空间复杂度搜索树复杂 【 度 黑白棋 1 0 3 01 0 5 8 国际象棋 1 0 5 0 1 0 2 3 中园象棋 1 0 6 01 0 1 6 0 【围棋 1 0 1 6 0 10 4 0 0 电脑象棋的研究常常通过比赛对弈的方式来验证各自研究的成果,当前的主 要比赛包括:由i c g a 每年举办的c o m p u t e ro l y m p i a d ,以及从2 0 0 4 年起在台湾 成功大学举办的世界电脑象棋争霸赛。 1 2 象棋程序“纵马奔流” 本文将会介绍象棋程序“纵马奔流”( 以下简称z m b l ) 的设计原理与实现 电脑象 _ ! 的设计与宴现 中山大学硕十论文2 0 0 4 方法。z m b l 从2 0 0 1 年1 0 月份开始编写,其主要由开局知识库、搜索引擎、评 价函数以及一系列的知识学习机制组成,主要的特点包括快速的数据结构设计实 现、以及高效率的搜索,这些机制保证了z m b l 在应用大量领域知识的同时能 保持高速的搜索速度与深度,做到知识j 速度的均衡。从2 0 0 2 年2 月开始,z m b l 通过t e l n e t 方式在专业象棋网站w w w m o v e s k y n e t ( 对弈者包括大量的专业象棋 大师) 进行自动运行的测试,在2 0 0 2 年底取得快棋排名第一,并且2 0 0 3 年开始 取得慢棋保持前3 名的成绩。与此同时,z m b l 开始参加电脑象棋的比赛,并于 2 0 0 3 年11 月在奥地利格拉兹举行的8 t hc o m p u t e ro l y m p i a d 的取得了电脑象棋的 世界冠军。 1 3 本文架构 第一章将会阐述计算机博弈发展以及电脑象棋介绍、电脑象棋的状态空间复 杂度以及文章架构。 第二章首先描述了电脑象棋表示的一些基本数据结构,然后提出了z m b l 所 采用的双向映射数组的盘面表达方法,以及优化的快速运算数据结构一b i t f i l e 、 b i t r a n k 的设计实现原理。 第三章将重点讲述博奔树的搜索方法,包括博弈树构建、a l p h a - b e t a 算法介 绍、n e g a s c o u t 算法与m i n i m a lw i n d o w 、q u i e s c e n c es e a r c h 、t r a n s p o s i t i o n t a b l e 、 i t e r a t i v e d e e p e n i n g 、m o v eo r d e r i n g 、选择性剪枝和延伸,以及提出新的 t r a n s p o s i t i o nt a b l e 存储的f a i ll o w 修正算法,最后对整体搜索框架进行总结。 第四章主要描述z m b l 的评价函数架构,包括子力分数、子力灵活度评价、 棋盘控制以及一些重要特征的计算。 最后,第五章是全文的总结及展望。 2 电脑象棋的设计与实现中山大学硕士论文2 0 0 4 第二章数据结构 在一个搜索体系,有效地对研究目标构架一个好的数据结构表示,既能快速 便于搜索地进行,更能大大提高搜索的效率。 而在中国象棋博弈的研究中,显然怎样很好的表示棋盘,也是决定搜索效率 的关键之一,一般来说,博弈运算的时间耗费主要在搜索和评价中。搜索时,不 断根据当前棋盘,生成可行移动,然后进行搜索树的扩展;同时评价函数也是根 据当前棋盘情况进行相关特征的计算和估价。因此,好的棋盘数据结构的表示, 能大大提高以上这两个部分的运行效率。 2 ,1 棋盘数组和棋子数组的双向映射模式 在本人编写的中国象棋程序中,采用了是一个棋盘数组和棋子数组双向映射 表的形式。 以下首先说说一些辅助知识: 2 1 1 棋盘坐标 棋盘坐标是指对棋盘建立坐标系,通过坐标标示棋盘上每一点的方法。 圈2 - 1 电脑霉棋的设计与实现中【l 】大学硕士沧文2 0 0 4 2 。1 1 1 二维坐标和一维坐标的比较 二维坐标,表示比较直观,譬如棋盘横坐标从左开始0 到8 ,纵坐标从上到 下为0 到9 的话,棋盘左上角的点就是b o a r d 0 0 ,整个棋盘坐标用b o a r d 9 1 0 】 来定义,这样表示比较真观。 一维坐标,举个例子,棋盘第一行0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,第二行9 , 1 0 ,1 1 ,1 2 ,1 3 ,1 4 ,1 5 ,1 6 ,1 7 ,如此类推,阁一维数缀表示坐标。计算棋盘 上某个点的横坐标纵雀标,只需作n 9 和n 9 计算便可。 比较两种方式,由于在搜索、评价时,访问用一维数组的方式访问棋盘比用 二维数组的方式快( 少了一次地址偏移操作) ,采用的一维数组有速度上的优势。 2 1 1 2 冗余辅助点 冗余辅助点:当进行树扩展时( g e n e r a t em o v e ) ,譬如棋子车,马,炮,兵 等生成可移动步时,举个例子,车的向左移动,每次都要和左边界进行比较,看 当前坐标是否已经超出棋盘,浪费了效率。所以通过在棋盘四周建立冗余点,记 录特殊标志,避免边界检测运算。 2 1 1 3 使用的棋盘坐标表示方法 使用一维数组,结合冗余辅助点,建立如下的棋盘坐标 电脑象棋的设计与实现中山大学硕士论文2 0 0 4 圈2 - 2 其中周围的橙色格为冗余辅助点,中问部分为实际上的棋盘。 卜下左右的偏移量为:( 一1 3 ,+ 1 3 ,- 1 ,+ 1 ) 2 1 。2 棋盘数组表示 棋盘数组是指上面所描述的棋盘坐标上每个点所对应的数据,郎根据棋盘坐 标建立研究目标表示的索引。然后我们进行数据编码: ( 1 ) 空格:0 ( 2 ) 冗余点:d u m m y ( 3 0 ) f 3 ) 棋子表示: 红车红马红炮红兵红士红相红帅 【1 1 1 2 1 31 4 1 51 61 7 黑车 黑马黑炮 里壅里+ 黑象红将 2 1 2 22 3 2 42 52 62 7 其中,十位表示棋子颜色,个位表示棋子类别( 依次是车,马,炮,兵,士,象 帅) 。 2 1 3 棋子数组表示 棋子数组:即根据棋子列表进行索引。在评价函数和生成步中,按照棋盘数组从 9 0 个点一个一个寻找棋子,然后进行评价或者生成步的话,我们就需要每次都 白白循环9 0 次。为了提高运算的效率,我们另外增加了棋子数组c h e s s p o s 1 3 2 】 形成有效的棋子索引,如果c h e s s p o s k 1 = 0 ,1 k 3 2 的话,表示该棋子不存在, 否则的话,表示棋子的实际在棋盘卜的出棕 电脑象棋的设计与宴现 中山大学硕士硷文2 0 0 4 2 1 4 双向映射数组 棋盘数组( 3 1 2 ) 、棋子数组( 313 ) 均可对一个棋盘对象进行完整的描述。单用 棋盘数组( 3 1 2 ) 能方便地检阅棋盘上任一点上的数据,但要依次检索某一方棋子 的时候,要对整个棋盘进行一次检索( 需要9 0 次比较) ,效率较低。单用棋子数 组( 3 13 1 ,能方便知道某棋子在棋盘上的坐标,但要检阅棋盘状况,却要对棋子 数组扫描一次( 需要3 2 次比较) 。为了充分利用两者各自的优点,又同时避免两 者,本人主要把两种方法结合起来,构建两者的映射数组,进行棋子移动的时候 根据该数组进行棋盘数组和棋子数组很少的调整,以达到同时容纳棋盘数组方式 和按棋子数组的方式对数据进行快速的访问。 建立棋盘映射到棋子列 表的数组: 如果棋盘中莱点含有棋 子,则相应记录该棋子 位于棋子数组中的序 号。 图2 3 2 2 优化的快速数据结构( b i t f i l e ,b i t r a n k ) 实现 要提高一个象棋软件的对弈水平,在不修改评价函数的前提下可以这样认 为,就是咀在搜索相同的深度里耗费的时间最少作为目标,搜索的深度越深,能 发现一些微妙情况的概率就越大。而要提高这个速度,有两种方法,一是优秀的 矛黔l 一 电脑象棋的设计与实现中山大学硕士论文2 0 0 4 效率更高的搜索算法( 这将在本文其他章= 常讨论) ,二是提高单位时间内搜索的 结点数目。采用好的数据表示方法,能达到计算的快速实现,基于这个道理,本 人建立了一个新的数据结构表示方法- b i t f i i e ,b i h r a n k 来实现运算的加速,就 是对棋盘的每一行,每一列,以b i t0 或者1 来记录该点上是否有棋子,这样的 话每一行、每一列都有一个编码值。其中是2 9 = 5 1 2 的编码空间,列是2 n 1 0 = 1 0 2 4 的编码空间。这样在大量的直线车炮评价、将军判断、步法生成的时候,就不用 对其所在行进行一次遍历( 这样的遍历需要对该行每一个坐标分别遍历,最多达 8 + 9 = 1 7 次) ,只需获得当前的b i t f i l e ,b i t r a n k 的编码值,并在搜索前预算计算 对应编码值的特征估价值,通过查表立刻可得。 2 2 1 预计算以及延展递增计算的数学模型 在数学上,评价函数是对一个盘面定性的静态评价,其计算方法为: e v a l u a t i o n s c o r e = k ;f ( 一 其中k 。为特征系数,f i ( p ) 为特征函数,p 为当前棋盘。 对于特征函数f i ( p ) 的计算,实际上只需要棋盘p 的局部数据。所以,f i ( p ) 司- 简 化为 f ( p ) = z ( x ,z :,“,坼) ,其中x i , x 2 x k 为局部数据,一般指可直接得到的 原子数据。 如果存在函数r 使 九( y 。,y :,y 。) = z ( x 。,x 2 ,h ) ,其中y 。= g ,( p ) ,满足条件: ( 1 ) y i 的分布范围比较狭小,同时r l 的值也较少 ( 2 ) 搜索扩展的时候,y i 的值在棋盘p 变更的时候,仅需作计算量较少的维护, 便可以得出新棋盘的y 。值。也就是说,对于树的中间结点p 1 ,通过着法 移动生成结点p 2 ,由于一步着法产生的棋盘变化比较少。所以,可以快 速地根据y 胛) ,以及移动产生的少量变化,直接计算出y d p 2 ) ,而不需要 完全重新计算出y i ( p 2 ) 。 那么的话,我们就可以建立延展递增的方法,来计算f i ( p ) 。 电脑缘棋的设训与实现中山大学硕士玲文2 0 0 4 计算方法 ( 1 ) ( 2 ) ( 3 ) 首先在搜索前,预先计算出对于所有可能出现的( y 1 y :一y 。) 集合,对应 厂,( 兄,y 2 ,y 。) 的值,存储在p a t t e r n y i y 2 【y n 】中,设y i 的定义域长 度函数为d e f l e n ( ) ,则所需的内存空间为:d e f l e n ( y 1 ) 4d e f l e n ( y 2 ) 4 d e t l e n ( y 。) 4s i z e o f ( i n t ) 然后在树扩展的时候,对中间结点进行递增改变y ,。根据着法( 棋盘p 1 专p 2 ) 产生的少量数据变化,从y d p l ) 计算y i ( p z ) 。 叶子结点的f i ( p ) 计算,仅需查表获取p a t t e m y t y z 一 y 。】的值。 计算耗费及评价: 原来的f i ( p ) 计算是在叶子结点中进行,根据当前棋盘计算f i ( p ) ,对于整颗 搜索树来说,其时间耗费约为: t l = 时子结点数e f 玲的计算的耗费 延展递增的计算方法是在搜索树延展的时候,通过递增改变的计算方式,减 轻在叶子端点的计算耗费。其时间耗费约为: 1 2 = p a t t e r n y d l y d 心矗的预计算时闽结点扩袋次数+ 递增改变的数 据维护计算七叶子结点数目t 查表获取p a t t e r n 值的时阃耗费 其额外的空间耗费,主要为模式预计算结果的保存空间: o e f l e n ( y z ) + d e f l e n ( y z ) 。d e f l e n ( y 。) s i z e o f ( i n t ) 比较t l 与t 2 的计算公式,由于p a t t e r n y l 】【y 2 卜【y 。】的预计算时间是一个定 值,不随搜索树的增大而变化,并且一般计算量比较少,其计算时间几乎可以忽 略;另外查表获取p a t t e r n 值的时间耗费,只是一次性访问内存所需时间,其计 算时间也可咀忽略。而对于电脑象棋的搜索树来说,结点扩展次数仅比叶子结点 数略多,所以当递增改变的数据维护耗费比较远远少于直接计算特征函数f ( p ) 的时候,t , 一b e t a ,这时我们可以立刻进行b e t a 剪 枝,相反如果结果f a i ll o w ,则说明结果不可能大于b e t a ,也就说无法剪枝,那 么我们刚才用 b e t a 一1 ,b e t a 的m i n i m a lw i n d o w 就无法得到真实结果,所以我们必 须重新用【a l p h a b e t a 进行搜索。虽然当无法b e t ac u t 需要重新搜索的时候,实 际比原来多出了m i n i m a lw i n d o w b e t a 1 ,b e t a 】的搜索过程,但是由于m i n i m a l w i n d o w 内的子树产生剪枝的概率比较大,所以实际增加的搜索结点数相对比较 电肭象棋的设计与实现 中山人学硕士沦文2 0 0 4 少,同时当我们后面章节所提到的m o v eo r d e r i n g 比较好的时候,火部分结点能 够产生b e t a 剪枝的概率相当大,这样我们就可以避免更繁重的全a l p h a 、b e t a 窗口搜索。 在泶用m i n i m a lw i n d o w 的n e g a s c o u t 算法中,每次递归扩展的时候,第一 个节点用正常的a l p h a - b e t a 窗口扩展,而后面的都用m i n i m a l w i n d o w 进行扩展, 这样的话如果最优的孩子结点最先扩展,则此后的其他孩子结点通过甜p h a 值对 应的m i n i m a lw i n d o w 进行搜索都可以轻松剪枝,并且由于采用了m i n i m a l w i n d o w ,a l p h a b e t a 窗口缩到最小,剪枝也更容易,搜索节点也更少,反之, 如果发现该扩展结点使用m i n i m a lw i n d o w 不产生剪枝( 即值小于b e t a ) ,且值 仍大于a 1 p h a ,我们才用正常的a i 【p h a - b e t a 窗口进行再搜索( r e s e a r c h ) 。 1 4 一一 皇堕墨燮塑堡兰皇窒垫! 些叁鲎型! 主堡苎! ! 塑 3 2 1n e g a s c o u t 算法性能测试 使用a l p h ab e t a 算法和使用n e g a s c o u t 算法的搜索结点数比较( 测试数据集为5 0 个中局盘面) : 表3 - 3 a l p h a b e t a n e g a s e o u t 1 i 搜索深度结点数 结点数结点数( ) f 1 2 9 2 9 2 2 9 1 1 5 一o 6 0 电脑象棋的设计与实现中i 大学硕:l 论文2 0 0 4 2 6 9 ,1 1 76 8 ,2 7 4 12 2 31 9 9 ,8 6 42 0 2 、5 3 5 1 3 4 4 1 ,1 1 2 ,8 6 61 ,0 31 ,4 4 8 7 3 2 5 3 ,7 6 8 ,0 2 33 ,6 9 6 ,3 9 3 19 0 615 ,6 0 4 ,3 5 6 1 4 ,0 8 9 ,8 15 9 7 1 7 4 9 ,4 9 4 ,2 3 34 5 ,1 3 4 ,3 5 0 88 1 818 4 3 7 4 ,4 8 5 1 6 4 ,7 8 6 ,1 4 7 1 06 2 n e g a s c o u t 算法能减少1 0 左右的搜索节点数。 3 3 宁静搜索( q u i e s c e n c es e a r c h ) 一般a l p h a - b e t a 搜索用固定的深度进行搜索,这样就产生了水平效应,譬 如搜索深度为9 ,它就无法看到第1 0 层后发生的事情,即使第1 0 层会失去一车。 所以为了尽量地减少这种水平效应,我们可以采用对a l p h a b e t a 搜索树的叶子 结, 点( d e p t h = 0 ) p _ lf 的一些有兴趣的路径继续搜索,直到局面达到平静为止,这 样对一些比较混乱的局面能有个较精确的估计。 在象棋中,在搜索树叶子之j 二的一层结点( 即深度为1 的结点) ,如果不会 有任何延伸的话,那么进行吃予将会立刻得到分数上的提升,不管对方是否有保 护和能否回吃。因为它走完这一步之后,深度已经变为0 ,也就是不会继续搜索 对方的棋步了,所以对方在“搜索逻辑上”无法回吃。这造成分数起伏很大,并 无法准确体现局面的正确评价值。 所以我们应该对深度为0 的叶子结点以下的所有吃子进行延伸,但是当认为 不需要吃子的时候,可以选择不走棋( 吃子) ,这时候将结束宁静搜索的继续搜 卖。 一 皇堕塾曼塑堡生皇壅塑! 生查堂堡兰! 笙苎兰! 塑 图3 - 2q u i e s c e n c es e a r c h 示意图 1 7 电脑象棋的设计与实现中山大学硕,l 论文2 0 0 4 3 4t r a n s p o s i t i o nt a b l e 在一颞搜索树中,不少结点之问虽然是经过不同的路径到达的,但其状态是 完全一致的。通过建立t r a n s p o s i t i o nt a b l e 保存已搜索结点的信息,那么再次遇 到相同状态的结点时便可以套用之前的搜索结果。在t r a n s p o s i t i o nt a b l e 中,记 录的信息为最优着法、分值、深度,为了快速检测当前结点是否已经搜索过,我 们一般对当前状态进行编码,然后利用h a s h 表的方式进行查找,这里采用的编 码方式是z o b r i s th a s h 方法。 z o b r i s th a s h 方法:在搜索之前,生成大随机数( 6 4 位) 数组z b 棋盘坐标】【棋子 类型】与代表走棋方的随机数m o v e s i d e h a s h 。然后当前棋盘的h a s h 值便是棋盘 上所有存在棋子的坐标上对应z b s l p 1 的异或之和。这样产生移动后,并不需要 重新计算棋盘的h a s h 值,只需将当前h a s h 值 ( i ) 异或移动棋子原坐标对应z b 值 f 2 ) 异或移动棋子新坐标对应z b 值 ( 3 ) 如果产生吃子的话,需要异或被吃子在其对应坐标的z b 值 ( 4 ) 异或m o v e s i d e h a s h ,表示改变待走棋一方的颜色。 这是根据两次异或同一个数结果保持不变的原理,避免重新计算整个棋盘的 h a s h 值,并且位的异或在计算机内部运算中速度较快。 t r a n s p o s i t i o nt a b l e 是一种空间换取时问的思想,由于实际物理内存空间有 限,所以对存储入t r a n s p o s i t i o nt a b l e 的点会有所限制,在z m b l 中,q u i e s c e n c e s e a r c h 的节点不存入t r a n s p o s i t i o nt a b l e 。并且为了尽量提高t r a n s p o s i t m nt a b l e 的效率,根据结点深度、访问的局部性理思想,确定存储替换算法。 t r a n s p o s i t i o nt a b l e 结合a l p h a b e t a 搜索:在a l p h ab e t a 搜索的过程中,一个 结点会出现以下三种情况之一:( 1 ) f a i lh i g h ,结点值至少 = b e t a ,但不知道其 具体值。( 2 ) f a i ll o w ,结点值至多 = a l p h a ,但不知道具体值。( 3 ) e x a c t ,a l p h a 一 结点分值 = b e t a ,此值为准确值。一般只有e x a c t 类型,才可作为当前结点的 准确值存入t r a n s p o s i t i o nt a b t e ,但f a i lh i g h ( = a l p h a ) 所对应 的边界值仍可帮助我们作进一步的剪枝,所以我们在t r a n s p o s i t i o nt a b l e 用字段 e n t r y _ t y p e 表示类型,其中e x a c t 类型为准确值,其余的则表示值的范围。 在搜索过程中,首先检查t r a n s p o s i t i o nt a b l e 中保存的结果能否直接代表当前结 结的值或使当前结点产生a l p h a 、b e t a 剪枝,不能的话则继续进行该结点的搜索。 1 8 电腩魏棋的没计与实现中山人学硕士论文2 0 0 4 t r a n s p o s i t i o nt a b l e 结合搜索的伪代码 i n tn e s a s c o u t ( i n t a l p h a ,h a tb e t a ,h a td e p t h ) i f ( g a m e o v e r o r d e p t h 2b e t a ) b e t ac u t ( n 插入t r a n s p o s i t i o nt a b l e i n s e r t t t ( h a s h v a l u e , v a l , l o w e r b o u n d , d e p t h ,b e s t m o v e ) r e t u r nv a l ; ) a l p h a = v a l ; n 插入t r a n s p o s i t i o nt a b l e 强io l da l p h a a t p h a ) l n s e r t h a s h ( h a s h v a l u e , a l p h a , u p p e r b o u n d , d e p t h , b e s t m o v e ) ; e l s e i n s e r t h a s h ( h a s h v a l u e , a l p h a ,e x a c t , d e p t h ,b e s t m o v e ) ; r e t u r n a l p h a ; 表3 - 5 使用t r a n s p o s i t i o nt a b l e 的伪代码( 加粗倾斜部分) 3 4 1t r a n s p o s i t i o nt a b l e 的作用 ( 1 ) 如果在t r a n s p o s i t i o nt a b l e 访问中能直接得到结果的话,则可以避免该结点以 下子树的搜索,减少了搜索对间。 ( 2 ) 如果在t r a n s p o s i t i o n t a b l e 中能查找到当前结点信息,并且存储深度比当前结 点大,那么实际上是增加了当前子树的搜索深度,也即增加了结果的准确性。 ( 3 ) 结合i t e r a t i v ed e e p e n i n g ,也即在逐层深入的搜索中,获取本结点之前的最优 步,作为第一个儿子结点进行扩展,有效地提高m o v eo r d e r i n g ,减少搜索结 点数,这部分将会在以下章节中进行详细论述。 3 4 2t r a n s p o s i t i o n t a b l e 的存储替换算法 z m b l 的t r a n s p o s i t i o nt a b l e 采用的是双层存储方式,其替换算法如下: ( 1 ) 如果待置入结点的深度大于等于t r a n s p o s i t i o nt a b l e 第l 层结点存储的深度, 将当前第1 层存储内容移至第2 层,第1 层存储写入待置入结点信息 ( 2 ) 如果待置入结点的深度小于t r a n s p o s i t i o nt a b l e 第l 层结点存储的深度,将待 置入结点信息写入第2 层存储中。 电脑象棋的设计与实现 中山大学硕卜硷文2 0 0 4 基于原理;首先是深度优先,因为深度越大,一般来说其子树的结点数越多,更 容易显示t r a n s p o s i t i o nt a b l e 的优势,减少搜索结点数;其次足局部性原理,如 果当前结点深度小于第1 层存储单元的深度,则无条件把当前结点信息写入第2 层存储单元,因为最近访问的内容往往在不远的将来会被再次被访问。 i n d e x :n i n d e x :n * h a s h k e y l d e p t h i ,一、h a s h k e y 0 ,d e p t h o , s c o r e l ,b e s t m o v e l ,s c o r e 0 ,b e s t m o v e 0 , e n t l y t y p e i j e n t r y t y p e 0 。 寸、 引, 剥。d ,= e p t h 0 = f v i n d e x :n + li n d e x :n 十i 皤孺髓露西藏霞蒯 h a s h k c y 2 ,d e p t h 2 ,h a s h k e y i ,d e p t h l , s c o r e 2 ,b e s t m 0 v e 2 ,s e o r e l ,b e s t m o v e l , n o d c e n l a y t y p e 2e a t r y t y p e l i h a s h k e y 0 ,d e p t h o ,l h a s h k e y 0 、it h s c o r e o ,b e s t m o v e 0 ,j 映射到n 朗 e n l d y t y p e o、t 划一o o = o i n d e x :n i n d e x :n h a s h k e y l ,d 印t h j ,h a s h k e y l ,t ) e p t h l , s c o r e l ,b s 洲o v e l , s e o r e l ,b e m o v e i , e n t r y t y p e le n t y t y l * l o墨y强魏溢疆越誊登猛ig蜀、, i n d e x :n + li n d e x ! n + l h 口h k e y 2 ,d e p t h 2 ,h a s h k , y o ,d e p t h o , s c o r e 2 ,b e s t m o v e 2 ,s c o r e 0 ,b c :s t m o v e o , e n l r y t y p e 2e n t r y t y p e o 图3 - 3 双层t t 替换算法示意图 3 4 3t r a n s p o s i t i o nt a b l e 性能测试 使用2 4 m 的t r a n s p o s i t i o nt a b l e ( 2 0 9 7 1 5 2 个单元) 和不使用t r a n s p o s i t i o nt a b l e 的搜索结点数比较( 测试数据集为5 0 个中局盘面) : 表3 - 6 不使用t r a n s p o s i t i o n使用t r a n s p o s i t i o n t a b l e 玑出l e j 搜索深度结点数结点数 a 结点鹫跹) i 1 2 9 ,1 1 5 2 9 1 1 5 o 2 6 8 ,6 0 16 8 ,2 7 4 0 4 8 i 3 2 2 2 ,5 5 72 0 2 、5 3 5 9 o o f 乜脑象棋的设计与实现中山大学硕士沦文2 0 0 4 4 1 ,1 7 5 ,7 0 2 1 ,0 3 l ,4 4 8 1 22 7 9 6 5 4 ,6 4 4 ,7 8 03 ,6 9 6 ,3 9 3 2 04 2 6 2 0 ,3 2 5 ,1 1 61 4 ,0 8 9 ,8 1 5 3 06 8 7 7 7 ,3 6 9 ,2 2 1 4 5 ,1 3 4 ,3 5 0 4 16 6 8 3 2 8 ,4 7 7 ,0 4 1 1 6 4 ,7 8 6 ,1 4 7 4 98 3 从表中我们可以看出,t r a n s p o s i t i o nt a b l e 能大大减少搜索的结点数,特别随着 搜索深度的增加,t r a n s p o s i t i o nt a b l e 所起的效用增大。 3 5 叠代加深( i t e r a t i v ed e e p e n i n g ) i t e r a t i v ed e e p e n i n g 是先进行深度为1 的搜索,在进行深度为2 的搜索,如此 类推,先n 层搜索,然后n + 1 层搜索,直到搜索分配的时间耗尽。这样的优点 是,通过上面的t r a n s p o s i t i o nt a b l e 的辅助,我们可以记录结点的当前最优孩子, 到深度d e p t h + 1 的时候,就可以先搜索深度d e p t h 的最优孩子,因为深度d e p t h 的最优孩子往往也是深度d e p t l l + 1 的最优孩子或者是个较优的估计,这样的话, 产生剪枝的机会就更大,搜索的节点大大地减少。并且由于每增加一层搜索深度, 其以指数时间增加,相对来说,深度为d e p t h 的搜索树节点数相对d e p t h t l 的搜 索树节点数几乎可以忽略。另外,一般比赛都有限时要求,如果直接搜索n 层 的话,有可能没搜索完成而无法找到自己的最佳应步,但通过i t e r a t i v e d e e p e n i n g , 至少保证在用时耗尽的时候能得到某一搜索深度的最佳应步值,满足搜索要求。 3 5 1l t e r a t i v ed e e p e n i n g 的性能测试 使用i t e r a t i v ed e e p e n i n g 和不使用i t e r a t i v ed e e p e n i n g 的搜索结点数比较( 测试数 据集为5 0 个中局盘面1 : 表3 7 不使用i t e r a t i v e使用i t e r a t i v ed e e p e n i n g d e e p e n i n g 搜索深度结点数结点数结点数( ) 12 9 1 1 52 9 1 1 5 o 2 6 4 ,3 6 1 6 8 ,2 7 4 60 8 32 1 0 、5 4 9 2 0 2 ,5 3 5 38 l 4 1 ,0 9 2 ,8 4 31 ,0 3 1 ,4 4 8 56 2 电脑象棋的畦计与实现 中山大学硕士论文2 0 0 4 53 ,9 6 4 ,3 0 03 ,6 9 6 ,3 9 3 6 7 6 61 8 , 3 1 8 3 9 81 4 ,0 8 9 ,8 1 5 2 30 8 76 1 ,7 5 1 ,6 4 44 5 ,1 3 4 ,3 5 0 2 69 1 8 2 1 9 ,0 5 9 ,6 9 01 6 4 ,7 8 6 ,1 4 7 2 47 8 3 6 启发函数( m o v eo r d e r i n g ) 在搜索m i n i m a x 数的时候,要提高搜索的效率,就意味着要尽量使构建的搜索 树结点数更小。在宏观上数量的角度来看,这个“更小”是指构建搜索树的时候 所访问的结点数目尽量地少,而在微观角度上来看,除了主路径( p r i n c i p a l v a r i a t i o n ,也即搜索树的解路径) 外,就是要求每个结点访问的时候,在访问少量 予结点为根结点的子树后,便发生b e t a 剪枝,为了最大地提高搜索效率,我们 在搜索中往往考虑的是访问第一个子结点所在子树后,立刻产生b e t a 剪枝的概 率,这个第一孩子b e t a 剪技概率同时也可以怍为衡量m o v eo r d e r i n g 的一个标准。 袁3 - 8 l启发函数效率衡量 l 宏观上( 从数量上)微观( 从结点搜索的角度看) 搜索树的结点数多少,相同的搜索深度,所从整颗树来看,首孩子结点b e t a 剪技的概率 i 需搜索结点数越少越好 在启发式搜索中,通常我们在每个非叶子结点的搜索中,均通过一个启发式函数, 计算所有子结点中应该谁先搜索、谁后搜索,在m i n i m a x 树搜索我们通常称这 种启发式方法为m o v eo r d e r i n g ,意味着子结点扩展的先后顺序。对于m o v e o r d e r i n g 所含的启发式信息,我们通常包括静态的启发信息和动态的启发信息。 3 6 1 静态启发信息 静态的启发信息:顾名思义,在搜索过程中是静态的,不会因搜索过程的变化而 改变,这些信息般是与研究对象领域相关的信息。譬如在象棋中,主要就是吃 子,这是因为在搜索树内部,一个结点所代表盘面如果- 般有4 2 种走棋步,往 往一半步以上会打乱原来子力之间联系保护的平衡,对于这些会丢失保护造成失 子的情况,子结点首先通过检测吃子来寻找最好步往往具有优异性,当然一般只 有有利的吃子才是有效的,要尽量搜索“有利”的吃子,可采用几种方法,包括: 电脑象棋的设计与实现中山大学硕士硷文2 0 0 4 ( 1 ) ( 被吃棋子的值一吃子的棋子的值) 作为排序根据,因为分值小的棋子捕吃分 值大的棋子,即使会被回吃,交换巾也能获得利益,并且从概率来说,被吃子棋 子越大,产生的分值增加的幅度以及概率也越大。其优点是计算耗费少,但缺点 是计算欠缺准确性,这是因为分值大的棋子捕吃分值小的棋子的时候,往往会因 对方回吃而造成在子力交换中损失利益。 ( 2 ) 交换静态评估( s t a t i ce x c h a n g ee v l u a t i o n ) ,通过建谚所有棋子对被吃子所在点 的攻击或者保护关系,按照最大最小过程,评估交换所带来的利益。其优点是计 算准确度较高,但缺点是要计算过程耗费比较大。 3 6 2 动态启发信息 动态启发信息,顾名思义,是动态的,它跟搜索的过程以及当前状态密切相关。 在树搜索的过程中,其实也是一个信息积累的过程。利用这些信息进行挖掘,便 可以得到我们所需要的启发信息。 定义:好孩子,即最优孩子或者能够产生b e t ac u t 的孩子。 3 6 2 1h a s hm o v e 若本结点曾搜索过并在t r a n s p o s i t i o n 记录下以前搜索时的好孩子,往往该好孩子 仍然是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论