1. 程式人生 > >中國象棋殘局庫構建[抄]

中國象棋殘局庫構建[抄]

出現 攻擊 屬於 war 然而 國際 告訴 mov cd-rom

殘局庫是經特別算法產生的特定格式的、儲存各限定棋子數目的殘局之所有局面及其估值的數據庫文件集合。概述地說,殘局數據庫是儲存了殘局局面並經回溯分析計算過的數據庫文件,它使用在棋弈程序上,當進入殘局時,只要適合使用的殘局數據庫文件存在,程序將走得非常完美。 多數棋弈引擎並不一定要到達殘局庫所涵蓋的局面時才使用殘局庫。例如,在到達如此局面之前幾步,引擎計算(但還沒走棋)一系列交換之後直接進入殘局庫裏存有的局面。引擎於是搜索探查殘局庫並取得那個設想局面的結果。如此當然提高了棋力。

在殘局庫的開發方面,Ken Thompson仍然是先導者。80年代期間,他開始制作4子和5子的殘局庫。一個典型的5子殘局如:王雙象對王單馬,就包含有121,000,000種不同的局面。如果再加一個兵,那麽局面數會增加到335,000,000。為此,Thompson專門編寫了程序,用於生成所有可能的局面並計算出每一個強制性的變化。然後他又通過某種方式將計算數據壓縮,使得一張標準的CD-ROM上可以存放20個不同的殘局。

殘局庫格式是多種多樣的,包括肯·托普森式(Ken Thompson)、史蒂文·愛德華茲式(Steven J. Edwards)、歐根尼·納利莫夫式(Eugene Nalimov)以及Chessmaster9000專用的EDGB殘局庫格式。  不過總的來說它們劃分為兩種殘局庫類型:將殺步數(DTM)類型和變換步數(DTC)類型。粗略地以非專業語言來說,彼此之間區別如下:  將殺步數(DTM)類型:即Distance to mate,這種類型的庫為每一個局面儲存最短的將殺可能(以層,即ply來計算,一層相當於半個回合)。例如Nalimov殘局庫。  變換步數(DTC)類型:即Distance to conversion,這種類型的庫儲存每一個局面及其一個“轉換”之間的最短層數。所謂一個轉換,指或者是兵升變,或者某子被吃去,或者出現將殺。例如Thompson殘局庫。  另外,無論是DTM還是DTC類型的殘局庫,都不能識別50回合自然限著規則。為了克服它們的缺點,已經提出了DTZ和DTR另外兩種類型。但至今只停留在理論上。  說到具體每種格式的區別,還不能簡單就說得清楚的。Crafty的作者於2000年10月在新聞組作過如下解釋:  “Edwards式:屬於將殺步數(DTM)類型。Edwards式的主要問題是這種殘局庫體積比其它的龐大。  “Nalimov式:也屬於將殺步數(DTM)類型,但Nalimov式的殘局庫文件是壓縮的,也可以以壓縮形式使用而無不利之處。對於擁有全部3、4、5子殘局的殘局庫,別的格式其文件總數大小超過30G,而使用這種格式的大約只有7.5G。  “Thompson式:屬於變換步數(DTC)類型(每當發生吃子,殘局的‘級數’都變小)。這種格式難以以壓縮形式使用,相對於Nalimov式,它提供的信息也不相同……比如,它告訴你一些信息,卻沒有區分是負還是和,而Nalimov式對此則有區分。  “Nalimov式是最佳選擇。幾乎每個引擎都支持它……”  當然,他沒有提及僅是Chessmaster9000專用的EDGB格式殘局庫,因為EDGB是2002年8月才發布的。Nalimov式仍然是最流行的在用殘局庫格式,因此我想再多談一點這種格式。  Nalimov式幾近“完美”,因為它把吃過路兵也考慮進去了。但是沒把王車易位也考慮進去。只不過,大概只有排局迷才會對此計較。  總的來說,現代幾乎所有的國際象棋程序包括大多數Winboard引擎使用Nalimov式殘局庫,一部分原因是它們不設版權,一部分原因它們更高效。現在Nalimov式殘局庫已經出了部分6子殘局庫。Nalimov式殘局庫有兩種形式,壓縮的和非壓縮的,壓縮的以“emd”為文件後綴。  多數現代棋弈程序能解壓使用壓縮的殘局庫,例如Crafty從16.5版本後就支持壓縮的Nalimov式殘局庫。我註意到有個Winboard引擎Esc只能用非壓縮的。  殘局庫還有其它一些格式,但比較少見。比較著名的,商業性高級棋弈軟件Nimzo8使用它的Nimzo殘局庫,這種殘局庫放入到內存中使用,因此讀取比較快。一直沒有公開發表但棋力不俗的Ferret也使用它的專用殘局庫。我文章余下部分,除非特別說明,殘局庫都是指Nalimov式。

殘局庫是通過特定算法生成的滿足某一子力條件的全部局面的勝負和判定信息,一般也包括在區分勝負時距離將死或吃子最近的步數的信息。

原理:後退式算法。以炮兵單士象對士象全為例說明如何生成。以下的文字只闡述殘局庫算法的最一般的原理和思想,不能保證細節上與現存的各殘局庫計算程序的代碼完全吻合。
1 將全部的炮兵單士象(紅)對士象全(黑)的局面以及可能由炮兵士象全對士象全的局面通過吃子得到的局面編號,區分紅先黑先。
2 標識出以上局面中,黑方被將死或者困斃的局面。
3 選擇出輪紅走,可以形成2中局面的局面,稱為紅一步勝局面。
4 從輪黑走的余下的(指不包含2中局面)局面中選擇出無論走哪一步下一步均會進入紅一步勝局面的局面,稱為黑兩步負的局面。

