UCI協(xié)議的特點(diǎn)
UCI協(xié)議,全稱是國(guó)際象棋通用引擎協(xié)議(Universal Chess Interface汰瘫,直譯作通用象棋接口)狂打。它是開放的象棋引擎協(xié)議,所謂“開放的”引擎協(xié)議混弥,指的是:
(1) 協(xié)議內(nèi)容是公開的趴乡,并且可以免費(fèi)使用;
(2) 你可以根據(jù)該協(xié)議自己編寫象棋引擎蝗拿,凡是支持該協(xié)議的界面晾捏,都可以使用你編寫的引擎;
(3) 你可以根據(jù)該協(xié)議自己編寫象棋界面哀托,凡是支持該協(xié)議的引擎惦辛,都可以被你編寫的界面調(diào)用。
UCI協(xié)議的前身是象棋引擎SOS和Shredder使用的引擎協(xié)議萤捆,在他們的作者Rudolf Huber和Stefan Meyer-Kahlen對(duì)該協(xié)議的改進(jìn)下裙品,2000年11月28日UCI協(xié)議問世了。
UCI協(xié)議具有以下特點(diǎn):
(1) 引擎程序是可執(zhí)行文件俗或,它同界面程序之間通過“標(biāo)準(zhǔn)輸入”和“標(biāo)準(zhǔn)輸出”(即C語言中的stdin和stdout)來通訊市怎。
(2) 輸入和輸出是以“行方式”來完成的,界面發(fā)給引擎的每條指令都必須以“回車”(即C語言中的'\n')結(jié)束辛慰,界面接收引擎的反饋也一樣区匠。
注:引擎不能跨平臺(tái)使用,如果引擎從一個(gè)平臺(tái)(如Windows)移植到另一平臺(tái)(如Unix)帅腌,需要重新編譯源代碼驰弄,或使用跨平臺(tái)接口。引擎的平臺(tái)通常由三類:
A. DOS平臺(tái)速客,但是由于DOS平臺(tái)過于陳舊戚篙,現(xiàn)在很難找到這樣的引擎;
B. Windows平臺(tái)溺职,需要在Windows下用Console方式編譯引擎源代碼岔擂,WinBoard只能使用這類引擎;
C. Unix/Linux平臺(tái)浪耘;需要在Unix或Linux下編譯源代碼(也用Console方式)乱灵,XBoard能夠使用Linux的引擎。
(3) 引擎啟動(dòng)時(shí)七冲,必須用“uci”指令讓引擎進(jìn)入U(xiǎn)CI協(xié)議狀態(tài)痛倚。當(dāng)然,引擎也可以保留不使用UCI協(xié)議的權(quán)利澜躺,只要它接受的第一條有效指令允許不是“uci”蝉稳。例如抒蚜,很多UCI引擎允許第一條有效指令是“xboard”,這樣引擎就轉(zhuǎn)而進(jìn)入WinBoard協(xié)議狀態(tài)颠区。
(4) 無論引擎是否在思考削锰,都必須隨時(shí)接收指令,這樣界面程序就可以隨時(shí)中斷引擎的工作或改變引擎的思考方式了毕莱。每條指令都以特定的關(guān)鍵字開頭,關(guān)鍵字和參數(shù)之間必須用空格隔開颅夺,這樣可以簡(jiǎn)化引擎識(shí)別指令的過程朋截。
(5) 界面必須隨時(shí)接收引擎的反饋信息,每條反饋信息也都以特定的關(guān)鍵字開頭(空格后面才是信息的實(shí)質(zhì)內(nèi)容)吧黄,這樣可以讓界面更方便地識(shí)別每一條反饋信息部服。
(6) 引擎在搜索一個(gè)局面前,先要讓界面把局面的位置告訴引擎拗慨,作為“內(nèi)置局面”廓八;
(7) 引擎必須接收到"go"指令后才開始思考(搜索);
(8) 如果對(duì)局是計(jì)時(shí)的赵抢,那么每次思考時(shí)都必須設(shè)定時(shí)鐘剧蹂,引擎僅僅根據(jù)時(shí)鐘來決定思考策略,時(shí)鐘的改變需要界面來完成烦却;
(9) 當(dāng)引擎完成一個(gè)局面的搜索宠叼,得到一步最佳著法后,并不改變“內(nèi)置局面”其爵,只是把這個(gè)著法反饋給界面冒冬,界面來完成這一步(當(dāng)然,界面也可以讓引擎走別的著法)摩渺,再把走完這一步后的局面告訴引擎简烤;
(10) 開局庫(kù)通常由界面來指定給引擎,即通常引擎是不自帶開局庫(kù)的摇幻,當(dāng)然引擎也可以自帶開局庫(kù)横侦,此時(shí)界面可以讓引擎根據(jù)引擎自己的開局庫(kù)來完成開局的某步。
以上10個(gè)特點(diǎn)中囚企,前5點(diǎn)和WinBoard協(xié)議是類似的丈咐,而后5點(diǎn)WinBoard協(xié)議和UCI協(xié)議則完全相反,因此WinBoard協(xié)議和UCI協(xié)議的指令也截然不同龙宏。
走棋格式
UCI協(xié)議用的走棋格式是“長(zhǎng)代數(shù)格式”棵逊,即走動(dòng)子的起始位置和到達(dá)位置,這里有幾點(diǎn)需要注意:
(1) 不要標(biāo)明“到達(dá)記號(hào)”银酗、“吃子記號(hào)”辆影、“將軍記號(hào)”以及其他評(píng)注記號(hào)徒像,例如第一步走e4,則記作e2e4蛙讥,而不是e2-e4锯蛀;
(2) 不要標(biāo)明所走的子,例如走Nf6次慢,則記作g8f6旁涤,而不是Ng8f6;
(3) 王車易位時(shí)只標(biāo)明王的路線迫像,例如走O-O劈愚,則記作e1g1;
(4) 兵升變時(shí)在最后注明只用一個(gè)字母注明升變的子闻妓,例如走e8=Q菌羽,則記作e7e8q。
輸入和輸出協(xié)議
輸入?yún)f(xié)議就是界面向引擎發(fā)送指令的協(xié)議由缆,協(xié)議內(nèi)容通常由一系列指令集組成()注祖,輸出協(xié)議則規(guī)定了引擎反饋給界面的信息,以及這些信息具體的含義(
)均唉。
-
這是引擎啟動(dòng)后是晨,界面需要給引擎發(fā)送的第一條指令,通知引擎現(xiàn)在使用的是UCI協(xié)議浸卦。 -
這是指令的反饋信息署鸡,顯示引擎的版本號(hào)和作者。
-
也是指令的反饋信息限嫌,表示引擎所支持的選項(xiàng)靴庆,<id>指選項(xiàng)的名稱(后面會(huì)介紹),<t>指選項(xiàng)的類型怒医,可以是以下5種:
(1)炉抒,檢查框,取值只能是true或false稚叹;
(2)焰薄,旋鈕,取值是整數(shù)扒袖,可以用min和max來限定范圍塞茅;
(3),列表框季率,取值是由var來指定野瘦;
(4),按鈕,沒有取值鞭光,僅僅用來觸發(fā)某個(gè)事件吏廉;
(5),字符串惰许,取值可以是任何字符串席覆。
通常的UCI引擎支持以下選項(xiàng):
(1),以MB為單位規(guī)定Hash表的大行诼颉佩伤;
(2),指定Nalimov殘局庫(kù)的路徑晦毙,可以設(shè)置多個(gè)路徑畦戒,用';'隔開;
(3)结序,以MB為單位規(guī)定Nalimov殘局庫(kù)的緩沖區(qū);
(4)纵潦,指定引擎是否后臺(tái)思考(Ponder)徐鹤,設(shè)定該參數(shù)的目的僅僅是讓引擎改變時(shí)間分配策略,后臺(tái)思考仍然需要界面發(fā)出指令邀层;
(5)返敬,指定引擎是否要使用引擎自帶的開局庫(kù);
(6)寥院,引擎給出多少步最佳著法劲赠,Alpha-Beta搜索通常只給出一步,增加這個(gè)數(shù)值會(huì)降低引擎的運(yùn)行效率秸谢,但擴(kuò)大了界面對(duì)引擎提供著法的選擇空間凛澎;
4.
這是指令的最后一條反饋信息,表示引擎已經(jīng)進(jìn)入用uci協(xié)議通訊的狀態(tài)估蹄。
-
設(shè)置引擎參數(shù)塑煎,這些參數(shù)必須是option反饋信息所列出的。 -
檢測(cè)引擎是否處于“就緒”狀態(tài)臭蚁,如果引擎發(fā)送回readyok信息最铁,則說明引擎已經(jīng)就緒,可以界面可以向引擎發(fā)出其他指令垮兑。 -
這是的反饋信息冷尉,僅僅表示引擎可以接收指令了。即使引擎在思考系枪,接收到
指令后也會(huì)返回
雀哨。
-
設(shè)置“內(nèi)置棋盤”的局面,用來指定FEN格式串嗤无,或用
來指定起始局面震束,它等價(jià)于
怜庸。
一般來說,界面發(fā)送給引擎的<fenstring>是最近一次吃子或進(jìn)兵后的局面(稱為“不可逆局面”)垢村,該局面到當(dāng)前局面的一系列著法則跟在后割疾,目的是讓引擎掌握重復(fù)檢測(cè)的策略。FEN格式串的寫法參閱 國(guó)際象棋-關(guān)于PGN和FEN記譜規(guī)范(上)和 國(guó)際象棋-關(guān)于PGN和FEN記譜規(guī)范(下)
-
讓引擎根據(jù)內(nèi)置棋盤的設(shè)置和設(shè)定的搜索方式來思考嘉栓,有以下搜索方式可供選擇(可以多選宏榕,直接跟在go后面):
(1),只讓引擎在這幾步中選擇一步侵佃;
(2)麻昼,白方剩余時(shí)間(單位是毫秒);
馋辈,黑方剩余時(shí)間抚芦;
,白方每步增加的時(shí)間(適用于Fischer制)迈螟;
啦粹,黑方每步增加的時(shí)間址芯;
,還有多少回合進(jìn)入下一時(shí)段(適用于時(shí)段制);
這些選項(xiàng)用來設(shè)定時(shí)鐘斗塘,它決定了引擎的思考時(shí)間蜻牢;
(3)缨称,讓引擎進(jìn)行后臺(tái)思考(即對(duì)手在用時(shí)沛申,引擎的時(shí)鐘不起作用);
(4)耘拇,指定搜索深度撵颊;
(5),指定搜索的節(jié)點(diǎn)數(shù)(即分析的局面數(shù)驼鞭,一般它和時(shí)間成正比)秦驯;
(6),在指定步數(shù)內(nèi)只搜索殺棋挣棕;
(7)译隘,只花規(guī)定的時(shí)間搜索;
(8)洛心,無限制搜索固耘,直到殺棋。
-
顯示引擎思考信息词身,信息有以下內(nèi)容(可以是很多信息厅目,都跟在后面):
(1),當(dāng)前搜索到的深度;
(2)损敷,選擇性搜索(不完全搜索)達(dá)到的深度葫笼,通常會(huì)跟在depth后面;
(3)拗馒,已經(jīng)搜索到的最佳路線路星;
(4),這只會(huì)出現(xiàn)在設(shè)定了MultiPV選項(xiàng)以后诱桂,緊跟在pv后面洋丐,說明它是最佳的路線中的第幾條(排名第幾);
(5)挥等,已經(jīng)搜索的時(shí)間友绝,它往往跟在pv后面;
(6)肝劲,引擎對(duì)當(dāng)前局面的評(píng)價(jià)迁客,
指當(dāng)前局面的評(píng)分,單位是“百分兵值”辞槐,
指在多少步之內(nèi)會(huì)形成殺棋哲泊,
指該評(píng)價(jià)是最低估計(jì)(為白方估計(jì)),
指該評(píng)價(jià)是最高估計(jì)(為黑方估計(jì))催蝗;
(7),當(dāng)前搜索著法的序號(hào)育特;
(8)丙号,當(dāng)前搜索的著法,它往往跟在
的后面缰冤;
(9)犬缨,已經(jīng)搜索的節(jié)點(diǎn)數(shù)(即分析的局面數(shù),它會(huì)隔一定時(shí)間顯示出來棉浸;
(10)怀薛,Hash表的占用率(單位是千分之一),它也會(huì)隔一定時(shí)間顯示出來迷郑;
(11)枝恋,引擎速度,用每秒搜索的節(jié)點(diǎn)數(shù)嗡害,它也會(huì)隔一定時(shí)間顯示出來焚碌;
(12),在殘局庫(kù)中找到局面的數(shù)目霸妹;
(13)十电,處理器的占用率(單位是千分之一);
(14),其他信息鹃骂,通常是調(diào)試信息台盯。
-
中斷引擎的思考; -
在后臺(tái)思考()還沒有輸出結(jié)果(
)時(shí)畏线,告訴引擎后臺(tái)思考命中(正在后臺(tái)思考的著法正好是對(duì)手的著法)静盅,隨后引擎就自動(dòng)轉(zhuǎn)入正常思考(時(shí)鐘開始有效)。如果后臺(tái)思考沒有命中象踊,就必須用
中止思考温亲,重新設(shè)置局面讓引擎思考。
-
引擎思考結(jié)束后(不管是否被中斷)所顯示的結(jié)果杯矩,
指為對(duì)手思考的結(jié)果栈虚,通常引擎會(huì)提供此信息。
-
讓引擎退出運(yùn)轉(zhuǎn)史隆,無論引擎思考與否魂务。
舉例
在下面的例子中,輸入部分(從界面到引擎)用紅色表示泌射,輸出部分(從引擎到界面)用藍(lán)色表示粘姜。