象棋 计算机配置,中国象棋电脑应用规范(五)
如果把这4步棋涉及的5个局面都告诉引擎,那么指令依次是:
1:position fen
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR
w - - 0 1
2:position fen
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR
w - - 0 1 moves h2e2
3:position fen
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR
w - - 0 1 moves h2e2 h7e7
4:position fen
rnbakabnr/9/1c2c4/p1p1C1p1p/9/9/P1P1P1P1P/1C7/9/RNBAKABNR
b - - 0 2
5:position fen
rnbakabnr/9/1c2c4/p1p1C1p1p/9/9/P1P1P1P1P/1C7/9/RNBAKABNR
b - - 0 2 moves d9e8
其中第4行更换了FEN串,因为该局面前一个着法是吃子着法。
五、指令和反馈
按照惯例,指令用红色表示,反馈用蓝色表示。
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
]
引导状态的反馈。显示引擎所支持的选项,指选项的名称(后面会介绍),选项的类型是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 ponder和ponderhit指令;
(5)usebook(check),是否使用开局库的着法,默认是启用的,如果关闭的话,即便当前局面在开局库中有着法,引擎也会不顾开局库而思考的;
(6)useegtb(check),是否使用残局库,默认是启用的,和usebook类似;
(7)bookfiles(string),设定开局库文件的名称,可指定多个开局库文件,用分号“;”隔开,如不让引擎使用开局库,除了可以关闭usebook选项外,还可以把bookfiles设成空值;
(8)egtbpaths(string),设定残局库路径的名称,和bookfiles类似;
(9)evalapi(string),设定局面评价API函数库文件的名称,和bookfiles类似,但只能是一个文件(例如,Windows下默认值是EVALUATE.DLL,Linux下默认值是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以充分展示引擎的搜索速度,但在处理一些刁难性的排局时,用large或medium不一定能解出,可尝试small或none;
(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界面《象棋巫师》没有对batch、debug等选项的设置(它们只供调试时使用)。
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 | startpos} [moves
]
空闲状态的指令。设置“内置棋盘”的局面,用fen来指定FEN格式串,moves后面跟的是随后走过的着法,例如:
position fen
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR
w - - 0 1moves h2e2 h9g7
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适用于加时制。opptime、oppmovestogo和oppincrement可以让界面把对方的用时情况告诉引擎。
如果指定ponder选项,则引擎思考时时钟不走,直到接受到ponderhit指令后才计时,该选项用于后台思考,它只对限定时间的思考模式有效。
指定draw选项表示向引擎提和,引擎以bestmove提供的选项作为反馈,参阅bestmove指令。
注意:ponder和draw选项不能同时使用,如果界面向正在后台思考中的引擎求和,则使用ponderhit draw指令。
11.info
思考状态的反馈。显示引擎思考信息,通常有以下几种信息:
(1)time nodes :思考信息中给出的时间通常以毫秒为单位,结点数和时间相除就是引擎的速度(NPS值),单位是K。
(2)depth [score pv ]:输出引擎思考到的深度及其思考路线和好坏。例如在起始局面下,《象棋巫师》收到引擎的反馈:info depth 6 score
4 pv b0c2 b9c7 c3c4 h9i7 c2d4 h7e7,那么界面上应该输出:6 (+4)马八进七 马2进3
兵七进一 马8进9 马七进六 炮8平5。分值通常以一个轻子(马或炮)为100分记,以上信息说明此时当前要走的一方占有相当于0.04个轻子的优势。
(3)currmove :输出引擎正在思考的着法。
(4)message :输出引擎要直接告诉用户的信息,建议界面程序直接将提示信息显示在界面上。
12.ponderhit [draw]
思考状态的指令。告诉引擎后台思考命中,现在转入正常思考模式(引擎继续处于思考状态,此时go指令设定的时限开始起作用)。
指定draw选项表示向引擎提和,引擎以bestmove提供的选项作为反馈,参阅bestmove指令。
13.stop
思考状态的指令。中止引擎的思考。另外,后台思考没有命中时,就用该指令来中止思考,然后重新输入局面。
注意:发出该指令并不意味着引擎将立即回到空闲状态,而是要等到引擎反馈bestmove或nobestmove后才表示回到空闲状态,引擎应尽可能快地作出这样的反馈。
14.bestmove [ponder ] [draw | resign]
思考状态的反馈,此后引擎返回空闲状态。显示思考结果,即引擎认为在当前局面下的最佳着法,以及猜测在这个着法后对手会有怎样的应对(即后台思考的猜测着法)。通常,最佳着法是思考路线(主要变例)中的第一个着法,而后台思考的猜测着法则是第二个着法。
在对手尚未落子时,可以根据该着法来设定局面,并作后台思考。当对手走出的着法和后台思考的猜测着法吻合时,称为“后台思考命中”。
draw选项表示引擎提和或者接受界面向引擎发送的提和请求,参阅go draw和ponderhit draw指令。resign选项表示引擎认输。UCCI界面在人机对弈方式下,根据不同情况,可以对引擎的bestmove反馈中的draw和resign选项作出相应的处理:
(1)如果用户提和,界面向引擎发出go draw或ponderhit draw指令,而引擎反馈带draw的bestmove,那么界面可终止对局并判议和;
(2)如果用户没有提和,而引擎反馈带draw的bestmove,那么界面可向用户提和,用户接受提和则可终止对局并判议和;
(3)如果引擎反馈带resign的bestmove,那么界面可终止对局并判引擎认输。
引擎应该根据当前局面的情况(由position指令给出),以及界面是否发送了带draw的go或ponderhit指令,来考虑是否反馈带draw或resign的bestmove。
15.nobestmove
思考状态的反馈,此后引擎返回空闲状态。显示思考结果,但引擎一步着法也没计算,表示当前局面是死局面,或者接收到诸如go depth 0等只让引擎给出静态局面评价的指令。
16.probe {fen | startpos} [moves
]
空闲状态和思考状态的指令。获取Hash表中指定局面的信息,引擎必须立刻在Hash表中查找该局面的状态,由pophash指令反馈。
该指令仅用于引擎的调试,设计者可以向引擎发送一系列probe指令,捕获到搜索树的大致信息。
17.pophash [bestmove ] [lowerbound depth ] [upperbound depth ]
空闲状态和思考状态的反馈。输出由probe所指定的局面在Hash表中信息。
如果该局面没有记录在Hash表中,那么只反馈pophash即可。
18.quit
空闲状态的指令。让引擎退出运转。
19.bye
接收到quit指令后的反馈。引擎完成了退出运转前的准备工作,通知界面,引擎将在瞬间正常退出运转。界面收到该指令后,即可关闭输入输出通道。
六、用例
下面是一个后台思考的例子,描述了UCCI引擎中最难处理的部分。(从界面到引擎的)指令用红色表示,(从引擎到界面的)反馈用蓝色表示。
ucci
id name
ElephantEye Demo
option
usemillisec type check default false
option
usebook type check default true
ucciok
setoption
usemillisec true
setoption
usebook false
position fen
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR
w - - 0 1
go time
300000 increment 0
info depth 6
score 4 pv b0c2 b9c7 c3c4 h9i7 c2d4 h7e7
info nodes
5000000 time 5000
bestmove b0c2
ponder b9c7
在这个例子中,引擎执红,用户执黑,采用5分钟包干的时限。引擎启动后,界面即让引擎分析初始局面(不用开局库),引擎给出最佳着法“马八进七”,然后是用户走子,引擎按照猜测着法“马2进3”作后台思考。此时,引擎消耗了5秒钟,还剩余295秒的时间。
position fen
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR
w - - 0 1 moves b0c2 b9c7
go ponder
time 295000 increment 0
info depth 6
score 4 pv c3c4 h9i7 c2d4 h7e7 h0g2 i9h9
此时用户走子了,下面分两种情况讨论。
(1)如果用户走了引擎的猜测着法“马2进3”,那么后台思考命中:
ponderhit
info nodes
10000000 time 10000
info depth 7
score 4 pv c3c4 h9i7 c2d4 h7e7 h0g2 i9h9 i0h0
info nodes
15000000 time 15000
bestmove c3c4
ponder h9i7
现在引擎走“兵七进一”,并且猜测对方会走“马8进9”。尽管这着棋引擎思考了15秒钟,但是前10秒钟用的是对手的时间,自己的时间是从ponderhit到bestmove的部分,所以自己的时间只消耗了5秒钟,因此还剩余290秒的时间。然后引擎继续后台思考。
position fen
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR
w - - 0 1 moves b0c2 b9c7 c3c4 h9i7
go ponder
time 290000 increment 0
……
(2)如果用户走了其他的着法(比如“卒3进1”),那么后台思考没有命中,必须根据这个着法重新思考。
stop
info nodes
10000000 time 10000
bestmove c3c4
ponder h9i7
position fen
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR
w - - 0 1 moves b0c2 c6c5
go time
295000 increment 0
……
如希望获得更详细的关于UCCI操作上的细节,可参考UCCI引擎ElephantEye的源程序及其说明材料,这里不再作过多的介绍。
七、电脑象棋联赛
电脑象棋联赛使用UCCI引擎,但是参赛引擎并不一定要支持UCCI的全部内容,只需要能跟“UCCI引擎联赛模拟器”正常通讯就可正常比赛了,模拟器相当于一个支持UCCI的界面。参赛引擎必须能够识别并正确处理的指令有:
(1)ucci;
(2)position fen ... [moves
...];
(3)banmoves ...;
(4)go [draw] time ...
increment ... [opptime ... oppincrement ...];
(5)quit。
参赛引擎必须能够反馈的信息有:
(1)ucciok;
(2)bestmove ... [draw
| resign]。
为了更好地让引擎适应模拟器,引擎最好能够实现以下功能:
(1)支持毫秒制。即启动时有option usemillisec的反馈,能够识别并处理setoption
usemillisec true的指令。启用毫秒制以后,在时间非常紧缺的情况下,模拟器就会准确地把时间告诉引擎,否则只会粗略地给出秒数。
(2)支持认输和提和,即当引擎觉得没有机会获胜时,可以用bestmove ... draw提和或接受提和,当引擎觉得没有能力抵抗时,可以用bestmove ...
resign认输,节约比赛时间。
(3)支持stop指令。当引擎超时后,模拟器会发送stop指令让引擎立即给出着法(立即反馈bestmove),超过一定时间(如超过0.2秒)才判超时负。
另外,识别setoption指令不是必须的,但在联赛中也会有用。例如,如果引擎需要用setoption
bookfiles ...来导入开局库,而模拟器不会自动向引擎发送这条指令,那么引擎必须建立配置文件,其中有setoption
bookfiles ...这行指令,模拟器在启动引擎后,会把配置文件中的每行都作为指令发送给引擎的。
八、和UCI的区别
UCCI是从国际象棋通用引擎协议UCI移植过来的,沿用了大部分UCI的指令和反馈,但是为了适应中国象棋软件的需要,作了以下几点改动:
(1)增加了banmoves指令,因为中国象棋有长打作负的规则。
(2)把UCI的反馈option name type ...简化为option type ...。例如,UCI中有option name Hash
Size type spin这条反馈,而在UCCI中则是option hashsize
type spin。这里去掉了name关键字,因为它总是跟在option后面,显得多此一举。另外,UCI允许选项由多个有大小写的单词组成(如Hash Size),这是因为UCI界面会直接把这个选项名称显示在对话框上。而UCCI中的选项只用一个全部由小写字母组成的单词,因为中国象棋的UCCI界面使用中文,因此界面上不能输出Hash Size,而用“置换表”或其他可以看得懂的中文术语。这样,界面还不如识别一个更简单的hashsize(一个全部由小写字母组成的单词),再翻译成“置换表”。
(3)把UCI的指令setoption name
[value ]简化为setoption []。由于UCCI的选项是一个单词,所以第二个空格后的内容肯定是选项的值,因此name和value就显得多此一举了。
(4) UCCI明确了引擎所处的三种状态,以及这三种状态下适用的指令和反馈,为界面和引擎的程序设计提供了清晰的思路。
(5) UCCI以go time opptime 的形式把双方的时间信息传达给引擎,而不是UCI的go wtime btime ,这样可以简化引擎解析时间的操作,如果引擎在指定用时策略时不考虑对方的用时,那么可以不理会opptime 。
(6) UCCI明确了4种思考模式,使得指令的解析简单化了。
(7) UCCI规定position fen ... [moves
...]指令中的FEN串是当前局面前第一个不吃子的局面,后面再跟该局面的后续着法。而UCI则是用position startpos
moves ...指令,把棋局从头到尾的着法全都列出来,会增加通讯通道的压力。
象棋 计算机配置,中国象棋电脑应用规范(五)相关推荐
- 疯狂游戏型计算机配置清单,组装电脑高配置清单 一起看看吧
事实上,我们的图形配置需要高水平的图形卡,它也需要一个稳定可靠的平台支持.在这个网需要的朋友来看,装配网络给了5000元和六代i5-6500 / R9 380映射的计算机配置的建议.我们知道5000元 ...
- linux上的中国象棋游戏下载,中国象棋下载_中国象棋最新下载_玩一玩游戏
中国象棋是起源于中国,的一种棋类游戏,属于两个人之间的对抗,在中国有着悠久的历史.由于它的器皿简单,趣味性强,它已经成为一种非常受欢迎的棋类活动. 中国象棋是中华民族的文化瑰宝,历史悠久,趣味性强,基 ...
- 中国象棋棋盘java_Java中国象棋博弈程序探秘[2]——棋盘的表示
棋盘的表示 转载请保留作者信息: 作者:88250 MSN & Gmail & QQ:DL88250@gmail.com 在象棋博弈程序中,首先我们要确定下棋盘-棋子的数据结构描述. ...
- 计算机配置低怎么办,电脑配置低怎么办 如何让电脑运行速度加快
电脑配置低怎么办?有一些电脑由于配置比较低,所以电脑的运行速度就会变的很慢,如果想要加快电脑在运行时候的速度,那么就需要在硬件或者软件上面进行优化或者提升,那么今天小编就从几个方面来解决配置低的电脑应 ...
- 购买计算机配置总结,买电脑主要看什么 教你怎么看电脑配置信息
对于不懂电脑的人来说,买电脑是一件很难的事,千万不能小看它,虽然它看起来很简单,但是里面的配件还是比较多,所以在选择时候一定要学会看它的配置.下面小编就来给大家介绍一下买电脑主要看什么及教你怎么看电脑 ...
- 办公计算机配置表,2020电脑配置清单
下面是介绍2020电脑配置清单: 从入门到高端的组装计算机配置的推荐列表,让我们看一下DIY装置的最新市场报价.截至目前的市场分析,我相信在此期间不会有太多的市场波动. 一.最近安装的市场报价: 1. ...
- c语言象棋小程序,中国象棋源代码-C语言小程序.docx
中国象棋源代码-C语言小程序 *chess.c*/#include "dos.h"#include "stdio.h"/**/#define RED 7#def ...
- 5000的游戏电脑计算机配置,5000元电脑配置单,5000游戏电脑配置,直播电脑配置
5000元电脑配置单,5000游戏电脑配置,直播电脑配置 组装电脑配置 电脑租赁 2017-11-27 8843 0评论 名称 : 5000元6核八代酷睿i5电脑配置清单 参数 ...
- 怎样对比计算机配置,怎么看电脑配置好坏,教您怎么看电脑配置好坏
小编我之前遇到过这样一有个窘况,就是别人给我看了某电脑的配置,然后问我这电脑的配置如何,当时我的反映是愣着的.因为我看了很久都没看出个所以然来.所以最后闹了个笑话,但是现在我已经知道怎么判断啦.所以下 ...
- 顶点计算机配置,高端电脑硬件配置
随着科技的不断发展,电脑已经成为广大民众的家用电器,电脑的配置也是在不断的改进,一些大型的电脑游戏也需要更加高端的电脑配置才能满足其运行的需要,那么什么样的配置才算是高配置呢?下面是学习啦小编跟大家分 ...
最新文章
- Redis源码分析:服务器端处理过程
- php 怎么查看原生方法源码_怎么看电脑内存频率?这里有3种方法可以查看,新手分享...
- Navicat连接SQL Server报错未发现数据源名称并且未指定默认驱动程序
- 【机器学习】一文读懂异常检测 LOF 算法(Python代码)
- mysql5.7循环,python3.4用循环往mysql5.7中写数据并输出的实现方法
- 通过Docker或虚拟机快速搭建私有云平台--使用Nextcloud和ONLYOFFICE创建您的WebOffice云办公系统
- C# 通过接口IEnumerator让自己编写的对象/类,实现foreach遍历方法
- python统计word页码_使用Python(win32com)在MS Word表中插入带页码的字段
- U890第二次开发的BOM表工具--自主知识产权
- java中的值传递与引用传递
- ERPS协议学习笔记
- 多个panel控件重合使用时,某个panel控件不显示问题?
- 华为签约计算机大学,2020年,华为签约学生多的16所大学,你知道几个?
- 10.1假期一半总结
- MacTeX添加.sty文件
- 港科夜闻|2022年香港科大气候适应及复原力大会圆满闭幕,政经领袖研讨香港气候政策与绿色金融发展...
- Android sqlite执行insert,英文单引号报错问题的解决
- 煲汤C语言,煲汤秘诀,附9款排骨汤做法,总有一款适合你!
- 信息与电脑杂志信息与电脑杂志社信息与电脑编辑部2022年第8期目录
- 手把手完成智慧路灯的开发,完成设备上云【华为云IoT】