5 從輪紅走的余下的局面(指不包含3)中選擇出能夠保證下一步進入黑兩步負的局面,稱為紅三步勝局面。
6 從輪黑走的余下的局面中(指不包含2、4)選擇出無論走哪一步下一步均會進入紅三步勝的局面,稱為黑四步負局面。
.
2k+3 從輪紅走的余下的局面中選擇出能夠保證下一步進入黑2k步負的局面,稱為紅2k+1步勝局面。
2k+4 從輪黑走的余下的局面中選擇出無論走哪一步下一步均會進入紅2k+1步勝的局面,稱為黑2k+2步負局面。
如此下去,由於總的局面數有限,一定會出現某一步,以上的步驟不再生成新的局面。那麽以上的全部局面則是全部的紅先必勝,黑先必敗的局面。其余的局面均為和棋。

實際上,由於存在吃子關系,大多數殘局庫一般都是由較少子力往上生成的而不是直接按照以上的步驟一次性生成可能存在若幹次吃子的殘局庫。我們一般首先算子力較少時的殘局庫,然後往上增加子力。在生成子力較多的殘局庫時可以利用子數較少的殘局庫。如生成炮兵士象對士象全的殘局庫時,首先需要選出炮兵士象及士象全都在盤面上時的將死及困斃的局面,以及可能通過一次吃子進入的必勝必敗局面,即由炮兵士象對士象全局面,紅通過一次吃子,進入的炮兵士象對單缺士等的黑必敗的局面(已經算好並儲存在相應的殘局庫),或者黑無法避免通過一次吃子,形成炮或者兵士象對士象全的紅必勝的局面(已經算好並儲存在相應的殘局庫)。然後運用上面所述的倒推的算法將全部的必勝必敗的局面算出。顯然,這裏面直接算出的步子是局面轉化的步子,而不是直接距離將死的步驟。這樣的計算較為經濟節省。但是缺點也很明顯,無法直接說出某個紅(或黑)必勝的局面距離將死的步數,只能說出距離吃子最近的步數。有時候二者還是有區別的。

另外,中國象棋存在一個復雜的因素,即禁止長將長捉等等循環的攻擊性著法。以上的殘局庫算法不能考慮到這一點,必須進行修正。對於亞洲棋規來講相對還比較簡單,先按照以上的步驟生成允許長將長捉的殘局庫。然後標識出紅或者黑可以進行長將的局面。從中選取變招則進入必敗的局面。然後向後遞推,直到不能生成新的局面。將以上的局面標記成order=1的紅勝或負的局面。然後從長將的局面中選取出,變招則進入order=1的局面的的局面,繼續後推,直到封閉,生成order=2的局面。如此向後,直到窮盡全部的長將長捉的局面。那麽余下的全部局面就是亞規的真正的和棋局面。當然,這樣的算法導致步數的計算十分復雜,是殘局庫有時候不能正確給出距離吃子最近乃至距離將死最近的招法的根源。但是,關於勝負和的信息依然是絕對正確的。而中國棋規就過於復雜,目前基本不能在殘局庫層面實現。

殘局庫和棋軟的區別,為何殘局庫能夠計算出某些長達幾百步的勝局而棋軟不行。

通過殘局庫計算出長達幾百步的勝局,乃是中國象棋和國際象棋共有的情況。由於殘局庫算法的科學性,這些結論是不需要被質疑的。但是有人會問,為強機強棋軟都很難在殘局局面算超過50步,殘局庫怎麽可能在雙核機上算出200步的勝局?根源還是在算法的根本不同。殘局庫的計算量主要取決於局面總數,一般來說類似於炮兵士象全對士象全的殘局,局面總數即使是極度粗糙的包含大量冗余的估算,也就10^10數量級。而棋軟的計算主要是向後遍歷博弈樹,計算量主要取決於分支數和回合數。還是這個殘局,一個回合的變化數大致在150至200(炮兵方20左右,士象全方7-10)上下。那麽要是窮舉計算僅僅10回合的全部變化就已經在10^21量級,可以說是大大高於殘局庫的計算復雜度,即使是現有的棋軟都有非常有效的裁剪,基本上也很難支撐100步以上,更何況裁剪在這種情況下往往是有害的。這也是為什麽強軟強機也不能算出數百回合的必勝,而殘局庫算法在弱機上就能算出來的原因。

現有殘局庫能夠算出哪些殘局,算不出哪些。

一般來說64G內存能夠在可容忍的時間內算出的殘局局面能夠復雜到車兵對馬炮雙士這樣的量級。這個殘局庫的大小已經有4.6G。 像馬炮全對馬全這樣的殘局,乃至局面總數更多的,所需的內存已經達到3800多G,短期內是不能被算出來的。大多數江湖殘局的主體局面都是目前不能被殘局庫解決的。如大征西的主體局面車炮兵對車炮相,要3800多G內存,帶子入朝的主體局面車卒象對車雙兵士,需要2700G內存。顯然它們在可預見的時間入殘局庫的可能性是零。

然而,殘局庫依然解決了不少靠人力難以解決的深度驚人的實用殘局。如炮高兵單士象必勝士象全就是個著名例子。只是由於亞規允許一將一捉等,導致不少有車殘局算出的和局存在著劣勢方實負的可能,但是算出的必勝是絕對正確的。

參考資料

https://tieba.baidu.com/p/3463112599?red_tag=1810576185
https://baike.baidu.com/item/%E6%AE%8B%E5%B1%80%E5%BA%93/8728859?fr=aladdin
http://www.zgxqds.com/blog/article.asp?id=24031

中國象棋殘局庫構建[抄]