它如何思考

暗棋以自己獨特的方式隱藏資訊:每枚棋子起初都背面朝下,翻開一枚,就會從剩下的棋子裡隨機翻出一枚。因此和西洋棋不同,引擎的搜尋樹裡既有普通著法,也有隨機事件。MistyBanqi 把翻子當作一個機率節點,對這枚棋子可能翻出的各種身分取加權平均;其餘部分則像經典西洋棋引擎那樣搜尋:向前推演雙方可能走的著法,再把最佳一路的價值回傳上來。

它做不到的是憑感覺判斷盤面。這棵搜尋樹的每個葉子節點,都由一套手寫的評估來打分:基於一張修正過的子力價值表的子力(炮靠隔子吃,是盤面上最危險的棋子)、每枚棋子控制多少格、將帥有多暴露,以及另外一些項。引擎的水準完全取決於這些項的好壞——下面要講的弱點正源於此。

大多數時候,它會贏

MistyBanqi 能贏過大多數人,而它取勝的方式正是經典引擎的方式:往前算上好幾步的吃子。逐步回放下面這盤它把對手清光的棋。暗棋的局勢隨翻子起伏,這盤裡它開局甚至一度子力落後,隨後一步步扳了回來,直到對手沒有棋子可走。每枚棋子第一次被翻開時,會翻出它所發到的身分。

這種一子一子算下去的計算,是它棋力強的那一半。盲點是另一半:當勝利不再需要吃子、只需要耐心時,會發生什麼。

它會把贏定的棋下成和棋

同樣這個引擎,下面處在一個它已經完全贏定的局面。它以十子對兩子領先,已經沒有子可吃,唯一要做的就是把勝勢走到底。結果它卻下成了和棋。

評估裡沒有任何一項會因為「把優勢轉化為勝利」而比「單純守住子力」給更高的分,於是一個遙遙領先的局面和一個真正已經贏下的局面,得分幾乎一樣。既然沒有哪一項促使它取得進展,它就只是來回挪子,而暗棋的三次重複局面規則便把這盤判成和棋。

這對你有個實用的啟示。如果你子力落後,並不一定就輸了:用長捉纏住它的一枚大子,MistyBanqi 可能就一頭走進那個它看不出自己本該拒絕的和棋。

它也可能丟掉自己的將帥

另一個相關的盲點和將帥有關。只有兵(卒)能吃將帥,而當將帥被逼到角落時,引擎遲遲不為它騰出退路。有時它會把一枚棋子調到棋盤另一頭,任由一枚孤零零的敵方兵走上來把將帥困死。這和上面的和棋是同一類毛病:評估對一個緩慢、安靜、還要好幾步才成形的威脅,沒有真正的感覺。

這些問題各自是如何被發現、重現並量化的,下面連結的工程部落格文章裡有詳細記錄。

為什麼會有這些問題,以及下一步

這些是手寫評估的侷限:它只能給有人想到要編碼進去的東西打分,而「把勝勢轉化為勝利」和「緩慢圍獵將帥」恰恰是那種很難寫成規則的長程判斷。最強的暗棋程式採用的解法,是一套從對局勝負中學習得到的評估,讓引擎能自己判斷這些。這也是 MistyBanqi 終將邁出的下一步。在學習版於測試中越過現有引擎這道門檻之前,你面對的仍是手寫版:強,且對自己會在哪裡出問題保持坦誠。

來下一盤

MistyBanqi 已在 Mistboard 上線。來按你選擇的強度挑戰它,或閱讀它如何被打造與衡量的完整記錄。

對戰 MistyBanqi工程幕後故事暗棋規則