鬥獸棋(叢林棋)引擎:傳統搜尋勝過學習式評估
簡而言之
- MistyJungle 是一個以 Rust 寫成的傳統鬥獸棋引擎,對上我能執行的最強開源引擎拿下 W11-L2-D187,約 +16 Elo。
- 在 800 個局面中有 779 個與精確的四子殘局庫相符,且沒有任何勝/和/負判斷錯誤。
- 我原本預期有幫助的兩項升級都沒用:學習式評估從未勝過手寫評估,而在搜尋葉節點使用殘局庫則損失約 13 Elo。
- 已發表的殘局資料庫止步於四子,完整遊戲很可能仍是未解之局。
我做了 MistyJungle,一個以 Rust 寫成的傳統鬥獸棋引擎,棋盤為 7×9,英文通常稱為 Jungle 或 Animal Chess。你可以 在 Mistboard 上與 MistyJungle 對弈。它使用 alpha-beta 搜尋、手工打造的評估、重複局面處理,對弈版本中沒有任何神經網路。
10 月 7 日更新:MistyJungle 已不再是 Mistboard 上最強的鬥獸棋機器人。9 月,自我對弈類神經網路 KataGo-AnimalChess 在 200 局中以 82-0 外加 118 局和棋擊敗了它,奪下最高席位;MistyJungle 現在是排在它下面、較容易對付的機器人。
成果不大,但真實。對上我能執行的最強開源引擎,200 局拿下 W11-L2-D187,在一個偏和棋的遊戲裡約為 +16 Elo,而它的四子殘局下法與精確殘局庫相符,沒有任何勝/和/負判斷錯誤。我原本預期有幫助的兩項升級,學習式評估與搜尋葉節點的殘局庫,都沒有奏效。真正發揮作用的是傳統搜尋。
我做了什麼
一個獨立的 Rust 引擎,附帶小型的 UCI 風格協定,可從命令列使用,也可透過 PyO3 從 Python 使用。棋力取決於節點預算,而不是時鐘,因此同一個局面在任何機器上都會回傳同一著。
技術堆疊很常規:帶迭代加深的 negamax alpha-beta、Zobrist 置換表、對吃子與進獸穴著法的靜態搜尋、killer/history 著法排序搭配 PVS 與後期著法削減,底下是一套手工打造的評估,計算子力、獸穴競速、陷阱、水域與機動性。這些排序與剪枝的打磨,在固定節點預算下實測值得 +49 Elo。
評估必須先做到精確,學習式修正才可能帶來任何增益。鬥獸棋子力權重很重,卻充滿尖銳的例外:鼠制象、落入陷阱的棋子失去階級、一步踏進獸穴就結束比賽。
規格
雙方各有八隻動物在 7×9 的棋盤上,踏進對方獸穴或吃掉對方所有棋子即勝。規則因地區而異,所以採用哪一套很重要。我用的是 2026 年 6 月時的 Mistboard 規則,其中狼大於狗(有些資料把兩者互換)。其中一條規則後來改了:當時虎只能縱向跳河,這個讀法來自英文維基百科,而中文規則(騰訊的 QQ游戏、萊頓的頁面)給虎與獅相同的跳躍能力。Mistboard 與 MistyJungle 0.0.6 在 2026 年 9 月改用中文規則;本文中的棋局是在舊規則下進行的。
吃子順序,由強到弱

