a XiangQi (Chinese Chess) Engine for XQWizard with Strong AI
中國象棋對弈程式ElephantEye(象眼) 版本:3.15
國際象棋百科全書網* 2008年3月
(* Email: [email protected])
一、簡介
ElephantEye 是一款自由的中國象棋程序,在遵循《GNU寬鬆通用公共許可協議》(GNU Lesser General Public Licence)的前提下,廣大象棋愛好者和程序設計師可以自由使用ElephantEye 及其源程序。
ElephantEye 中文名稱為“象眼”,它跟“馬腿”和“砲架子”一起構成了中國象棋“棋盤上的第三個維度”。 ElephantEye 通常與一個象棋棋譜編輯軟體ElephantBoard 配合使用,寓意有板有眼(英文Board 的意思是「板」)。 (註:現在ElephantBoard 已更名為「象棋巫師」。)
二、引擎協議
ElephantEye 支援UCCI 3.0,淺紅象棋使用者可透過UCCI引擎適配器(UCCI2QH)呼叫ElephantEye引擎。
(1) 支援的UCCI指令有:
ucci
setoption ...
position {fen <fen_str> | startpos} [moves <move_list>]
banmoves <move_list>
go [ponder | draw] ...
ponderhit [draw] | stop
probe {fen <fen_str> | startpos} [moves <move_list>]
quit
(2) 可以回傳的UCCI資訊有:
id {name <engine_name> | version <version_name> | copyright <copyright_info> | author <author_name> | user <user_name>}
option ...
ucciok
info ...
{nobestmove | bestmove <best_move> [ponder <ponder_move>] [draw | resign]}
pophash [bestmove <best_move>] [lowerbound <value> depth <depth>] [upperbound <value> depth <depth>]
bye
三、參數設定
ElephantEye 作為UCCI引擎,有若干可以設定的參數(可以直接在<象棋巫師>中設定)。
(1) 開局庫:
預設的開局庫為ElephantEye 程式(ELEEYE.EXE)目前目錄下的BOOK.DAT,含有10,000個對稱局面的著法。
(2) 思考時間:
限定思考深度通常不是很好的選擇,建議在給定限時讓程式自動分配時間。而在解殺局或分析局面時,則可讓程序無限制思考,並可隨時中止思考。
(3) 置換表大小:
儘管置換表大小對程式的運行速度影響不大,預設16MB的設定已經足夠,但ElephantEye 還是提供了設定置換表大小的功能。在記憶體允許的情況下,下慢棋時可以適當增加置換表的大小,但建議不要超過實體記憶體的一半。
(3) 裁剪程度:
為加快程式的運算速度,ElephantEye 預設使用空著裁剪,並且產生負面影響的可能性很小。只有最低等級會停用空著裁切。
(4) 知識量:
知識量和局面評價的準確性有關,在ElephantEye 的知識量等級中,只有最低級別是不採用局面評價函數的(只考慮子力價值),在解排局等不需要依靠審局知識來分析的局面時,可以嘗試用這種設定。
(5) 隨機性:
ElephantEye 設有4級隨機性。隨機性越大,程序越有可能走出它認為不是最好的著法,但「不是最好的著法」並非一點好處也沒有,尤其在沒有啟用開局庫時,適當增大隨機性,可以避免程序在相同的局面下走出一樣的著法。
四、規則
從2.0版開始,ElephantEye除了支持“單方面長將判負”的規則外,還支持“長打判負”,“打”包括“將”和“捉”。由於程序複雜性方面的限制,只有以下三種情況被辨識成「捉」:
A. 馬捉車或有根的砲兵(卒);
B. 車捉有根的馬砲兵(卒);
C. 砲捉車或有根的馬兵(卒)。
儘管ElephantEye 在複雜的情況可能無法正確識別長打,但由於支持UCCI命令banmoves ... ,一旦用戶認為引擎走了“長打”的禁著,可以用<象棋巫師>的“設置禁著”功能讓引擎強制變著。
五、博弈演算法
ElephantEye 屬於偏向蠻力的象棋程序,使用了嚴謹而有效的博弈演算法:
(1) 使用位元行和位元列的著法產生器:
位行(BitRanks)和位元列(BitFiles)有利於滑動棋子(車和砲)的著法(尤其是吃子著法)生成,位行和位列可以用查表來代替在射線上做的循環運算。在ElephantEye 中,位元行和位元列的技術不僅用在著法產生器中,也用到了牽制的判斷上。
(2) 靜態局面搜尋:
在做靜態搜尋時,ElephantEye 搜尋了吃子或解將的著法,在搜尋吃子著法時,ElephantEye 過濾掉不重要的吃子,例如吃不過河的兵、吃不處於防守中的士象等著法,都不在靜態搜尋的範圍內。
(3) 循環著法和長將檢測:
ElephantEye 可以辨識循環著法,出現循環著法時可以判斷哪方為長將,並且會利用禁止長將的規則來謀求優勢,但目前ElephantEye 還無法識別長捉。
(4) 置換表:
ElephantEye 參考了中國象棋程式「縱馬奔流」的設計思路,使用深度優先和始終覆蓋的雙層置換表,並採用低出(高出)邊界修正的置換表更新策略。
(5) 有檢驗的空著裁切:
ElephantEye 使用R=2 的空著裁剪,在殘局階段使用帶有檢驗的空著裁剪。
(6) 迭代加深/吃子著法/殺手著法/歷史表啟發:
ElephantEye 的著法排序非常簡單清晰,依序是迭代加深著法、好的吃子著法、殺手著法和依歷史表排序的生成著法。
(7) 將軍/唯一應將延伸:
在選擇性延伸上,ElephantEye 採用了將軍和唯一應將延伸。
(8) Alpha-Beta主要變例搜尋:
ElephantEye 使用傳統意義上的遞歸式Alpha-Beta主要變例搜尋。
(9) 開局庫:
ElephantEye 的開局庫共包含了10,000個對稱著法,是從1990年到2005年全國象棋個人賽、團體賽、五羊杯、聯賽等8,000局頂尖比賽中提取的。
(10) 後台思考與時間分配策略:
ElephantEye 支援後台思考功能,同時提供了時段製和加時兩種時間分配策略,會自動合理分配時間。
六、開局庫
ElephantEye 的開局庫可由「ElephantEye 開局庫製作工具」製作。執行製作工具後,首先要選擇PGN棋譜所在的資料夾,然後儲存為開局庫檔案(通常是BOOK.DAT)。通常,用來產生開局庫的棋譜數量越多,產生的開局庫檔案就越大。
為了讓製作的開局庫對ElephantEye 生效,只需要把生成的開局庫檔案替換掉ElephantEye 目錄下的BOOK.DAT 即可,也可以在<象棋巫師>的「引擎設定」對話框中指定開局庫檔案。
七、局面評價函數庫
ElephantEye 從2.1版開始,程式的搜尋部分和局面評估部分就分離了,搜尋部分透過呼叫API函數的形式與局面評估部分耦合。
其他像棋程式設計師可以在ElephantEye 的基礎上更自由地發揮。根據LGPL協議,搜尋和局面評估這兩個部分都作為獨立的程式庫,並運用其中任何一部分都只需要公開該部分的來源程式。換句話說,如果局面評價部分沒有使用任何開放代碼,那麼程序設計師就沒有義務公開這部分的源程序,搜尋部分也是如此。
ElephantEye 的局面評估API函數介面定義如下:
A. 局面評價引擎名稱:const char *GetEngineName(void);
B. 局面預評價函數介面:void PreEvaluate(PositionStruct *lppos, PreEvalStruct *lpPreEval);
C. 局面評估函數介面:int Evaluate(const PositionStruct *lppos, int vlAlpha, int vlBeta);
其中PositionStruct 和PreEvalStruct 必須分別符合position.h 和pregen.h 中定義的結構。
八、原始程式
ElephantEye 的原始程式包含9個模組,內容大致為:
(1) ucci.h/ucci.cpp
UCCI指令解釋模組,包括Windows 和Unix 下的行輸入接收程式;
(2) pregen.h/pregen.cpp
Zobrist 陣列和著法預設表的生成模組。 ElephantEye 的預置表分為兩個部分,一是滑動棋子的著法預置表(包括不吃子、車吃子、炮吃子和隔兩子吃子),它是實現位行和位列技術的基礎;二是其他棋子的著法預置表,使得著法生成時避免了煩瑣的邊界判斷。
(3) position.h/position.cpp
主要描述著法和局面的資料結構及功能。局面的處理是本模組的重點,處理內容包括局面初始化、FEN串導入、棋子移動、殺手著法的合理性判斷、將軍判斷、長將和循環檢測、子力價值分調整等過程,還包括5個子力位置價值表。
(4) genmoves.cpp
著法生成器,包括生成吃子著法和生成不吃子著法的兩個,但不能只生成解除將軍的著法。在生成吃子著法的同時賦予每個著法以對應的MVV(LVA)(或稱準SEE)值。本模組還有一個專門判斷棋子是否有保護的函數,來計算MVV(LVA)值,對於有保護的棋子,計算MVV-LVA的值(小於零不計),對於無保護的棋子,只計算MVV的值。因此,判斷棋子是否有根的程式也包括在本單元中。
(5) hash.h/hash.cpp
置換表、歷史表和著法清單管理模組,包括置換表的分配和存取、主要變例取得等操作。
(6) book.h/book.cpp
開局庫讀取模組。
(7) movesort.h/movesort.cpp
著法列表排序模組。
(8) search.h/search.cpp
搜尋模組,除了靜態搜尋、完全搜尋和根結點搜尋這三個主要流程外,還包括迭代加深控制、後台思考、時間分配、搜尋參數統計和搜尋資訊輸出等內容。該模組是整個程式的核心模組。
(9) eleeye.cpp
主程式(即main 函數)。
(10) preeval.h/preeval.cpp
子力位置數組預生成器,ElephantEye 根據「進攻/防守」和「開局/中局/殘局」兩個參數線性調整子力位置數組。
(11) evaluate.cpp
局面評價函數,ElephantEye 採用了四級偷懶評價的機制,最粗的層次只評價特殊棋型,進一層次評價牽制,再進一層次評價車的靈活性,最高層次還評價馬的阻礙。
九、程序表現
ElephantEye 的設計重點在搜尋演算法,但在知識上比較欠缺。在2.8GHz的處理器上每秒可搜尋約1,000,000個結點(包括常規搜尋和靜態搜尋),一般的中局局面在1分鐘內可搜尋約11層。
在棋力上,ElephantEye 和「棋隱」、SaoLa (象棋挑戰者)等程式具有同等水平,但由於局面評估函數上的缺陷,ElephantEye 距離頂尖的商業象棋軟體(謝謝大師、象棋世家、象棋奇兵、棋天大聖等)尚有一定的差距。
ElephantEye 在聯眾、弈天等象棋對弈網站上作過測試,用等級分來衡量,聯眾網的戰績在2500分左右,弈天網快棋的戰績在2000分左右,慢棋在1500分左右。
2005年9月在台灣象棋軟體愛好者施金山先生的幫助下,ElephantEye 參加了在台北舉行的第10屆ICGA電腦奧林匹克大賽中國象棋組比賽,戰績是7勝5和14負,在14個程式中排名第11;2006年8月ElephantEye參加了在北京舉行的全國首屆電腦博弈錦標賽,戰績是7勝2和11負,在18個程式中排名第7。
十、相關資源
ElephantEye的原始程式發佈在SourceForge的XiangQi Wizard專案中,其頁面為:
http://sourceforge.net/projects/xqwizard/
ElephantEye的版本改進,即時同步地發佈在SourceForge的SVN網站上,取得位址是:
https://xqwizard.svn.sourceforge.net/svnroot/xqwizard/
您可以使用TortoiseSVN 等SVN客戶端程式取得到最新的(跟開發者完全同步的)程式碼,TortoiseSVN 的使用介紹和下載位址是:
http://sourceforge.net/projects/tortoisesvn/
ElephantEye 必須在支援UCCI(如<象棋巫師>)的象棋程式下運行,<象棋巫師>安裝程式包含了最近一個版本的ElephantEye。
<國際象棋巫師>可到下列網站下載:
http://www.skycn.com/soft/24665.html (天空軟體站)
http://www.onlinedown.net/soft/38287.htm (華軍軟體園區)
ElephantEye 的來源程式包除了ElephantEye 本身的原始程式外,還包括以下幾個附加模組:
(1) 基礎程式碼(base):提供了組譯指令、系統函數呼叫等功能;
(2) 中國象棋規則模組(cchess):為其他軟體使用ElephantEye 程式碼提供了介面;
(3) 開局庫製作模組(BOOK):製作開局庫BOOK.DAT的程式碼;
(4) UCCI引擎聯賽模擬器(LEAGUE):為UCCI引擎測試和比賽提供了自動批量對局的平台;
(5) UCCI引擎搜尋樹分析器(TREE):UCCI引擎(支援UCCI 2.2+)的搜尋路線分析工具;
(6) XQF棋譜工具(XQFTOOLS):提供XQF等多種棋譜轉換為PGN的工具;
(7) 淺紅象棋適配器(UCCI2QH):為淺紅象棋呼叫UCCI引擎提供了介面;
(8) 淺紅象棋引擎支援UCCI的適配器(QH2UCCI):為「夢入神蛋」淺紅象棋加入UCCI引擎測試提供了介面;
(9) BBS Chess(BBSCHESS):一個用Visual Basic 製作的西洋棋局面設定工具,可在各大學BBS上貼上彩色的西洋棋局面;
(10) 棋盤圖片產生器(FEN2BMP):一個可以把西洋棋和中國象棋的FEN檔案轉換成BMP檔案的實用工具;
(11) 編碼轉換(codec),包括簡繁轉碼、UNIX文字轉碼、Base64轉碼等;
(12) 其他工具(MISC):包括簡易網路通訊、管道測試等工具;
(13) 說明文檔(DOC):即《中國象棋程式設計探索》系列連載;
(14) 參賽棋譜(CCGC):ElephantEye 參加首屆全國電腦遊戲錦標賽(CCGC)的全部棋譜。
如果要獲得關於ElephantEye 的更加詳細的信息,可登入象棋百科全書網:
http://www.xqbase.com/