棋谱控

中国象棋电脑应用规范(四) 中国象棋通用引擎协议
更新时间:2012-12-4、浏览次数:

 
五、指令和反馈
 
  按照惯例,指令用红色表示,反馈用蓝色表示。
 
1. ucci
  引导状态的指令。这是引擎启动后,界面需要给引擎发送的第一条指令,通知引擎现在使用的协议是UCCI
 
2. id {name | copyright | author | user} <信息>
  引导状态的反馈。显示引擎的版本号、版权、作者和授权用户,例如:
id name ElephantEye 1.6 Beta,说明引擎的版本号是ElephantEye 1.6 Beta
id copyright 2004-2006 www.xqbase.com,说明引擎的版权属于www.xqbase.com所有;
id author Morning Yellow,说明引擎的作者是Morning Yellow
id user ElephantEye Test Team,说明引擎授权给用户ElephantEye Test Team使用。
 
3. option <选项> type <类型> [min <最小值>] [max <最大值>] [var <可选项> [var <可选项> [...]]] [default <默认值>]
  引导状态的反馈。显示引擎所支持的选项,<option>指选项的名称(后面会介绍),选项的类型是label(标签,非选项)button(指令)check(是或非)combo(多选项)spin(整数)string(字符串)中的一种。
  通常的UCCI引擎支持以下选项:
  (1) usemillisec(check),通知界面采用毫秒模式。建议引擎始终采用毫秒模式(go指令的时间单位是“毫秒”),并总是在ucciok前输出option usemillisec ... 的反馈信息。除非引擎不发送 option usemillisec ... 的反馈信息,否则界面将自动使用毫秒模式,并向引擎发送 setoption usemillisec true 的指令。目前已知的UCCI界面程序(如象棋巫师、UCCI引擎联赛模拟器等)都采用这种做法;
  (2) batch(check),批处理模式(前面介绍过),默认是关闭的;
  (3) debug(check),调试模式,默认是关闭的,打开后引擎会输出更多的信息(info反馈),以帮助调试;
  (4) ponder(check),是否使用后台思考的时间策略,默认是关闭的,设定该参数的目的仅仅是让引擎改变时间分配策略,而后台思考则仍然需要界面发出指令,参阅go ponderponderhit指令;
  (5) usebook(check),是否使用开局库的着法,默认是启用的,如果关闭的话,即便当前局面在开局库中有着法,引擎也会不顾开局库而思考的;
  (6) useegtb(check),是否使用残局库,默认是启用的,和usebook类似;
  (7) bookfiles(string),设定开局库文件的名称,可指定多个开局库文件,用分号“;”隔开,如不让引擎使用开局库,除了可以关闭usebook选项外,还可以把bookfiles设成空值;
  (8) egtbpaths(string),设定残局库路径的名称,和bookfiles类似;
  (9) evalapi(string),设定局面评价API函数库文件的名称,和bookfiles类似,但只能是一个文件(例如,Windows下默认值是EVALUATE.DLLLinux下默认值是libeval.so)
  (10) hashsize(spin),以MB为单位规定Hash表的大小,0表示让引擎自动分配Hash表;
  (11) threads(spin),支持多处理器并行运算(SMP)的引擎可指定线程数(即最多可运行在多少处理器上)0表示让引擎自动分配线程数;
  (12) idle(combo),设定处理器的空闲状态,通常有none(满负荷)small(高负荷)medium(中负荷)large(低符合)四种选项,引擎默认总是以满负荷状态运行的,而设置比较大的空闲状态,可以在人机对弈时留出适当的处理器资源,让用户运行其他程序;
  (13) promotion(check),是否允许仕()()升变成兵(),这是一种中国象棋的改良玩法,默认是不允许的(即默认采用常规走法)
  (14) pruning(combo),设定裁剪程度,裁剪越多则引擎的搜索速度越快,但搜索结果不准确的可能性越大,通常有none()small()medium()large()四种,一般都设为large以充分展示引擎的搜索速度,但在处理一些刁难性的排局时,用largemedium不一定能解出,可尝试smallnone
  (15) knowledge(combo),设定知识大小,通常知识量越多则程序的静态局面评价越准确,但的运算速度会变慢,该选项和pruning一样有四种设定,一般都使用large,但在解杀局时不需要静态局面评价,可以把知识量设置得小些;
  (16) randomness(combo),设定随机性系数,和pruning一样有四种设定,一般都设为none,以保证引擎走出它认为最好的着法,但为了增强走棋的趣味性,可以把这个参数调高,允许引擎走出它认为不是最好的着法,以丰富走棋的样式;
  (17) style(combo),设定下棋的风格,通常有solid(保守)normal(均衡)risky(冒进)三种;
  (18) newgame(button),设置新局或新的局面,引擎收到该指令时,可以执行导入开局库、清空Hash表等操作,UCCI界面《象棋巫师》在每次新建棋局或重新编辑局面时都会发送 setoption newgame 这条指令。
  需要注意的是,各种引擎提供的选项内容是不一样的,也并不是所有的UCCI界面支持这些选项的,例如目前的UCCI界面《象棋巫师》没有对batchdebug等选项的设置(它们只供调试时使用)
 
