TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

将棋AIの進捗 その5(王手の指し手生成)

前回の日記で、Aperyに王手の指し手生成がないという話を書いたが、仕方がないので自分で実装した。

やねうら王には王手の指し手生成が実装されていたので、実装方法を参考にさせてもらった。
YaneuraOu/movegen.cpp at master · yaneurao/YaneuraOu · GitHub

やねうら王ではマクロを使っていたが、少々分かりにくかったのでマクロを使わずに実装した(その分冗長になっている)。

使用方法
for (MoveList<Check> ml(pos); !ml.end(); ++ml) {
    // ....
}

のようにして王手の指し手を生成できる。

ライブラリにAperyを使用していて、王手の指し手を生成したい方はご自由にどうぞ。

実装したコード

実装したコードは、このコミットです。
github.com
※cppshogi/init.cppとcppshogi/generateMoves.cppが主な処理

効果

詰み探索の王手の指し手生成を差し替えたところ、実行速度が約半分になった。

11手 13手
変更前(1手動かして王手をチェック) 770 msec 8402 msec
変更後(王手の指し手を生成) 429 msec 4475 msec

※終盤の複雑な局面


これでもまだ遅いので、df-pnを実装する予定。