國際象棋通用引擎協(xié)議

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)容通常由一系列指令集組成(\color{red}{用紅色表示}),輸出協(xié)議則規(guī)定了引擎反饋給界面的信息,以及這些信息具體的含義(\color{blue}{用藍色表示})。

  1. \color{red}{uci}
      這是引擎啟動后,界面需要給引擎發(fā)送的第一條指令,通知引擎現(xiàn)在使用的是UCI協(xié)議。
  2. \color{blue}{id {name <x> | author <x>}}
      這是\color{red}{uci}指令的反饋信息,顯示引擎的版本號和作者。
  3. \color{blue}{option name <id> type <t> [default <x>] [min <x>] [max <x>] [var <x> [var <x> [...]]]}
      也是\color{red}{uci}指令的反饋信息,表示引擎所支持的選項,<id>指選項的名稱(后面會介紹),<t>指選項的類型,可以是以下5種:
      (1) \color{blue}{check},檢查框,取值只能是true或false;
      (2) \color{blue}{spin},旋鈕,取值是整數(shù),可以用min和max來限定范圍;
      (3) \color{blue}{combo},列表框,取值是由var來指定;
      (4) \color{blue}{button},按鈕,沒有取值,僅僅用來觸發(fā)某個事件;
      (5) \color{blue}{string},字符串,取值可以是任何字符串。
      通常的UCI引擎支持以下選項:
      (1) \color{blue}{Hash(spin)},以MB為單位規(guī)定Hash表的大?。?br>   (2) \color{blue}{NalimovPath(string)},指定Nalimov殘局庫的路徑,可以設(shè)置多個路徑,用';'隔開;
      (3) \color{blue}{NalimovCache(spin)},以MB為單位規(guī)定Nalimov殘局庫的緩沖區(qū);
      (4) \color{blue}{Ponder(check)},指定引擎是否后臺思考(Ponder),設(shè)定該參數(shù)的目的僅僅是讓引擎改變時間分配策略,后臺思考仍然需要界面發(fā)出指令;
      (5) \color{blue}{OwnBook(check)},指定引擎是否要使用引擎自帶的開局庫;
      (6) \color{blue}{MultiPV(spin)},引擎給出多少步最佳著法,Alpha-Beta搜索通常只給出一步,增加這個數(shù)值會降低引擎的運行效率,但擴大了界面對引擎提供著法的選擇空間;
    4.\color{blue}{uciok}
      這是\color{red}{uci}指令的最后一條反饋信息,表示引擎已經(jīng)進入用uci協(xié)議通訊的狀態(tài)。
  4. \color{red}{setoption name <id> [value <x>]}
      設(shè)置引擎參數(shù),這些參數(shù)必須是option反饋信息所列出的。
  5. \color{red}{isready}
      檢測引擎是否處于“就緒”狀態(tài),如果引擎發(fā)送回readyok信息,則說明引擎已經(jīng)就緒,可以界面可以向引擎發(fā)出其他指令。
  6. \color{blue}{readyok}
      這是\color{red}{isready}的反饋信息,僅僅表示引擎可以接收指令了。即使引擎在思考,接收到\color{red}{isready}指令后也會返回\color{blue}{readyok}。
  7. \color{red}{position {fen <fenstring> | startpos } [moves <move1> .... <moven>]}
      設(shè)置“內(nèi)置棋盤”的局面,用\color{red}{fen}來指定FEN格式串,或用\color{red}{startpos}來指定起始局面,它等價于
    \color{red}{fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1}。
      一般來說,界面發(fā)送給引擎的<fenstring>是最近一次吃子或進兵后的局面(稱為“不可逆局面”),該局面到當前局面的一系列著法則跟在\color{red}{moves}后,目的是讓引擎掌握重復(fù)檢測的策略。FEN格式串的寫法參閱 國際象棋-關(guān)于PGN和FEN記譜規(guī)范(上)國際象棋-關(guān)于PGN和FEN記譜規(guī)范(下)
  8. \color{red}{go ...}
      讓引擎根據(jù)內(nèi)置棋盤的設(shè)置和設(shè)定的搜索方式來思考,有以下搜索方式可供選擇(可以多選,直接跟在go后面):
      (1) \color{red}{searchmoves <move1> .... <moven>},只讓引擎在這幾步中選擇一步;
      (2) \color{red}{wtime <x>},白方剩余時間(單位是毫秒);
        \color{red}{btime <x>},黑方剩余時間;
        \color{red}{winc <x>},白方每步增加的時間(適用于Fischer制);
        \color{red}{binc <x>},黑方每步增加的時間;
        \color{red}{movestogo <x>},還有多少回合進入下一時段(適用于時段制);
      這些選項用來設(shè)定時鐘,它決定了引擎的思考時間;
      (3) \color{red}{ponder},讓引擎進行后臺思考(即對手在用時,引擎的時鐘不起作用);
      (4) \color{red}{depth <x>},指定搜索深度;
      (5) \color{red}{nodes <x>},指定搜索的節(jié)點數(shù)(即分析的局面數(shù),一般它和時間成正比);
      (6) \color{red}{mate <x>},在指定步數(shù)內(nèi)只搜索殺棋;
      (7) \color{red}{movetime <x>},只花規(guī)定的時間搜索;
      (8) \color{red}{infinite},無限制搜索,直到殺棋。
  9. \color{blue}{info ...}
      顯示引擎思考信息,信息有以下內(nèi)容(可以是很多信息,都跟在\color{blue}{info}后面):
      (1) \color{blue}{depth <x>},當前搜索到的深度;
      (2) \color{blue}{seldepth <x>},選擇性搜索(不完全搜索)達到的深度,通常會跟在depth后面;
      (3) \color{blue}{pv <move1> ... <moven>},已經(jīng)搜索到的最佳路線;
      (4) \color{blue}{multipv <num>},這只會出現(xiàn)在設(shè)定了MultiPV選項以后,緊跟在pv后面,說明它是最佳的路線中的第幾條(排名第幾);
      (5) \color{blue}{time <x>},已經(jīng)搜索的時間,它往往跟在pv后面;
      (6) \color{blue}{score {pv <x> | mate <y>} [lowerbound | upperbound]},引擎對當前局面的評價,\color{blue}{pv <x>}指當前局面的評分,單位是“百分兵值”,\color{blue}{mate <y>}指在多少步之內(nèi)會形成殺棋,\color{blue}{lowerbound}指該評價是最低估計(為白方估計),\color{blue}{upperbound}指該評價是最高估計(為黑方估計);
      (7) \color{blue}{currmovenumber <x>},當前搜索著法的序號;
      (8) \color{blue}{currmove <move>},當前搜索的著法,它往往跟在\color{blue}{currmovenumber <x>}的后面;
      (9) \color{blue}{nodes <x>},已經(jīng)搜索的節(jié)點數(shù)(即分析的局面數(shù),它會隔一定時間顯示出來;
      (10) \color{blue}{hashfull <x>},Hash表的占用率(單位是千分之一),它也會隔一定時間顯示出來;
      (11) \color{blue}{nps <x>},引擎速度,用每秒搜索的節(jié)點數(shù),它也會隔一定時間顯示出來;
      (12) \color{blue}{tbhits <x>},在殘局庫中找到局面的數(shù)目;
      (13) \color{blue}{cpuload <x>},處理器的占用率(單位是千分之一);
      (14) \color{blue}{string <str>},其他信息,通常是調(diào)試信息。
  10. \color{red}{stop}
      中斷引擎的思考;
  11. \color{red}{ponderhit}
      在后臺思考(\color{red}{go ponder})還沒有輸出結(jié)果(\color{blue}{bestmove <x>})時,告訴引擎后臺思考命中(正在后臺思考的著法正好是對手的著法),隨后引擎就自動轉(zhuǎn)入正常思考(時鐘開始有效)。如果后臺思考沒有命中,就必須用\color{red}{stop}中止思考,重新設(shè)置局面讓引擎思考。
  12. \color{blue}{bestmove <move1> [ponder <move2>]}
      引擎思考結(jié)束后(不管是否被\color{red}{stop}中斷)所顯示的結(jié)果,\color{blue}{ponder}指為對手思考的結(jié)果,通常引擎會提供此信息。
  13. \color{red}{quit}
      讓引擎退出運轉(zhuǎn),無論引擎思考與否。

舉例

在下面的例子中,輸入部分(從界面到引擎)用紅色表示,輸出部分(從引擎到界面)用藍色表示。


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容