nyugyoku24

入玉宣言法24点法の終盤特化エンジンと、floodgate 186万局による実証

View the Project on GitHub soy-tuber/nyugyoku24

入玉宣言法24点法における将棋AIの到達限界

— floodgate 公開棋譜 186万局による実証と、終盤特化エンジンの実装

2026年8月


要旨

現代の将棋AIは27点法を前提に作られている一方、プロ公式棋戦は2013年10月以降 24点法を採用している。本稿は floodgate の公開棋譜 1,868,968局を走査して 相入玉 16,780局・片方入玉 89,865局を抽出し、この差が実戦でどう現れるかを測った。

  1. 24点法の勝ち(31点)は、定義上、相手から最低4点を奪わなければ到達できない。 各陣営の駒の総点は27点しかなく、宣言点数はその部分集合だからである。 無勝負(24点)は駒取りなしで到達できる。
  2. 2つの宣言条件は難易度が正反対である。「敵陣に10枚」は打ち込みで点数を 失わずに進むが、「31点」は駒取りでしか進まない。10枚条件を満たす局面が 少ないのは難しいからではなく、既存エンジンが目指していないためである。
  3. floodgate は2024年に Max_Moves を256手から512手に変更していた。これにより 相入玉局の宣言到達率が19.4%から41.4%へ跳ね上がる。年次比較は2024年で分割を要する。
  4. 冒頭の前提は、振る舞いだけでなく実装の水準でも確かめられる。dlshogi の入玉用 入力特徴62面は「宣言条件にあといくつ足りないか」を符号化しており、その閾値は 先手28点 / 後手27点、すなわち27点法がハードコードされている。

あわせて24点法を目的関数に持つ終盤特化エンジンを実装した。実戦のエンジンが 敵陣中央値6枚で止まった局面から、20手で4枚→13枚に到達する。


1. データ

floodgate(wdoor, 東京大学)公開アーカイブ 2008〜2026年、計 1,868,968局

各局を初形から再生し、終局図における玉の段で分類した。

  局数 割合
相入玉(両玉が敵陣三段目以内) 16,780 0.90%
片方入玉 89,865 4.81%
解析不能 8

再生結果を、CSAファイル末尾にサーバが記録した最終図と盤面・持ち駒の両方で照合し、 106,645局中106,376局(99.75%)が完全一致した。不一致269局はすべて中断局・ 千日手局で、相入玉には1局も含まれない。加えて「所有点数の先後合計が常に54点」 という不変量を全局で検査した(違反0件)。

2017年のアーカイブは欠落していたため補完した。同年はサーバ側で8月が欠落しており、 7月も805局のみなので、絶対局数を他年と直接比較しない。


2. 31点は駒取りを要する

各陣営の非玉の駒の総点は 27点である(飛角で10点、歩9枚で9点、金銀桂香が 2枚ずつで8点)。24点法が数える「持ち駒 + 敵陣三段目以内の駒」は、自分の駒の 部分集合にすぎない。したがって:

自分の駒だけをかき集めても、宣言点数の上限は27点にしかならない。

目標 必要な駒取り
無勝負(24点) 不要。自分の27点のうち24点を持駒か敵陣に置けばよい
勝ち(31点) 相手から最低4点を奪わねばならない

24点法の勝ちは、定義上「駒を取るゲーム」である。運び込みだけでは絶対に届かない。

同じ理屈で、27点法が後手有利である理由も説明できる。先手の閾値28点は最低1点の 駒取りを要するが、後手の27点は駒取りゼロで到達可能である。

守備側にも帰結がある。自駒を1枚も取らせなければ、相手は27点で頭打ちになり、 31点に永遠に到達できない。理論上の完全防御が存在する。敵陣は27マスあり 打ち込み自体は止められないので、止めるべきは侵入ではなく駒取りである。


3. 結果

3.1 2つの宣言条件は難易度が正反対

持ち駒は点数に計上されるが、10枚条件には計上されない。したがって 持ち駒を敵陣に打つと、点数を1点も失わないまま10枚条件が1枚進む。 逆に敵陣「外」に打つ手は、持ち駒(計上される)を自陣の盤上駒(計上されない)に 変える純損失である。

条件 満たす局面 達成手段 難易度
敵陣三段目以内に10枚 8.9% 打ち込み(点数不変で1枚進む) 易しい
31点 13.8% 駒取りのみ 難しい

10枚条件を満たす局面のほうが少ないが、これは難しいからではない。実装した エンジンは実戦のエンジンが止まった局面から20手で4枚→13枚に到達する(第4節)。

打ち切り局12,670サンプルのうち、27点を超えた(=相手から純増で点を奪えた)のは 22.0% にすぎない。78%は相手から1点も奪えていない。

3.2 漏斗

打ち切り引き分けとなった相入玉局を3段階に分けて数えた。

段階 割合 通過率
所有31点以上(勝ちの必要条件) 32.8%
かつ宣言点数31点以上(変換済み) 13.8% 42.0%
かつ敵陣内10枚(宣言勝ち) 2.8% 20.6%

