闘獣棋(どうじゅうき):古典的探索が学習評価関数に勝った
7×9盤の闘獣棋(どうじゅうき)向けに、古典的なRustエンジンMistyJungleを作った。 MistboardでMistyJungleと対戦できる。アルファベータ探索、手作りの評価関数、繰り返し局面の処理を使い、対局版にはニューラルネットワークは入っていない。
成果は小さいが実質的なものだ。動かせる中で最強のオープンソースエンジンに対し、200局で11勝2敗187引き分け、引き分けの多いゲームで約+16 Eloに相当する。そして4駒の終盤は厳密なテーブルベースと一致し、勝ち/引き分け/負けの誤りはゼロだった。役立つと期待した2つの改良、つまり学習評価関数と探索の葉ノードでのテーブルベースは効果がなかった。仕事をしたのは古典的探索だった。
作ったもの
小さなUCI風プロトコルを備えた単体のRustエンジンで、コマンドラインからも、PyO3経由でPythonからも使える。強さは時計ではなくノード予算で決まるので、同じ局面ならどのマシンでも同じ手を返す。
構成は定石どおりだ。反復深化つきネガマックス・アルファベータ、Zobristハッシュの置換表、駒取りと巣への進入に対する静止探索、PVSと後期手縮小を伴うキラー/ヒストリー手順付け、その下に駒の損得、巣への競走、罠、水、機動力を評価する手作りの評価関数がある。この手順付けと枝刈りの磨き込みは、固定ノード予算で+49 Eloの測定値をもたらした。
学習による補正が何かを足せるようになる前に、評価関数自体が正確でなければならない。闘獣棋(どうじゅうき)は駒の損得が重いゲームだが、鋭い例外に満ちている。鼠は象を止め、罠にかかった駒は階級を失い、巣へ一歩踏み込めば対局は終わる。
仕様
各陣営は7×9盤に8種の動物を持ち、相手の巣に踏み込むか、相手の駒を全て取れば勝ちとなる。ルールは地域によって異なるので、どの版を使うかが重要だ。私は2026年6月時点のMistboard/Wikipediaのルールを使い、そこでは犬が狼より上位である(入れ替えている資料もある)。
捕獲順、強い順

