UCI協(xié)議的特點
UCI協(xié)議,全稱是國際象棋通用引擎協(xié)議(Universal Chess Interface,直譯作通用象棋接口)。它是開放的象棋引擎協(xié)議,所謂“開放的”引擎協(xié)議,指的是:
(1) 協(xié)議內(nèi)容是公開的,并且可以免費使用;
(2) 你可以根據(jù)該協(xié)議自己編寫象棋引擎,凡是支持該協(xié)議的界面,都可以使用你編寫的引擎;
(3) 你可以根據(jù)該協(xié)議自己編寫象棋界面,凡是支持該協(xié)議的引擎,都可以被你編寫的界面調(diào)用。
UCI協(xié)議的前身是象棋引擎SOS和Shredder使用的引擎協(xié)議,在他們的作者Rudolf Huber和Stefan Meyer-Kahlen對該協(xié)議的改進下,2000年11月28日UCI協(xié)議問世了。
UCI協(xié)議具有以下特點:
(1) 引擎程序是可執(zhí)行文件,它同界面程序之間通過“標準輸入”和“標準輸出”(即C語言中的stdin和stdout)來通訊。
(2) 輸入和輸出是以“行方式”來完成的,界面發(fā)給引擎的每條指令都必須以“回車”(即C語言中的'\n')結(jié)束,界面接收引擎的反饋也一樣。
注:引擎不能跨平臺使用,如果引擎從一個平臺(如Windows)移植到另一平臺(如Unix),需要重新編譯源代碼,或使用跨平臺接口。引擎的平臺通常由三類:
A. DOS平臺,但是由于DOS平臺過于陳舊,現(xiàn)在很難找到這樣的引擎;
B. Windows平臺,需要在Windows下用Console方式編譯引擎源代碼,WinBoard只能使用這類引擎;
C. Unix/Linux平臺;需要在Unix或Linux下編譯源代碼(也用Console方式),XBoard能夠使用Linux的引擎。
(3) 引擎啟動時,必須用“uci”指令讓引擎進入UCI協(xié)議狀態(tài)。當然,引擎也可以保留不使用UCI協(xié)議的權(quán)利,只要它接受的第一條有效指令允許不是“uci”。例如,很多UCI引擎允許第一條有效指令是“xboard”,這樣引擎就轉(zhuǎn)而進入WinBoard協(xié)議狀態(tài)。
(4) 無論引擎是否在思考,都必須隨時接收指令,這樣界面程序就可以隨時中斷引擎的工作或改變引擎的思考方式了。每條指令都以特定的關(guān)鍵字開頭,關(guān)鍵字和參數(shù)之間必須用空格隔開,這樣可以簡化引擎識別指令的過程。
(5) 界面必須隨時接收引擎的反饋信息,每條反饋信息也都以特定的關(guān)鍵字開頭(空格后面才是信息的實質(zhì)內(nèi)容),這樣可以讓界面更方便地識別每一條反饋信息。
(6) 引擎在搜索一個局面前,先要讓界面把局面的位置告訴引擎,作為“內(nèi)置局面”;
(7) 引擎必須接收到"go"指令后才開始思考(搜索);
(8) 如果對局是計時的,那么每次思考時都必須設(shè)定時鐘,引擎僅僅根據(jù)時鐘來決定思考策略,時鐘的改變需要界面來完成;
(9) 當引擎完成一個局面的搜索,得到一步最佳著法后,并不改變“內(nèi)置局面”,只是把這個著法反饋給界面,界面來完成這一步(當然,界面也可以讓引擎走別的著法),再把走完這一步后的局面告訴引擎;
(10) 開局庫通常由界面來指定給引擎,即通常引擎是不自帶開局庫的,當然引擎也可以自帶開局庫,此時界面可以讓引擎根據(jù)引擎自己的開局庫來完成開局的某步。
以上10個特點中,前5點和WinBoard協(xié)議是類似的,而后5點WinBoard協(xié)議和UCI協(xié)議則完全相反,因此WinBoard協(xié)議和UCI協(xié)議的指令也截然不同。
走棋格式
UCI協(xié)議用的走棋格式是“長代數(shù)格式”,即走動子的起始位置和到達位置,這里有幾點需要注意:
(1) 不要標明“到達記號”、“吃子記號”、“將軍記號”以及其他評注記號,例如第一步走e4,則記作e2e4,而不是e2-e4;
(2) 不要標明所走的子,例如走Nf6,則記作g8f6,而不是Ng8f6;
(3) 王車易位時只標明王的路線,例如走O-O,則記作e1g1;
(4) 兵升變時在最后注明只用一個字母注明升變的子,例如走e8=Q,則記作e7e8q。
輸入和輸出協(xié)議
輸入?yún)f(xié)議就是界面向引擎發(fā)送指令的協(xié)議,協(xié)議內(nèi)容通常由一系列指令集組成(),輸出協(xié)議則規(guī)定了引擎反饋給界面的信息,以及這些信息具體的含義(
)。
-
這是引擎啟動后,界面需要給引擎發(fā)送的第一條指令,通知引擎現(xiàn)在使用的是UCI協(xié)議。 -
這是指令的反饋信息,顯示引擎的版本號和作者。
-
也是指令的反饋信息,表示引擎所支持的選項,<id>指選項的名稱(后面會介紹),<t>指選項的類型,可以是以下5種:
(1),檢查框,取值只能是true或false;
(2),旋鈕,取值是整數(shù),可以用min和max來限定范圍;
(3),列表框,取值是由var來指定;
(4),按鈕,沒有取值,僅僅用來觸發(fā)某個事件;
(5),字符串,取值可以是任何字符串。
通常的UCI引擎支持以下選項:
(1),以MB為單位規(guī)定Hash表的大?。?br> (2)
,指定Nalimov殘局庫的路徑,可以設(shè)置多個路徑,用';'隔開;
(3),以MB為單位規(guī)定Nalimov殘局庫的緩沖區(qū);
(4),指定引擎是否后臺思考(Ponder),設(shè)定該參數(shù)的目的僅僅是讓引擎改變時間分配策略,后臺思考仍然需要界面發(fā)出指令;
(5),指定引擎是否要使用引擎自帶的開局庫;
(6),引擎給出多少步最佳著法,Alpha-Beta搜索通常只給出一步,增加這個數(shù)值會降低引擎的運行效率,但擴大了界面對引擎提供著法的選擇空間;
4.
這是指令的最后一條反饋信息,表示引擎已經(jīng)進入用uci協(xié)議通訊的狀態(tài)。
-
設(shè)置引擎參數(shù),這些參數(shù)必須是option反饋信息所列出的。 -
檢測引擎是否處于“就緒”狀態(tài),如果引擎發(fā)送回readyok信息,則說明引擎已經(jīng)就緒,可以界面可以向引擎發(fā)出其他指令。 -
這是的反饋信息,僅僅表示引擎可以接收指令了。即使引擎在思考,接收到
指令后也會返回
。
-
設(shè)置“內(nèi)置棋盤”的局面,用來指定FEN格式串,或用
來指定起始局面,它等價于
。
一般來說,界面發(fā)送給引擎的<fenstring>是最近一次吃子或進兵后的局面(稱為“不可逆局面”),該局面到當前局面的一系列著法則跟在后,目的是讓引擎掌握重復(fù)檢測的策略。FEN格式串的寫法參閱 國際象棋-關(guān)于PGN和FEN記譜規(guī)范(上)和 國際象棋-關(guān)于PGN和FEN記譜規(guī)范(下)
-
讓引擎根據(jù)內(nèi)置棋盤的設(shè)置和設(shè)定的搜索方式來思考,有以下搜索方式可供選擇(可以多選,直接跟在go后面):
(1),只讓引擎在這幾步中選擇一步;
(2),白方剩余時間(單位是毫秒);
,黑方剩余時間;
,白方每步增加的時間(適用于Fischer制);
,黑方每步增加的時間;
,還有多少回合進入下一時段(適用于時段制);
這些選項用來設(shè)定時鐘,它決定了引擎的思考時間;
(3),讓引擎進行后臺思考(即對手在用時,引擎的時鐘不起作用);
(4),指定搜索深度;
(5),指定搜索的節(jié)點數(shù)(即分析的局面數(shù),一般它和時間成正比);
(6),在指定步數(shù)內(nèi)只搜索殺棋;
(7),只花規(guī)定的時間搜索;
(8),無限制搜索,直到殺棋。
-
顯示引擎思考信息,信息有以下內(nèi)容(可以是很多信息,都跟在后面):
(1),當前搜索到的深度;
(2),選擇性搜索(不完全搜索)達到的深度,通常會跟在depth后面;
(3),已經(jīng)搜索到的最佳路線;
(4),這只會出現(xiàn)在設(shè)定了MultiPV選項以后,緊跟在pv后面,說明它是最佳的路線中的第幾條(排名第幾);
(5),已經(jīng)搜索的時間,它往往跟在pv后面;
(6),引擎對當前局面的評價,
指當前局面的評分,單位是“百分兵值”,
指在多少步之內(nèi)會形成殺棋,
指該評價是最低估計(為白方估計),
指該評價是最高估計(為黑方估計);
(7),當前搜索著法的序號;
(8),當前搜索的著法,它往往跟在
的后面;
(9),已經(jīng)搜索的節(jié)點數(shù)(即分析的局面數(shù),它會隔一定時間顯示出來;
(10),Hash表的占用率(單位是千分之一),它也會隔一定時間顯示出來;
(11),引擎速度,用每秒搜索的節(jié)點數(shù),它也會隔一定時間顯示出來;
(12),在殘局庫中找到局面的數(shù)目;
(13),處理器的占用率(單位是千分之一);
(14),其他信息,通常是調(diào)試信息。
-
中斷引擎的思考; -
在后臺思考()還沒有輸出結(jié)果(
)時,告訴引擎后臺思考命中(正在后臺思考的著法正好是對手的著法),隨后引擎就自動轉(zhuǎn)入正常思考(時鐘開始有效)。如果后臺思考沒有命中,就必須用
中止思考,重新設(shè)置局面讓引擎思考。
-
引擎思考結(jié)束后(不管是否被中斷)所顯示的結(jié)果,
指為對手思考的結(jié)果,通常引擎會提供此信息。
-
讓引擎退出運轉(zhuǎn),無論引擎思考與否。
舉例
在下面的例子中,輸入部分(從界面到引擎)用紅色表示,輸出部分(從引擎到界面)用藍色表示。
