文档介绍:中国象棋算法
LT
解剖大象的眼睛——中国象棋程序设计探索
黄晨 * 2005年6月
( * 联系地址:复旦大学化学系表面化学实验室,eMail:morning_******@elephantbas
)
(一) 引言
我在今年2月写出了象棋程序ElephantEye的第一个版本(),本来它只是象棋界
面ElephantBoard的调试引擎。在设计程序的过程中,我尝试性地加入了很多算法,发现
每次改进都能让程序的棋力有大幅度的提高,因此便对象棋程序的算法产生了浓厚的兴
趣。到现在我已经陆续对ElephantEye作了几十次加工(),使得它的棋力
接近了中等商业软件的水平,在公开源代码的象棋程序中,ElephantEye是最强的一个。
我希望能通过公开源代码的方式,推动中的整体发展,然而根据很
多网友的反馈意见,发现源代码中的很多部分并不是那么容易理解的。因此我才打算以
《中国象棋程序设计探索》为题,写几篇详细介绍ElephantEye算法的连载,希望能让的
源代码充分发挥它的作用。
下面我先简要谈一下我自己对ElephantEye的体会。
ElephantEye用到了哪些算法?
在我写本次连载以前,我已经完成了《象棋百科全书》网站上《对弈程序基本技术
》专题中所有文章的翻译,ElephantEye的大部分算法都参考了这些文章,这些算法我会
在连载中一笔带过,详细的内容希望读者参考这些译文,那里还有我加的很多译注,希
望它们能够加深读者对这些算法的体会。
当然,仅根据这些文章所提供的算法,是写不出很好的程序的,我参考了王小春的
可以对每步都限定时间,也可以是比赛所采用的时段制或加时制,而不能以同样的搜索
水平作标准。另外,如果两个程序运行在同一台电脑上,那么不能启用后台思考功能。
(2) 某几盘对局并不能说明问题,我以“浅红象棋”为平台用ElephantEye对阵“梦
入神蛋”,ElephantEye遗憾地以2:3败北。我有充分的信心表明ElephantEye的棋力比梦
入神蛋强得多,因为两者用了相同的评价函数,但同样时间ElephantEye通常要比梦入神
蛋多搜索一层以上,那么2:3的比分又能说明什么问题呢?
(3) 跟人类比和跟电脑比是两回事,每个电脑程序都有弱点,这些弱点很容易被人
类棋手抓住,但其他电脑程序则不会抓住你的弱点。一般认为,知识缺乏的程序弱点也
多(例如ElephantEye不懂得防守空头炮),因此对阵人类棋手失败的几率要比对阵其他程
序高得多。
ElephantEye对象棋有哪些认识?
要说ElephantEye一点象棋知识都不具备,这种观点我是无法接受的。很多搜索算法
确实只能用在象棋上,这一点ElephantEye做得比很多商业程序都好,这些算法体现在以
下几个方面:
(1) 杀棋局面在置换表中的特殊处理,这使得ElephantEye识别杀棋的速度快了很多
;
(2) 将军扩展,这使得ElephantEye对可能有杀棋的线路特别感兴趣,它会在搜索上
增加对这些路线的投入;
(3) 带检验的适应性空着裁剪,这个算法首先由一个以色列学者发表于2002年(不是
“适应性”的),最近我对该算法作了改进,使得它能正确处理残局中的等着杀和连等着
杀,速度也快了很多。
这些算法使得ElephantEye有很强的处理杀局和残局的能力,我相信绝大多数商业软
件都没它做得好。如果一个程序能在很短的时间内告诉你,几步之后必定有一方会被将
死,或者几步之后优势一方就可以破士或破象,那么这个程序的实用价值还算小吗?
(二) 棋盘结构和着法生成器
在阅读本章前,建议读者先阅读《象棋百科全书》网站中《对弈程序基本技术》专题的以下几篇译文:
(1) 数据结构——简介(David Eppstein);
(2) 数据结构——位棋盘(James Swafford);
(3) 数据结构——旋转的位棋盘(James Swafford);
(4) 数据结构——着法生成器(James Swafford);
(5) 数据结构——0x88着法产生方法(Bruce Moreland);
(6) 数据结构——Zobrist键值(Bruce Moreland);
(7) 其他策略——重复检测(Bruce Morela