TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Unityで将棋アプリの開発 その12(詰み探索)

作成している将棋アプリに詰み探索を実装した。

AIのレベルと詰み探索

スマホ向けにMCTSで少ないプレイアウトだと、どうしても詰みの見逃しが多くなる。
練習用の強さだと、長手数の詰み探索はいらないが、一番強いレベルでは詰みを見逃さないようにしたい。

強さは、接待dlshogiの方法を使用した、わざとに負けない限りは勝たない練習用と、プレイアウト数とランダムプレイの閾値を変えて強さを段階的(15級~七段)に変えたものを用意している。
詰み探索の深さも段階的に深く設定して、強さを調整することにした。

実装方法

ルート局面でDfPnによる長手数の詰み探索を実行するようにした。

ノード数を最悪でも500msくらいで完了すように制限して、探索開始時にメインスレッドで実行するようにしたが、500msでもUIの引っかかりを感じるため、非同期で処理するようにした。

コルーチンでメインスレッドで非同期に実行しようとすると再帰処理の実装がややこしくなるため、Task.Runで別スレッドでMCTSと並行で実行するようにした。
スマホでマルチスレッドにするとMCTSの方が大幅に遅くなるかと心配したが、Pixel5では遅くなった気はしないので大丈夫なようだ。
シングルコアのスマホだと厳しそうだが、今時どのスマホもマルチコアなので大丈夫だろう。

置換表サイズ

dlshogiのDfPnの実装では、あらかじめ置換表を固定サイズで確保しているが、スマホだとメモリの制約が厳しいため、置換表はC#のDictionaryで実装して、置換表のエントリもListで動的に確保するようにした。
メモリを使い過ぎないように、探索ノード数を固定して、メモリ使用量を抑えるようにする。

ヒントでの詰み探索

ヒント機能でも詰み探索を並列で行い、詰みが見つかった場合は詰みの手順を表示するようにした。
ノード数は1000、深さは17に制限している。
dlshogiと同様、詰みの手順は最短にならない課題があるため、対策は別途検討したい。

f:id:TadaoYamaoka:20220320174647p:plain

まとめ

将棋アプリに長手数の詰み探索を実装した。
スマホでは、プレイアウト数はあまり増やせないため、MCTSの仕組み上、詰みの見逃しが起こりやすくなる。
AIのレベルを上げた場合に、詰みの見逃しがあると残念な感じがするので、詰みの見逃しが起きないようにした。

次は、棋譜解析機能を実装したい。