一手詰は何のためにあるのか2
先のエントリ「一手詰めは何のためにあるのか」にかずさんからコメントをいただいた。コメント欄で返事を書いていたら長くなりそうだったのでエントリを別に起こすことにします。
かずさんのコメントは処理時間との兼ね合いで元が取れてるかどうか?という話。確かに前エントリには定量的な話がなかったので、少しデータを取ってみました。
sakurapyonでは一手詰を呼んで外れだったときのロスを減らすために、簡易一手詰を呼ぶのは「置換表に手がなくて、一手詰みハッシュでも不明なとき」に限っています。一手詰の結果も置換表に書き出していますので、詰みなら hash cut されていますし、手があれば1手では詰まないということですから。同様に一手詰専門のハッシュも持っていて、詰み・不詰みだけを記録しています。ここで不明だったときだけ簡易一手詰みルーチンで調べます。静止探索内部でも呼んでいるので、呼ぶ回数はかなり多いです。
(ハッシュ参照時に持ち駒の優越関係を使えば 呼び出し回数はもうちょっと減らせるかもしれませんが、どれぐらい効果あるんだろ?)
また、一手詰ルーチンは遠方王手・空き王手を見ていないので かずさんと同様「そこそこ・まあまあ」です。
処理時間
自己対戦1秒で1局行って10%超ぐらいです。序中盤でも気にせず呼んでいますので、終盤度か手数を見て呼び出し制御すればもうちょっと下げられるとは思います。sakurapyonの一手詰は簡易の割には遅い気もします。
詰みが返ってくる頻度
1局全体では3%程度。初期盤面が0.01%。指し手生成祭り局面が7.3%。さきほど負けた下記局面では15%弱でした。なのは詰に含まれている詰将棋では3-5%ぐらいになります。終盤の寄せのあたりでは元が取れているけど、序中盤は丸損してます。終盤詰みが見える直前あたりが一番効果を発揮しています。
詰将棋問題でのヒット率が低いのは 余詰や別解の有無じゃないかと想像していますが、はっきりとはわかりません。
一局全体では損になっていますが、そもそも序盤は合法手が少なくて深く読めますし、合法手が増える終盤で効果が出るので実戦的には元が取れてる…んじゃないかと思います。序中盤の呼び出しは明らかに無駄なので、進行度か何かを基準に呼び出し頻度を変えればもうちょっと使用時間は減らせるかもしれません。使用時間が半分でも大儲けできそうなので、もうちょっと頑張ってみるかなあ…
追記:ヒット率と使用時間を比較しちゃだめだな…減った時間と使用時間の比較にするか、同一深さまで探索して比較しないとダメか…
後手:sakurapyon-2012-0.015kpp 後手の持駒: 金 銀二 歩二 9 8 7 6 5 4 3 2 1 +---------------------------+ |v香v桂v玉v銀 ・ ・ ・ ・v香|一 | ・ ・ ・ 金 ・v金 龍 ・ ・|二 | ・v歩v歩 ・ ・ ・ ・ ・v歩|三 |v歩 ・ ・v角 桂 銀v歩 ・ ・|四 | ・ ・ ・ ・ ・v歩 ・ ・ ・|五 | 歩 ・ 歩 歩 ・ ・ 歩 ・ ・|六 | ・ 歩 ・ ・ 玉 ・ 桂 ・ 歩|七 | ・ ・ ・ ・ ・ ・ ・ ・ ・|八 | 香 桂 ・ ・ ・ ・ ・ ・ 香|九 +---------------------------+ 先手の持駒: 飛 角 金 歩四 先手:BlunderXX_4c *wdoor+floodgate-900-0+BlunderXX_4c+sakurapyon-2012-0.015kpp+20120610130003 手数=103 後手番