A. 马捉车或有根的炮兵(卒);
B. 车捉有根的马炮兵(卒);
C. 炮捉车或有根的马兵(卒)。
尽管 ElephantEye 在复杂的情况可能无法正确识别长打,但由于支持UCCI命令 banmoves ... ,一旦用户认为引擎走了“长打”的禁着,可以用《象棋巫师》的“设置禁着”功能让引擎强制变着。
五、博弈
算法
ElephantEye 属于偏向蛮力的象棋程序,使用了严谨而有效的博弈
算法:
(1) 使用位行和位列的着法生成器:
位行(BitRanks)和位列(BitFiles)有利于滑动棋子(车和炮)的着法(尤其是吃子着法)生成,位行和位列可以用查表来代替在射线上做的循环运算。在ElephantEye 中,位行和位列的技术不仅用在着法生成器中,也用到了牵制的判断上。
(2)
静态局面搜索:
在做
静态搜索时,ElephantEye 搜索了吃子或解将的着法,在搜索吃子着法时,ElephantEye 过滤掉不重要的吃子,例如吃不过河的兵、吃不处于防守中的士象等着法,都不在
静态搜索的范围之内。
(3) 循环着法和长将检测:
ElephantEye 可以识别循环着法,出现循环着法时可以判断哪方为长将,并且会利用禁止长将的规则来谋求优势,但目前 ElephantEye 还无法识别长捉。
(4) 置换表:
ElephantEye 参考了中国象棋程序“纵马奔流”的设计思路,使用深度优先和始终覆盖的双层置换表,并采用低出(高出)边界修正的置换表更新策略。
(5) 带检验的空着裁剪:
ElephantEye 使用 R=2 的空着裁剪,在残局阶段使用带检验的空着裁剪。
(6) 迭代加深/吃子着法/杀手着法/历史表启发:
ElephantEye 的着法排序非常简单清晰,依次是迭代加深着法、好的吃子着法、杀手着法和按历史表排序的生成着法。
(7) 将军/唯一应将延伸:
在选择性延伸上,ElephantEye 采用了将军和唯一应将延伸。
(8) Alpha-Beta主要变例搜索:
ElephantEye 使用传统意义上的递归式Alpha-Beta主要变例搜索。
(9) 开局库:
ElephantEye 的开局库共包含了10,000个对称着法,是从1990年到2005年全国象棋个人赛、团体赛、五羊杯、联赛等8,000局顶尖比赛中提取的。
(10) 后台思考和时间分配策略:
ElephantEye 支持后台思考功能,同时提供了时段制和加时制两种时间分配策略,会自动合理分配时间。
六、开局库
ElephantEye 的开局库可由“ElephantEye 开局库制作工具”制作。运行制作工具后,首先要选择PGN棋谱所在的文件夹,然后保存为开局库文件(通常是 BOOK.DAT)。通常,用来生成开局库的棋谱数量越多,生成的开局库文件就越大。
为了使制作的开局库对 ElephantEye 生效,只需要把生成的开局库文件替换掉 ElephantEye 目录下的 BOOK.DAT 即可,也可以在《象棋巫师》的“引擎设置”对话框中指定开局库文件。
七、局面评价函数库
ElephantEye 从2.1版开始,程序的搜索部分和局面评价部分就分离了,搜索部分通过调用API函数的形式与局面评价部分耦合。
其他象棋程序设计师可以在 ElephantEye 的基础上更自由地发挥。根据LGPL协议,搜索和局面评价这两个部分都作为独立的程序库,运用其中任何一部分都只需要公开该部分的源程序即可。换句话说,如果局面评价部分没有使用任何开放代码,那么程序设计师就没有义务公开这部分的源程序,搜索部分也是如此。
ElephantEye 的局面评价API函数接口定义如下:
A. 局面评价引擎名称:const char *GetEngineName(void);
B. 局面预评价函数接口:void PreEvaluate(PositionStruct *lppos, PreEvalStruct *lpPreEval);
C. 局面评价函数接口:int Evaluate(const PositionStruct *lppos, int vlAlpha, int vlBeta);
其中 PositionStruct 和 PreEvalStruct 必须分别符合 position.h 和 pregen.h 中定义的结构。
八、源程序
ElephantEye 的源程序包括9个模块,内容大致为:
(1) ucci.h/ucci.cpp
UCCI命令解释模块,包括 Windows 和 Unix 下的行输入接收程序;
上一页下一页