3段階すべてで漏れている。所有31点を持ちながら変換できなかった側の 取り残し(敵陣外で死んでいる自駒)の中央値は7点だった。

3.3 局面の規模

相入玉が成立した瞬間の局面 1,200件を実測した。

  中央値 範囲
盤上駒数 24枚 14〜35
持ち駒総数 16枚 5〜26
合法手数 203手 11〜479
うち駒取り 3手(1.6%) 0〜21
うち駒打ち 160手(78.9%) 0〜428

分岐203、必要な深さ40〜80手で、完全求解は不可能である(10^132 のオーダー)。 一方で点数を動かす手は203手中わずか3手しかない。熱い局所ゲームが少なく 大半が手待ちという、囲碁のヨセと同型の構造である。

3.4 Max_Moves の変更

年次比較の前提が途中で変わっていた。

2016-2023: 'Max_Moves:256
2024-2026: 'Max_Moves:512

これにより2024年以降、相入玉局の打ち切り率が53%→3.9%に崩壊する。 強豪限定(各年の上位25%同士)で比較すると:

  宣言勝ち率 打ち切り率
256手時代(2021-2023) 19.4% 64.4%
512手時代(2024-2026) 41.4% 7.3%

手数上限を倍にしただけで宣言到達率が2倍以上になった。エンジンは27点を 作れないのではなく、256手では間に合わなかっただけである。

3.5 NNUE劣化仮説

相入玉局を宣言勝ちに変換できた率を指標に、レートインフレを補正して比較した。

年代 相入玉 宣言勝ち率
2014-2017 KPPT全盛 296 22.6%
2018-2020 NNUE移行 865 25.7%
2021-2023 NNUE定着 1,321 19.4%

NNUE移行時(2018-2020)はむしろ改善しており、劣化が現れるのは2021年以降である。 しかもその19.4%はKPPT期の22.6%とほぼ同水準で、「5年前のソフトより弱い」の 裏付けにはならない。年次では山谷であって単調な劣化ではない。

なお、強度制御をしない生データでは 17.5%→21.5%→28.7%→29.2% と一貫して上昇する。 プール全体が強くなったためである。強度を制御するかどうかで結論の符号が反転するため、 この種の主張の検証には強度制御が必須である。

3.6 dlshogi の入力特徴は27点法をハードコードしている

要旨の「現代の将棋AIは27点法を前提に作られている」は、ここまで振る舞いから述べてきた。 実装の側からも直接に確かめられる。

dlshogi の特徴抽出(cshogi.dlshogi)には use_nyugyoku_features というトグルがあり、 有効にすると FEATURES2 が 57面から119面に増える。この62面が何を符号化しているかを、 敵陣内の枚数 n と宣言点数 p だけを動かした合成局面で掃引して決めた。

62面 = 31面 × 2(手番側 / 相手側)。各31面の内訳は

offset 内容
0 玉が敵陣三段目以内
1..10 敵陣内の枚数 11 − n (1 ≤ n ≤ 10)
11..30 点数の不足 11 + (閾値 − p) (不足 0〜19)

閾値は先手28点 / 後手27点である。27点法が入力表現の水準で焼き込まれている。

符号化されているのは「いくつ持っているか」ではなく「あといくつ足りないか」であり、 これは第3.1節で不足量が束縛的だったことと一致する。設計としては当たっている。 ただし枠は20スロットしかなく、不足20点以上は1面も立たない(クリップではなく脱落である)。 24点法は閾値が31点と高いため、positions/aiiru_bench.tsv の1,000局面(先後別2,000標本)で測ると

ルール 不足の中央値 枠外(不足20点以上)
27点法(先手28 / 後手27) 10 11.3%
24点法(31 / 31) 13 22.6%

枠外に落ちる標本が倍増する。24点法へ移すなら、閾値を31/31にするだけでは足りず、 点数枠の拡張が要る。

測定したのは cshogi の Python 実装であり、dlshogi の C++ 側が同一かは別に確かめる 必要がある。tools/probe_dlshogi_nyugyoku.py で再現できる。


4. 実装

24点法を目的関数に持つ終盤特化エンジンを実装した(Python + cshogi)。

4.1 設計

所有点数と宣言点数の関係を書くと、

所有点数 = 自分の全駒(盤上どこでも)+ 持ち駒   … 先後合計54の保存量
宣言点数 = 持ち駒 + 敵陣三段目以内の駒
取り残し = 所有点数 − 宣言点数                  … 敵陣外で死んでいる自駒

宣言点数 ≤ 所有点数 であり、所有点数は駒取りでしか動かない。したがって目的は 2段階になる。

段階 目標 動く量
第1段階 所有点数を31以上にする 駒取り(相手と厳密に零和)
第2段階 取り残しを敵陣に運び込む+10枚 運び込み・打ち込み

フェーズ判定は書いていない。min(所有点数, 31) を評価に入れるだけで、 31に達した瞬間に飽和し、限界価値が自動的に変換側へ移る。

