df-pnルーチンのあれこれ

df-pnルーチンがようやく完成しました。まだ歩不成みたいな指し手生成はやっていないので、打ち歩詰めが絡む問題は解けませんが、シングルスレッドで200knps程度出ており、試しにかず@なのはさんにいただいた将棋図巧 第2番(21手詰)をやってみたところ2011ノードで解けました。

すなわち、シングルスレッドでおおよそ0.01秒で解けるということですね。

また、詰将棋の解答としては玉側は最長手順で逃げないといけないので、最長手順をdfpnの置換表から引っ張り出してこないといけないのですが、これが結構たいへんでして、いまはそのコードは書いていません。

どうしようかと考え中なのですが、長手数の詰将棋にチャレンジしたり、詰将棋検討エンジン化する気はいまのところあまりないので、こんなの後回しでいいかと思いました。

df-pnの詰将棋ルーチンは長手数の詰みに関しては通常の探索ルーチンより早く詰みが発見できることは間違いのですが、実戦でそんなに長手数のものが出現するはずもなく、通常探索中にdf-pnの詰将棋ルーチンを呼び出すとたいていは時間のロスになります。

時間のロスにならずに、効果的に呼び出せるような条件を見つけ出せれば、それはそれで大変素晴らしいと思うのですが、これはそう簡単な話ではなさそうです。

それで、探索開始時にdf-pn詰将棋ルーチンに40kノード(これなら最大でも0.2秒で終了します。うまくすれば20〜30手詰めぐらいがわかります)だけ割り振るようにして、そうしないバージョンと自己対戦中なのですが、短い持ち時間の将棋ですと、この0.2秒が致命傷になりかねず、どうも勝率がよろしくないです。df-pnルーチン自体は並列化していないことも関係しているのでしょうけども、なんにせよdf-pnの詰将棋ルーチンは別スレッドから呼び出したほうが良さげです。

しかしそう考えますと、実戦的に見てdf-pn詰将棋ルーチンは通常探索にはよほど吟味しない限り組み込めませんし、スレッドを1つか2つ、df-pnの詰将棋ルーチンに割り当てるとしてもその配分が非常に難しく、下手をすると弱くなるだけの結果に終わります。

Bonanzaのようにクラスター化したときにサブのPCではdf-pnで即詰みを調べるというのはアリだと思うのですが、これが強さにどれだけ寄与するのかというのは非常に微妙な話で、そもそも探索ルートで詰みがなければ無用の長物であり、探索ルートで詰みが出現するためには、そこで優勢になっていなければならず、詰みを逃して負けるというパターンが少し防げるだけのように思えます。

そこで、探索ルート以外で必死をかけたり、頓死チェックのためにこのdf-pnの詰将棋ルーチンを活かしたいのですが、これはこれで簡単な話ではありません。簡単なら保木さんがとっくにやっておられるはずです。

詰将棋用のスレッドをひとつ専用に割り当てて、PV(最前応手列)の浅い深さのノードについて、df-pnの詰将棋ルーチンを呼び出して詰みがないか検証するというのはそこそこお手軽に出来る、そこそこよさげな実装方法だと思います。

この場合、PVに出現する頓死筋は防げるようになりますが、必死をかけるのがうまくなるかと言われると微妙なところで、必死をかけるための初手,3手目が捨て駒だったりするとそんな手はPVにはなかなか現れず、そういう形の必死は発見できないであろうことは想像に難くないです。

結局のところ、別スレッドで探索ルートで即詰みを探し続ける程度に落ち着くのですが、2コアで動かしている場合に1コアをそんなことに割り当ててしまいますと、ただ単に弱くなるだけのような気もします。

1コアまるまるを割り当てるわけではなく、そのコアも探索ルートでの不詰めが証明されれば、そのあとは通常探索の並列化に戻るのですが、そうは言ってもdf-pnでなかなか不詰めは証明されません。

結局、「df-pnルーチン書けましたけど、これどうしてくれましょう」というのがいまの私の気持ちです。