- 中国象棋程序设计探索
-
- 2005年6月初稿,2007年5月修订
-
- (七) 开局库
-
- 在阅读本章前,建议读者先阅读象棋百科全书网中《对弈程序基本技术》专题的以下几篇译文:
- (1) 其他策略——开局库(Martin Fierz)。
-
- 7.1 象棋程序对开局库的处理
-
- 开局库是象棋程序中知识含量最多的部分,各种程序的棋力会因为开局库的不同而有所差距。互联网上介绍国际象棋开局库的文章很多,而中国象棋开局库的原理和国际象棋是完全一样的,因此笔者就不作太多的介绍了。
- 很多国际象棋的程序中,开局库并不被引擎处理,而是由界面来完成的,棋局进入中局脱离棋谱后,才让引擎作搜索。ChessBase的系列软件Junior和Fritz,以及支持UCI协议的Shredder,都使用这种工作方式,由于它们使用同一套ChessBase的界面,因此开局库格式是统一的。由于WinBoard本身并不能处理开局库,因此支持WinBoard的引擎都具有处理开局库的能力,而且每个引擎都有各自的开局库格式。
- 而中国象棋目前没有统一的界面,因此也没有统一的开局库格式,开局库一般由引擎来处理,各种引擎有各自定义的开局库格式。
- ElephantEye早期开局库具有非常明显的特点——它是文本格式的,每一行记录一个着法,依次是着法(红色部分)、权重(绿色部分)和局面(紫色部分):
-
- b2e2 5895
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR
w - - 0 1
-
- 由于记录局面时使用FEN串,这就增加了开局库的可读性,但同时使开局库变得特别庞大,ElephantEye的开局库(BOOK.DAT)仅有20,000多个着法却达到了1.6M。
- 从ElephantEye 2.0以后,每个局面仅占用8字节(4字节的Zobrist键值、2字节的着法和2字节的权重),而且对称局面作了合并,因此由10,000多个着法组成的开局库大小不超过100K。
-
- 7.2 开局库的制作
-
- ElephantEye现有的开局库是从象棋百科全书网上收录的8000多局对局中整理出来的,这些对局涵盖了1990年到2004年的全国顶级象棋比赛(团体赛、个人赛、甲级联赛和五羊杯),因此具有代表性。现在简要介绍一下开局库的制作流程:
- (1) 把所有的对局中的每个着法解析出来,记录到临时文件中,临时文件的每个着法记录占16字节(8字节的Zobrist键值、4字节的着法和2字节的权重);
- (2) 对临时文件的着法记录按Zobrist键值(第一关键字)和着法(第二关键字)排序;
- (3) Zobrist键值和着法作关键字,对权重进行叠加;
- (4) 按照笔者观点,权重
= 胜局数 ×3 + 和棋局数 - 负局数,因此在第(1)步中,导致胜局的着法的权重置3,和局置1,负局置-1;
- (5) 过滤掉权重小于4的着法(即收入开局库的着法至少是一胜一和的),把Zobrist键值的后4字节、2字节表示的着法和权重除以4的16位整数值记录到开局库文件(BOOK.DAT)中。
-
- 7.3 开局着法的选择
-
- 象棋程序在处理一个局面时,首先要从开局库中寻找是否有相同的局面,当开局库中找不到局面时,才会调用搜索程序进行思考。ElephantEye从开局库中找到着法的过程如下:
- (1) 由于开局库是按Zobrist键值排序的,因此用二分查找法可以很快找到所有符合的局面及其着法;
- (2) 如果当前局面在开局库中没有,那么查找对称局面,找到的着法也要作对称处理;
- (3) 由于开局库中的Zobrist键值只有4字节,因此有可能产生冲突,必须从着法列表中排除不合理着法;
- (4) 用随机数根据着法的权重选择着法;
- (5) 如果该着法没有构成重复局面,那么将该着法作为最佳着法直接返回。
上一篇 中国象棋程序设计探索(六):并行搜索技术探索
下一篇 中国象棋程序设计探索(八):后台思考和时间策略
返 回 象棋百科全书——电脑象棋