USI プロトコル対応の将棋エンジン
Hayanagi
対局・検討から詰将棋の玉方まで
Hayanagi は C++17 で実装した将棋エンジンです。通常対局用の探索と、詰将棋用の詰み探索を備えています。 将棋 GUI ShogiBoardQ に組み込まれているほか、 USI に対応した将棋 GUI に単独のエンジンとして登録して使えます。
- C++17外部ライブラリ不要
- 1〜128探索スレッド数
- 63手詰み探索の上限
- 全15章ソースを読み解く教材
主な機能
ルールの処理から探索、GUI への組み込みまでをひとつのソースで扱います。
-
ルールに忠実な合法手生成
成り・打ち駒・二歩・行き所のない駒・打ち歩詰めを処理します。王手の回避やピンされた駒の制限は、後からふるい落とさずビットボードで直接生成します。千日手、連続王手の千日手、持将棋、入玉ルールの切り替えにも対応しています。
-
通常探索
反復深化の negamax + alpha-beta を土台に、PVS、静止探索、置換表、null move 枝刈り、LMR、SEE による着手順序、aspiration window を組み合わせています。短手数の詰みは、王手だけを読む専用の探索で先に見つけます。
-
詰み探索
王手の連続による強制詰みを、攻方と玉方の両方から調べます。詰みなら玉方の最長抵抗を含む全手順を、不詰ならその証明を返し、時間切れや手数の上限とは区別します。
-
マルチスレッド
Threadsで 1〜128 スレッドを指定でき、通常探索、探索前の詰み確認、詰み探索、perftの計算を分担します。通常探索の置換表は、スレッド間で共有するロックフリーの表です。 -
対局と検討の設定
持ち時間・秒読みと、相手の手番中の先読みに対応します。探索量を絞る棋力調整、定跡や自動投了を止める解析モードも使えます。定跡はやねうら王の DB2016 形式を読み込みます。
-
GUI に組み込める
局面処理と詰み探索は、Qt などに依存しない静的ライブラリ
hayanagi_tsumeにまとまっています。ShogiBoardQ の詰将棋対局では、問題の判定と玉方の応手に使われています。
使い方
手軽なのは、将棋 GUI の ShogiBoardQ から使う方法です。
-
実行ファイルを用意する
ShogiBoardQ の配布物に、
hayanagi(Windows 版はhayanagi.exe)と定跡ファイルが同梱されています。ソースからビルドすることもできます。 -
エンジン登録で追加する
「設定」→「エンジン設定…」の「エンジン登録」で「追加」を押し、Hayanagi の実行ファイルを選びます。
-
対局・検討で選ぶ
対局者や、検討・棋譜解析のエンジンに Hayanagi を選びます。詰将棋対局では、登録しなくても内蔵の Hayanagi が判定に使われます。
画面付きの手順は、ShogiBoardQ 利用ガイドの「将棋エンジン Hayanagi」で説明しています。USI に対応したほかの将棋 GUI からも、同じ実行ファイルを登録して使えます。
ビルドして動かす
CMake 3.16 以上と C++17 対応コンパイラ(GCC / Clang)があればビルドできます。
ビルド
ターミナル
git clone https://github.com/hnakada123/Hayanagi.git
cd Hayanagi
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
./build/hayanagi --version
実行ファイルは build/hayanagi に作られます。定跡ファイルもビルド先の book/ に配置されます。
USI で動かす
USI コマンド
usi
isready
usinewgame
position startpos
go btime 60000 wtime 60000 byoyomi 1000
perft depth 2 divide
bench nodes 10000
quit
perft と bench を内蔵しているので、GUI につなぐ前に手元で動作を確かめられます。
詰将棋を解かせる
標準 USI の go mate で、現在の手番を攻方として解きます。制限時間はミリ秒で指定し、攻方の玉がない局面も扱えます。
USI コマンド
position sfen 9/9/6R1+R/5k3/9/7+S1/9/9/9 b 2b4g3s4n4l18p 1
go mate 5000
応答
checkmate 3c5c+ 4d4e 1c4c P*4d 4c4d
詰みの場合は玉方の最長抵抗を含む全手順を返します。不詰を証明できたときは checkmate nomate、時間切れでは checkmate timeout を返します。
主な設定
USI のオプションとして GUI から変更できます。
| オプション | 既定値 | 内容 |
|---|---|---|
Threads | 1(1〜128) | 探索に使うスレッド数 |
Hash / USI_Hash | 16 MB | 通常探索の置換表の大きさ。どちらも同じ設定です |
MultiPV | 1(1〜32) | 出力する候補手の数 |
USI_Ponder | false | 相手の手番中の先読み |
USI_LimitStrengthUSI_Strength | false 1(-15〜6) | 探索の深さとノード数を制限する棋力調整。負数は級、正数は段の目安です |
USI_AnalyseMode | false | 棋力制限・定跡による即答・自動投了・先読み要求を止める解析用のモード |
USI_OwnBookBookFile | truehayanagi_book.db | 定跡を使うかと、読むファイル。no_book を選ぶと定跡を使いません |
EnteringKingRule | CSARule24 | 入玉宣言の基準(24点法・27点法・トライルールなど) |
TsumeMode | false | 片玉の局面で独自拡張の go tsume を使うときに有効にします |
すべてのコマンドとオプションは README にまとめています。
知っておきたいこと
- 評価関数は、駒得・駒の働き・利き・玉の安全度などを見る簡易なものです。
- 詰み探索は深さ優先のため、おおむね15手以上の長手数の詰将棋を解くのには向きません。
- 棋力設定の段級位は対局による校正前の目安で、人間の同じ段級位と一致する保証はありません。
- USI には引き分けを返す
bestmoveがないため、千日手や持将棋で終局と判定した局面ではbestmove resignを返します。