第V部 発展
第15章 まとめと発展
ここまで 14 章にわたって、Hayanagi の内部構造を詳しく見てきました。 本章では全体を振り返り、設計判断の背景を整理した上で、 さらに強いエンジンを目指すための発展的なテーマを紹介します。
15.1 Hayanagi の設計判断の振り返り
15.1.1 直接合法手生成を選んだ理由
多くの将棋エンジンでは、まず疑似合法手(pseudo-legal moves)を生成し、 自玉が取られる手を事後フィルタで除外する方式を採用しています。 Hayanagi はこれとは異なり、王手回避・ピン制約・二重王手を 生成段階で直接処理する直接合法手生成を採用しました。
この方式の利点は、不正な手を一切生成しないため後処理が不要なことです。
一方で、生成ロジックが複雑になるというトレードオフがあります。
Hayanagi では compute_pins_and_checks() でピンと王手の情報を事前計算し、
各駒の移動生成時にこの情報を参照することで、正確かつ効率的な手生成を実現しています。
15.1.2 ロックフリー置換表の設計
マルチスレッド探索では、複数のスレッドが同時に置換表を読み書きします。 一般的にはロック(mutex)で保護しますが、置換表のアクセス頻度は極めて高く、 ロックのコストが探索速度に深刻な影響を与えます。
Hayanagi は Stockfish と同様のロックフリー置換表を採用しています。
ハッシュキーの一部をエントリ内に格納し、読み取り時にキーの一致を検証することで、
ロックなしでもデータの整合性をほぼ保証します。
ごく稀にデータ競合が発生しますが、探索結果への影響は無視できるレベルです。
世代番号(tt_generation_)による置き換え戦略も、
古いエントリを効率的に回収する仕組みとして機能しています。
15.1.3 手書き評価関数のシンプルさ
Hayanagi の評価関数は、駒の価値(マテリアル)と位置ボーナスを組み合わせた 手書きの評価関数です。 現代の最強エンジンが採用する NNUE のような機械学習ベースの評価関数と比べると 精度は劣りますが、以下のメリットがあります。
- 外部の学習データや評価関数ファイルが不要で、自己完結している。
- 評価関数の動作を人間が直接理解・デバッグできる。
- ビルドと実行が非常にシンプルで、教育目的に適している。
15.1.4 コード量で実現できた範囲
Hayanagi の全ソースコードは約 4,900 行です。 この規模で以下の機能をすべて実装しています。
- 完全な合法手生成(駒打ち・成り・王手回避を含む)
- 反復深化・アルファベータ探索(PVS, LMR, ヌルムーブ枝刈り)
- 置換表・キラーヒューリスティック・ヒストリーヒューリスティック
- 静止探索と SEE(Static Exchange Evaluation)
- 詰め探索(専用の攻め方・受け方交互探索)
- マルチスレッド探索(ルート手分割方式)
- 定跡対応
- USI プロトコル完全対応(Ponder, MultiPV を含む)
- 入玉ルール(CSA ルール各種、トライルール)
- 千日手・連続王手の千日手の検出
コンパクトなコードベースでありながら、将棋エンジンの主要な技術をほぼ網羅しています。
15.2 強化の方向性
Hayanagi をさらに強くするために考えられる発展的なテーマを紹介します。
15.2.1 NNUE 評価関数
NNUE(Efficiently Updatable Neural Network)は、 Stockfish やねうら王など現代の最強エンジンが採用する評価関数技術です。 ニューラルネットワークの重みを事前学習し、 駒の配置変化に応じてネットワークの中間層を差分更新することで、 高い精度と高速な評価を両立します。 Hayanagi の手書き評価関数を NNUE に置き換えることで、 探索部はそのままに棋力を大幅に向上させることができるでしょう。
15.2.2 Magic Bitboard
Hayanagi の飛車・角・香の利き計算は、ループで遮蔽駒を確認する方式です。 Magic Bitboard は、占有ビットボードとマジックナンバーの乗算・テーブル参照により、 スライダー駒の利きをわずか数命令で算出する技術です。 チェスエンジンでは標準的ですが、将棋の 81 マス盤面にも適用可能で、 手生成と利き計算の高速化が期待できます。
15.2.3 MCTS / AlphaZero アプローチ
アルファベータ探索とは根本的に異なるアプローチとして、 モンテカルロ木探索(MCTS)があります。 AlphaZero は深層ニューラルネットワークと MCTS を組み合わせ、 人間の知識を一切使わずに超人的な棋力を達成しました。 このアプローチでは、評価関数と方策関数をニューラルネットワークが担い、 木探索はUCB に基づいてノードを選択・展開します。 計算資源は大量に必要ですが、将棋エンジンの新たな可能性を示しています。
15.2.4 Aspiration Window
反復深化の各ステップで、前の深さの評価値を中心とした狭い窓(window)で探索を開始し、 窓の外に出た場合のみ再探索する手法です。 窓が狭いほどカットオフが増え探索が高速化しますが、 窓の設定が狭すぎると再探索のオーバーヘッドが増えます。 実装は比較的簡単で、効果も安定しています。
15.2.5 Futility Pruning
残り深さが浅いノードで、静的評価値がアルファ値を大きく下回っている場合に、 その手の探索を省略する枝刈り技法です。 「この手を指しても逆転は不可能だろう」という判断に基づきます。 探索ノード数の削減に大きく貢献しますが、 マージンの調整が重要で、不適切な値は棋力低下を招きます。
15.2.6 Singular Extension
置換表の最善手が他の手より明らかに良い(singular な)場合に、 その手の探索を 1 手分深くする技法です。 重要な局面でより深い探索を行うことで、 戦術的な正確性を向上させます。 Stockfish などのトップエンジンで有効性が確認されています。
15.3 参考文献・関連リソース
オープンソースエンジン
- Stockfish — 世界最強クラスのオープンソースチェスエンジン。
NNUE 評価関数、高度な探索技術の実装が参考になる。
https://github.com/official-stockfish/Stockfish - やねうら王 — 日本発の最強クラスの将棋エンジン。
NNUE の将棋への適用、定跡フォーマットの標準化など、将棋エンジン開発の中心的プロジェクト。
https://github.com/yaneurao/YaneuraOu
技術資料
- Chess Programming Wiki — チェスプログラミングに関する百科事典的なリソース。
探索・評価・手生成のアルゴリズムが網羅されており、将棋にも応用できる。
https://www.chessprogramming.org/ - USI プロトコル仕様 — 将棋所の公式ページで USI プロトコルの仕様が公開されている。
http://shogidokoro.starfree.jp/usi.html
書籍
- 「コンピュータ将棋の進歩」シリーズ — 松原仁 編著。 コンピュータ将棋の歴史と技術を体系的に解説した定番書。
- 「人工知能はどのようにして「名人」を超えたのか?」 — 山本一成 著。 Ponanza の開発者による、将棋 AI 開発の実体験に基づく解説書。
15.4 おわりに
本書では Hayanagi のソースコードを 1 行 1 行追いながら、 将棋エンジンがどのように局面を表現し、手を生成し、探索し、評価するのかを見てきました。 約 4,900 行という小さなコードベースの中に、 コンピュータ将棋の主要な技術が凝縮されています。
将棋エンジンの世界は奥深く、本書で紹介した技術はその入り口にすぎません。 NNUE や MCTS といった最新技術、あるいはまだ発見されていないアルゴリズムが、 今後もこの分野を前進させていくでしょう。 本書が、読者の皆さんが将棋エンジン開発の第一歩を踏み出すきっかけとなれば幸いです。