前回の日記で、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を実装する予定。