4.2 挙動

実戦のエンジンが敵陣4枚・28点で止まり、120手打ち切りになった局面から:

 0 先手 P*1b  敵陣へ打ち込み  n+1
 2 先手 G*1a  敵陣へ打ち込み  n+1
 6 先手 G*2a  敵陣へ打ち込み  n+1
 8 先手 G*7a  敵陣へ打ち込み  n+1
10 先手 R*4a  敵陣へ打ち込み  n+1
12 先手 L*5b  敵陣へ打ち込み  n+1   ← 10枚条件を達成
...
24 先手 6d5c  運び込み/取(1点)  p+6  → 32点
-> 宣言勝ち(26手)

敵陣内の駒数が4→13、点数は28→30でほぼ不変。持ち駒12枚を敵陣に投入するだけで 10枚条件が解けることを示している。

別の局面では、駒を1点も取らずに勝った(所有44点・宣言26点で始まり、 取り残し18点を運び込んで29手で宣言勝ち)。第3.2節で42%が失敗している 「変換」の段階だけを実行した例である。

4.3 重みの自動調整

11個の評価重みを SPSA(同時摂動確率近似)で自動調整した。適合度は固定した 相入玉局面での自己対局。引き分け局も宣言条件への到達率で連続採点し、信号を 捨てないようにした。符号は理論から確定しているので学習させていない。

特徴量 初期 調整後 倍率
所有点数(駒取りで動く保存量) 20.0 35.8 1.79
宣言点数 10.0 6.2 0.62
取られうる自駒(全体) −18.0 −0.3 0.02
取られうる自駒(敵陣内) −12.0 −10.2 0.85
安全に打てるマス 2.0 4.4 2.22

調整に使っていない局面での成績は 49勝14敗17分(決着局の勝率77.8%)

学習された重みは第2節の理論と整合している。所有点数の重みが1.79倍になり、 最適化が独立に「駒取りが支配的」と結論した。また「取られうる自駒」の項は 全体では実質ゼロに潰れ、敵陣内のものだけが残った——駒が取られること自体は すでに所有点数の項が値付けしており、追加の減点が要るのは点数と枚数を同時に失う 敵陣内の駒だけだからである。冗長な項と非冗長な項を最適化が自ら分離した。


5. 限界

現状は目的関数の実証と測定器であって、対局用のエンジンではない。


6. 今後

相入玉終盤は、両玉が安全になって詰みの脅威が消え、目的関数が「詰ます」から 「点を数える」に変わる。これは囲碁のヨセ——独立な局所ゲームの和で、各局所ゲームに 値があり、最適戦略は熱い順に打つこと——と同型である。 Berlekamp & Wolfe の Mathematical Go(1994)が扱った対象そのものだが、 将棋には持ち込まれていない。

第3.3節の実測はこの見立てを支持する。合法手203手のうち点数を動かすのは3手だけで、 残り200手は点数に一切影響しない。そして第2節により、争点は 「取れる駒/取られる駒」の集合に限定される。各局所戦の値はその駒の点数 (1点または5点)そのもので、値が離散かつ小さい。

残る最大のリスクは持ち駒である。打ち込みは全領域に同時に効く共有資源であり、 CGTの「独立な部分ゲームの和」を壊す。ただし24点法の点数は盤上の駒と持ち駒を 同一通貨で数えるため、持ち駒を「まだ配置されていない点数」として扱える可能性がある。 分解を壊すというより、分解に global term が1つ付く形にできるかもしれない。

これは信じる/信じないの問題ではなく測れる。次の課題は分解可能性の測定である。


再現

git clone https://github.com/soy-tuber/nyugyoku24
cd nyugyoku24
pip install cshogi

python tests/test_rules.py                 # 入玉宣言法の規則テスト
python engine/test_decl24.py               # 自己対局
python engine/tune_spsa.py 150 40 2 100    # 重みの自動調整
python engine/validate_weights.py 2 100 40 # 未使用局面での検証

python tools/make_conformance.py           # 適合性テスト集合を生成
python tests/test_conformance.py           # 宣言判定と挙動の適合性
python tools/probe_dlshogi_nyugyoku.py     # 第3.6節の再現(dlshogi の入玉特徴)

適合性テスト集合は、宣言してよい局面(win / draw)だけでなく、宣言すれば負ける局面 (点数不足・枚数不足・玉が敵陣外・王手中)を合成して並べたものである。第5項により 条件を1つでも欠いた宣言は宣言側の負けになるので、適合性の半分はこの陰性側にある。 正解ラベルは実装ではなく条文から書き起こした判定が付けている。

floodgate から抽出した相入玉局面 1,000件を positions/ に同梱してあるので、 棋譜アーカイブ(2.7GB)が無くてもベンチマークは再現できる。 調整用40件と検証用40件は重なりがない。

コードとデータ: github.com/soy-tuber/nyugyoku24 (GPL-3.0)

出典