前回の日記で、末端ノードで詰みの探索を行う予定と書いた通り、詰みの探索をするようにしました。
ディープラーニングは詰みの探索が苦手なので、ディープラーニングと詰み探索を組み合わせるのは有効だと思っています。
Policy Network、Value Networkの計算中は、CPUが空いているので、詰み探索を行ってもNPSへの影響はないので、確実に終盤の棋力向上につながるはずです。
といっても、棋力でいえばPolicy Network、Value Networkの精度の方が重要ですが。
詰み探索の実装は、AND/OR木を使って、とりあえず優先度を考慮しないで探索しました。
かなり遅いコードですが、深さ7までは、NPSに影響でないので、採用することにします。
コードはこれ↓
https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/usi/mate.cpp
ルートノードでの詰みの探索を今までは、Aperyを使って探索していましたが、詰み探索の実装に置き換えました。
終盤局面で深さ11までは1秒以内探索できるようですが、深さ13にすると10秒くらいかかる時がありました。
長手の詰みを探索するには、df-pnなどまともな実装が必要そうです。
王手の指し手の生成も全合法手を1手動かして王手になるか調べているので、遅いです。
Aperyに王手の指し手生成があれば、それを使えたのですがどうやら実装されてないようです。
この部分を自力で実装するのは大変なのでどうしようかな・・・。