4. ucciok
  引导状态的反馈,此后引擎进入空闲状态。
 
5. isready
  空闲状态和思考状态的指令。检测引擎是否处于就绪状态,其反馈总是readyok,该指令仅仅用来检测引擎是否能够正常接收指令。
 
6. readyok
  空闲状态和思考状态的反馈。表明引擎处于就绪状态(可正常接收指令)
 
7. setoption <选项> [<>]
  空闲状态的指令。设置引擎参数,这些参数都应该是option反馈的参数,例如:
 
setoption usebook false,不让引擎使用开局库;
setoption selectivity large,把选择性设成最大;
setoption style risky,指定冒进的走棋风格;
setoption loadbook,初始化开局库。
 
  但是,设置option反馈没有给出的参数,并不会出错。例如UCCI界面《象棋巫师》就从不识别option反馈,而直接根据用户的设置发送setoption指令。
 
8. position {fen <FEN> | startpos} [moves <后续着法列表>]
  空闲状态的指令。设置“内置棋盘”的局面,用fen来指定FEN格式串,moves后面跟的是随后走过的着法,例如:
position fen rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1 moves h2e2 h9g7
  FEN格式串的写法参阅《中国象棋电脑应用规范()FEN文件格式》一文。
  moves选项是为了防止引擎着出长打着法而设的,UCCI界面传递局面时,通常fen选项为最后一个吃过子的局面(或开始局面),然后moves选项列出该局面到当前局面的所有着法。
  startpos表示开始局面,它等价于 fen rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1
 
9. banmoves <禁止着法列表>
  空闲状态的指令。为当前局面设置禁手,以解决引擎无法处理的长打问题。当出现长打局面时,棋手可以操控界面向引擎发出禁手指令。例如:
position fen 1r2kab1r/2c1a4/n1c1b1n2/4p2N1/p1p6/1C4P2/P1P1P4/2N1B3C/4A4/1RBAK2R1 w - - 0 1 moves h6i4 i9h9 i4h6 h9i9
banmoves h6i4
  本例取自《象棋竞赛规则(1999年版)棋例图三,由于大多数象棋引擎无法识别红方这种方式的长捉,所以在采用中国象棋协会的比赛规则时,遇到这种局面就必须给引擎发出禁手指令。下一次发送position指令后,前面设置过的禁止着法就取消了,需要重新设置禁止着法。
  目前UCCI界面《象棋巫师》不识别长打禁手,所以不会向引擎发送banmoves指令。
 
10. go [ponder | draw] <思考模式>
  空闲状态的指令,此后引擎进入思考状态。让引擎根据position指令设定的棋盘来思考,各选项为思考方式,有三种模式可供选择:
  (1) depth <深度> | infinite:限定搜索深度,infinite表示无限制思考(直到找到杀棋或用stop指令中止)。如果深度设定为0,那么引擎可以只列出当前局面静态评价的分数,并且反馈nobestmove
  (2) nodes <结点数>:限定搜索结点数。
  (3) time <时间> [movestogo <剩余步数> | increment <每步加时>] [opptime <对方时间> [oppmovestogo <对方剩余步数> | oppincrement <对方每步加时>]]:限定时间,时间单位是秒(默认)或毫秒(启用毫秒制时)movestogo适用于时段制,increment适用于加时制。opptimeoppmovestogooppincrement可以让界面把对方的用时情况告诉引擎。
  如果指定ponder选项,则引擎思考时时钟不走,直到接受到ponderhit指令后才计时,该选项用于后台思考,它只对限定时间的思考模式有效。
  指定draw选项表示向引擎提和,引擎以bestmove提供的选项作为反馈,参阅bestmove指令。
  注意:ponderdraw选项不能同时使用,如果界面向正在后台思考中的引擎求和,则使用ponderhit draw指令。

上一页  [1] [2] [3] [4] 下一页

  • 返回栏目