象
獅子
虎
豹
狼
犬
猫
鼠各動物は右側の駒を取れる。鼠は象も取れる。相手の罠にいる駒は階級ゼロとして扱う。
単純な階級による捕獲を超えて、3つのルールがこのゲームの戦術を作っている。
- 鼠は象に勝つが、陸上でのみ。 最弱の駒が最強の駒を取る。ただし捕獲は岸を越えられないので、水に入った鼠は他の鼠以外のあらゆるものから安全だ。
- 獅子と虎は川を飛び越える。 水に入れるのは鼠だけだ。大型の猫科は代わりに川を丸ごと飛び越えて向こう岸へ渡る。獅子は横方向にも縦方向にも、虎は縦方向のみ。ただし水中に鼠がいると跳躍は妨げられる。
- 罠にかかった駒は階級を失う。 各巣の周囲3マスが罠だ。そこに立った敵の駒は階級ゼロに落ちるので、鼠でさえ何でも取ることができる。
遊べる盤付きの完全なルール:mistboard.com/rules/jungle。
結果
強いエンジン同士だとほとんど引き分けになるゲームでの、わずかな優位だ。
| テスト | 結果 |
|---|---|
| オープンソースのベンチマーク、200局 | 11勝2敗187引き分け、約+16 Elo |
| 探索の磨き込み(手順付け、PVS、LMR) | +49 Elo、ペア方式の自己対戦、p = 0.008 |
| 4駒テーブルベースとの照合 | 779/800が一致、WDLの矛盾は0件 |
| 5駒と6駒 | 8倍深い探索に対して99%超(proof ではなく代理指標) |
| 探索の葉ノードでのテーブルベース | 37勝40敗3引き分け、約-13 Elo |
| 残差型ニューラル評価関数 | 最良で約-70 Elo |
測りにくかったのは+49の方だ。互角の闘獣棋(どうじゅうき)エンジン同士は勝率で判定するには引き分けが多すぎるので、ペア方式で先後を入れ替えた自己対戦(各序盤を両方の手番で指し、新しい探索が古い探索と戦う)と、勝敗が決した対局への符号検定を使った。
データ
終盤と解決状況
小さな終盤は後退解析で解けるうえ、判定役として優れている。Van RijnとVisは2013年にライデンで4駒を解き、Bohrwegは2016年に7駒に到達した(犬と狼を入れ替えるライデン方式のもとで)。私のエンジンは800局面のうち779局面で厳密な4駒の指し手と一致し、WDLの矛盾はゼロ、5駒と6駒では8倍深い探索に99%超で追随した。
その7駒データベースが最前線で、その先の壁は解法技術ではなく記憶容量だ。問題は盤の大きさだ。めくり闘獣棋の16マスに対してこちらは63マスあり、駒を1つ足すごとに立てる空きマスが十数個ではなく60個ほどになるので、各レベルのサイズは約5倍速く膨らむ。めくり闘獣棋の5駒は私のノートPCで2.8 GBに収まるが、闘獣棋(どうじゅうき)の5駒はおよそ7 TBになる。開始時の駒の半分である8駒以上はデータベースとしては手が届かず、16駒の全体ゲームの前向き証明も誰も持っていない。闘獣棋(どうじゅうき)は7駒まで解決済みで、それ以上は未解決、そしておそらくそのままだろう。
探索の葉ノードで読み込むテーブルベースも、対局の強さには何も足さなかった(約-13 Elo)。収まるサイズでは探索がすでに答えを見つけており、役に立つはずのサイズは配布できない。ただしめくり闘獣棋の実装からの注意点がある。同じ実験は当初ヌルに見えたが、後にバグを隠していたと分かった。あのテーブルは距離なしで勝ち/引き分け/負けだけを保存しており、WDLのみの葉ノードだとエンジンは勝勢の終盤を仕留めずに永遠に維持できてしまう。どの勝ち手も同じ評点になるからだ。テーブルにDTM(詰みまでの手数)を加えたら、あちらの仕留めは直った。闘獣棋(どうじゅうき)での葉ノード参照もWDLのみだったので、-13の一部はテーブルベースが葉で無用だからではなく、同じ現象かもしれない。未検証で、いずれにせよ古典エンジンは参照なしで配布する。
学習評価関数
ここで行き詰まったのはアーキテクチャではなくデータだった。残差型のネット(手作りのスコアに上限付きの補正を加えたもの)はラベルを直すにつれて-470から約-70 Eloまで上がったが、手作りの評価関数を超えることはなかった。ラベルが最も弱かったのは、まさにネットが助けを必要とする場所だった。引き分けの多い自己対戦では駒の損得の振れが過小にしか現れず、厳密なテーブルベースのラベルは小さな終盤しか覆わず、探索スコアのラベルはすでにあるその探索を模倣させるだけになる。
AlphaZero
これはまだ未着手の課題だ。闘獣棋(どうじゅうき)でAZの本格的な積み上げは走らせていない。隣接するバンチー(中国暗棋)でのAZのリスク検証は基準を満たせなかったが、それは別のゲームであり、闘獣棋(どうじゅうき)でのAZを否定するものではない。こちらは確定的かつ完全情報で、偶然ノードによる開示もなく、より条件が良い。安い段が負の結果で、古典エンジンがすでにベンチマークを上回っていたので、いったん棚上げした。
対局例
マッチはほとんど引き分けだったが、勝敗が決した対局は優位の形を示している。まず巣への圧力、次に駒の損得だ。これらの再生は決着近くから始まるので、序盤を見るには左へスクラブしてほしい。盤にタブで移動し、左右の矢印キーで進められる。
MistyJungle(黒)が駒得を築き、獅子が赤の巣に入って終わらせる。
もう一つの黒勝ち。罠周りの交換の後、最後の駒がd1に到達する短い締め上げだ。
駒の損得を数えるだけでは足りない理由を示す赤の勝ち。MistyJungleは駒を損するが、巣への競走に勝つ。
保存された中で最も長い勝ち。赤が283手かけて押し切り、巣に到達する。
1手800万ノード、それぞれ約5秒でのエンジン同士の自己対戦。赤が40手にわたって1駒の優位を保ち、そこから決めて獅子を黒の巣へ歩かせる長い互角の戦い。
さらに劇的な、同じく800万ノードでの同一エンジン同士の対局。赤は黒に象、獅子、虎を残させ、駒の損得で16点も遅れながら、その駒得が意味を持つ前に鼠を巣へ走らせて勝つ。このエンジンが実際に何を最適化しているかを最も明快に示している。
結論
MistyJungleは古典的な探索エンジンで、動かせる中で最強のオープンソースエンジンに対して、狭いが測定された優位を持つ。強さを動かした作業は地味なものだった。正しいルール、固定予算での測定、先後を入れ替えたテスト、探索の磨き込み、そして終盤の検証だ。テーブルベースは判定役としては優れていたが葉ノードでは役立たず、最初のニューラルの段は手作りの評価関数に負け、本格的なAlphaZeroの積み上げはまだ未着手の課題である。
リソース:
- MistboardでMistyJungleと対戦、またはルールを読む。
- misty-jungle:Rustで書いたエンジン。
- Layheng-Hok/Jungle-Chess:固定のベンチマークとして使ったオープンソースエンジン。
- Bagheera:ライデンのクローズドソースエンジンと、私が採点に使った終盤テーブルベース。
- エンジンシリーズの続き:バンチーエンジンを作る、中国暗棋に同じ測定の作法を適用した記事。