sakurapyon’s blog

sakurapyon’s blog

置換表難しすぎ

わかったような気になってたけど、考え出すと理解できてないことに気がつく。

0. 勝ち、負けの値は±(VAL_INFINITE-depth)とする。1手詰みならVAL_INFINITE-1等
1. beta cut されて、値が勝ちのとき、置換表には何を書くべきか? (lower-bound, fail-high, Refutation move)
2. alpha更新しなくて、最善の値が負けのとき、置換表には何を書くべきか? (upper-bound, fail-low)
3. 勝ちor負けの値で beta>v>alpha なとき、置換表には何を書くべきか? (exact)
4. 前回の探索時の置換表は消去すべきか?
5. 葉ノードの値は登録すべきか? (稀に静止探索をしなくても済むようになる??)

1のときは、少なくとも手は書いた方がよさそう。
2のときも、最善の値になった手は書いたほうがいいような気がする。

1,2のときは値は使えない、と思う。というか、今まで使ってて変な値が返ってた。
(れさぴょんのように、勝ち・負けが±VAL_INFINITEしかない場合は多分問題ない。詰みまでの手数を含めようとするとおかしくなる)

flagとして、NONE/UPPER/LOWER/EXACTを持ってるけど、手だけ使いたいってフラグが欲しくなるな。



3のときは、vを深さで調整した上で、exact と書けばいい…んだけど、再利用するときがややこしい。登録したときの残り深さ<現在の残り深さでも、詰みは詰みだから流用してもいい、ような気がする(残り深さを探索深さの最大以上にする、とか)



4は、今のsakurapyonは消去していない。ageを持ってて、古い情報なら値は使わないようにしている(手は使う)。
(古い値は反復深化の間でも使うべきではない? *1*2*3 )

でも、古くても詰みは使えるような気がするんだよな。1手詰めの局面は、どのような場合でも1手詰のはずだし。
詰みの値が使えるためには、その値を得るまでの経路上で受け方は全ての応手を生成している必要がある(王手に限らず)。例えば、詰めろの局面で手抜きをしたために詰んだ値を信用するわけにはいかない。なので、PV経路では前向き枝刈りしちゃダメ。同じ意味で、静止探索で得られた詰みの値も使えない。PVでも枝刈りするなら、詰みの値の再利用はどうすればいいんだろ?
(PVノードの静止探索で詰んだら探索延長する or 真面目に詰みルーチンを呼ぶ、という技はあるかもしれないなあ)


非PVはどうなんだろ? 非PVでは、ざくざく枝刈りしているので、得られた値はあまり信用できない。だから値は登録しないで、手だけ登録すればいいのだろう。


5.chessprogramming - CPW-Engine_searchというチェスのサンプルソースコードがあるけど、そこには #ifdef により葉を積むコードが書かれている。参照するコードは無い。謎だ。


2011-10-25 - 思うだけで学ばない日記には、「せいぜいときおり評価関数を計算せずに済む、ぐらいの有難味しか生じない」と書かれている。評価関数が重たい(静止探索が重たい)なら試してみる価値はある、のかなあ? 「特定の局面を静止探索で評価したときに必ず同じ値が返ってくる」という前提が必要なのかもしらん。いまのsakurapyonでは、これは成り立たない。もしかしたら、これもまずいのかもしれない。