象
獅
虎
豹
狼
狗
貓
鼠每隻動物可吃其右方各子。鼠另可吃象。位於對方陷阱中的棋子階級視為零。
除了單純的按階級吃子之外,還有三條規則造就了這個遊戲的戰術:
- 鼠可吃象,但只限陸上。最弱的棋子能吃掉最強的棋子。不過吃子不能跨越岸邊,因此游入水中的鼠除了另一隻鼠之外不受任何威脅。
- 獅與虎可跳河。只有鼠能進入水中。大貓則改為橫向或縱向整條跳過河到對岸,除非有鼠停在水中阻擋跳躍。
- 落入陷阱的棋子失去階級。每個獸穴周圍的三格為陷阱。站在其上的敵方棋子階級降為零,因此任何棋子,甚至是鼠,都能吃掉它。
完整規則與可對弈棋盤:mistboard.com/rules/jungle。
結果
在一個強引擎多半下成和棋的遊戲中取得的小幅優勢:
| 測試 | 結果 |
|---|---|
| 開源基準,200 局 | W11-L2-D187,約 +16 Elo |
| 搜尋打磨(排序、PVS、LMR) | +49 Elo,配對自我對弈,p = 0.008 |
| 四子殘局庫核對 | 779/800 相符,0 次勝/和/負矛盾 |
| 五子與六子 | 對上深度 8 倍的搜尋 >99%(代理指標,非證明) |
| 搜尋葉節點的殘局庫 | W37-L40-D3,約 -13 Elo |
| 殘差式神經評估 | 最佳約 -70 Elo |
+49 是最難量測的一項。兩個實力相當的鬥獸棋引擎和棋太多,無法用勝率作為門檻,所以我採用配對、交換先後手的自我對弈(每個開局都下正反兩遍,新搜尋對舊搜尋),再對決勝局做符號檢定。
資料
殘局與求解進度的現況
小型殘局可用逆向分析攻克,而且它們是極佳的裁判。Van Rijn 與 Vis 於 2013 年在萊頓解出四子(依萊頓慣例,狗與狼互換),此後我找不到更大的已發表結果。我的引擎在 800 個局面中有 779 個與精確的四子下法相符,沒有勝/和/負矛盾,並在五子與六子上與深度 8 倍的搜尋吻合超過 99%。
四子資料庫仍是前沿,而擋在其後的牆是儲存空間,不是求解技術。問題出在棋盤:63 格對上翻棋鬥獸棋的 16 格,因此每多一子就有大約 60 個空格可站,而不是十來個,每一層的大小成長速度約快五倍。五子的翻棋鬥獸棋在我的筆電上只要 2.8 GB;五子的鬥獸棋則約需 7 TB。八子以上,也就是初始子力的一半,以資料庫形式已不可及,也沒有人對完整十六子的遊戲做出正向證明。鬥獸棋已解到四子,之上仍未解,而且很可能維持這樣。
2026 年 9 月 27 日更正:本文先前的版本稱前沿為七子。這個數字來自一篇 2019 年論文中的引用,查證後發現它指向萊頓一篇關於 Jungle Checkers 的論文,那是另一種遊戲。
在搜尋葉節點載入殘局庫對棋力也毫無助益(約 -13 Elo):在容得下的規模上搜尋本來就能找到答案,而真正需要幫助的規模則根本做不出來。來自翻棋鬥獸棋版本的一點提醒是,同一個實驗一開始也顯示為無效,後來才發現藏著一個錯誤:那些表只儲存勝/和/負而沒有距離,而只有勝/和/負的葉節點會讓引擎在已勝的殘局裡無限拖延而不收官,因為每一著獲勝著法的分數都一樣。把 DTM(將死距離)加進表裡就修好了那邊的收官問題。我的鬥獸棋葉節點探查同樣只有勝/和/負,所以那 -13 有一部分可能是同樣的效應,而不是殘局庫在葉節點真的沒用。未經測試;無論如何,出貨的傳統引擎都不帶這個探查。
學習式評估
這部分卡在資料,而不是架構。一個殘差網路(手寫分數加上有界修正)隨著我修正標籤,從 -470 Elo 爬到約 -70 Elo,但始終沒能勝過手寫評估。標籤最弱的地方恰好正是網路最需要幫助的地方:和棋偏多的自我對弈對子力擺盪的呈現不足,精確的殘局庫標籤只涵蓋小型殘局,而搜尋評估值的標籤大多只是教網路模仿它本來就有的搜尋。
AlphaZero
仍是未完成的工作。我沒有跑完整的鬥獸棋 AZ 攀升。鄰近的暗棋 AZ 風險驗證沒過門檻,但那是不同的遊戲,並不能否定 AZ 在鬥獸棋上的可行性,而鬥獸棋是更友善的場地:決定性且完全資訊,沒有機率節點的揭示。我把它擱置,是因為便宜的那一階是負面的,而傳統引擎已經勝過基準了。
對局範例
這場對抗賽大多是和棋,但決勝的棋局顯示了優勢的形狀:先施加獸穴壓力,子力其次。棋盤是從接近轉化的位置開始呈現的,想看開局請往前回放;全部六局都收在 Mistboard 上的一份研究裡。它們是在 Mistboard 到 2026 年 9 月前使用的「虎只能縱向跳河」規則下進行的。
MistyJungle(黑方)建立子力優勢,最後以獅進入紅方獸穴收官:
另一局黑方獲勝,是較短的擠壓,在陷阱周圍的兌子之後,最後一子抵達 d1:
一局紅方獲勝,說明為什麼不能只算子力:MistyJungle 子力落後,卻贏下獸穴競速:
保存下來最長的一場勝局,紅方磨了 283 著才抵達獸穴:
引擎以每著 800 萬節點自我對弈,大約各五秒:一場漫長的均勢對抗,紅方守著一子的優勢四十個回合,然後完成轉化,把獅走進黑方獸穴:
更戲劇性的一局,同樣是 800 萬節點的自我對弈:紅方讓黑方保住象、獅、虎,子力落後十六點,卻仍靠著在子力發揮作用之前把鼠搶進獸穴而獲勝。這最清楚地說明了引擎實際在最佳化什麼:
結論
MistyJungle 是一個傳統搜尋引擎,對我能執行的最強開源引擎握有幅度不大但可量測的優勢。真正推動棋力的工作都不華麗:正確的規則、固定預算的量測、交換先後手的測試、搜尋打磨,以及殘局驗證。殘局庫很擅長當裁判,但在葉節點沒有幫助,第一階的神經嘗試輸給手寫評估,而真正的 AlphaZero 攀升仍是未完成的工作。
資源:
- 在 Mistboard 上與 MistyJungle 對弈,或閱讀規則。
- misty-jungle:引擎本體,以 Rust 撰寫。
- Layheng-Hok/Jungle-Chess:我用作固定基準的開源引擎。
- Bagheera:萊頓的閉源引擎,以及我用來評分的殘局庫。
- 引擎系列的其他文章:打造一個暗棋引擎,在中國暗棋上運用同樣的量測紀律。