USI プロトコル対応の将棋エンジン

Hayanagi

対局・検討から詰将棋の玉方まで

Hayanagi は C++17 で実装した将棋エンジンです。通常対局用の探索と、詰将棋用の詰み探索を備えています。 将棋 GUI ShogiBoardQ に組み込まれているほか、 USI に対応した将棋 GUI に単独のエンジンとして登録して使えます。

  • C++17外部ライブラリ不要
  • 1〜128探索スレッド数
  • 63手詰み探索の上限
  • 全15章ソースを読み解く教材

主な機能

ルールの処理から探索、GUI への組み込みまでをひとつのソースで扱います。

  • ルールに忠実な合法手生成

    成り・打ち駒・二歩・行き所のない駒・打ち歩詰めを処理します。王手の回避やピンされた駒の制限は、後からふるい落とさずビットボードで直接生成します。千日手、連続王手の千日手、持将棋、入玉ルールの切り替えにも対応しています。

    • perft
    • EnteringKingRule
    • MaxMovesToDraw
  • 通常探索

    反復深化の negamax + alpha-beta を土台に、PVS、静止探索、置換表、null move 枝刈り、LMR、SEE による着手順序、aspiration window を組み合わせています。短手数の詰みは、王手だけを読む専用の探索で先に見つけます。

    • go depth
    • go nodes
    • go infinite
    • MultiPV
  • 詰み探索

    王手の連続による強制詰みを、攻方と玉方の両方から調べます。詰みなら玉方の最長抵抗を含む全手順を、不詰ならその証明を返し、時間切れや手数の上限とは区別します。

    • go mate
    • go tsume
    • bench tsume
  • マルチスレッド

    Threads で 1〜128 スレッドを指定でき、通常探索、探索前の詰み確認、詰み探索、perft の計算を分担します。通常探索の置換表は、スレッド間で共有するロックフリーの表です。

    • Threads
    • Hash
  • 対局と検討の設定

    持ち時間・秒読みと、相手の手番中の先読みに対応します。探索量を絞る棋力調整、定跡や自動投了を止める解析モードも使えます。定跡はやねうら王の DB2016 形式を読み込みます。

    • USI_Ponder
    • USI_Strength
    • USI_AnalyseMode
    • USI_OwnBook
  • GUI に組み込める

    局面処理と詰み探索は、Qt などに依存しない静的ライブラリ hayanagi_tsume にまとまっています。ShogiBoardQ の詰将棋対局では、問題の判定と玉方の応手に使われています。

    • hayanagi_tsume
    • add_subdirectory

使い方

手軽なのは、将棋 GUI の ShogiBoardQ から使う方法です。

  1. 実行ファイルを用意する

    ShogiBoardQ の配布物に、hayanagi(Windows 版は hayanagi.exe)と定跡ファイルが同梱されています。ソースからビルドすることもできます。

  2. エンジン登録で追加する

    「設定」→「エンジン設定…」の「エンジン登録」で「追加」を押し、Hayanagi の実行ファイルを選びます。

  3. 対局・検討で選ぶ

    対局者や、検討・棋譜解析のエンジンに Hayanagi を選びます。詰将棋対局では、登録しなくても内蔵の Hayanagi が判定に使われます。

ビルドして動かす

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 から変更できます。

オプション既定値内容
Threads1(1〜128)探索に使うスレッド数
Hash / USI_Hash16 MB通常探索の置換表の大きさ。どちらも同じ設定です
MultiPV1(1〜32)出力する候補手の数
USI_Ponderfalse相手の手番中の先読み
USI_LimitStrength
USI_Strength
false
1(-15〜6)
探索の深さとノード数を制限する棋力調整。負数は級、正数は段の目安です
USI_AnalyseModefalse棋力制限・定跡による即答・自動投了・先読み要求を止める解析用のモード
USI_OwnBook
BookFile
true
hayanagi_book.db
定跡を使うかと、読むファイル。no_book を選ぶと定跡を使いません
EnteringKingRuleCSARule24入玉宣言の基準(24点法・27点法・トライルールなど)
TsumeModefalse片玉の局面で独自拡張の go tsume を使うときに有効にします

解説教材

Hayanagi で学ぶ
将棋エンジンの仕組み

Hayanagi のソースコードを題材にした全15章の教材です。データ表現、ビットボード、局面管理、合法手生成、終局判定、探索と評価、並列化、定跡、USI プロトコルを、図とコード例で解説します。

  1. 第I部基礎とデータ構造
  2. 第II部局面管理と合法手生成
  3. 第III部探索と評価
  4. 第IV部並列化とプロトコル
  5. 第V部発展

知っておきたいこと

  • 評価関数は、駒得・駒の働き・利き・玉の安全度などを見る簡易なものです。
  • 詰み探索は深さ優先のため、おおむね15手以上の長手数の詰将棋を解くのには向きません。
  • 棋力設定の段級位は対局による校正前の目安で、人間の同じ段級位と一致する保証はありません。
  • USI には引き分けを返す bestmove がないため、千日手や持将棋で終局と判定した局面では bestmove resign を返します。