1手前のハッシュを保存しておく手法

http://chocobo.yasuda-u.ac.jp/~nisimura/mymove/index.cgi

>マイムーブは、最善手や評価値などを記憶するためのハッシュテーブルを、2つ持っています。1手前に探索したときのハッシュテーブルを残していて、現在探索しているときのハッシュテーブルと合わせて2つある、ということです。
>ハッシュテーブルへの手の保存は最善手だけではなくて、評価値を更新した手をすべて保存しています。すると何手になるかわかりませんので、手はハッシュテーブルの構造体内に直接入れるのではなく、別のバッファに入れて、構造体には添字だけ入れています。
>評価値を更新した手をすべて、同一局面では先に探索しています。評価値を更新した手の総数は、多くても4手くらいにしかなっていません。最善手だけ or 2手までとかと比較したら、このやり方のほうが高速になったので、そうしています。ただし、かなり前のことなので、現在の状態で調べたら違う結果になるかもしれません。


>1手前のハッシュテーブルからは、評価値は参照せず、手だけ参照して先に探索しています。
>このやり方は自分で考えましたけど、同じことや、もっと上手いことをやっている人がいるだろうと思います。

 1手前のハッシュを残しておく手法が、目からウロコでした。
 消すのももったいないので、ハッシュをクリアせずに前回のハッシュを残して探索とかもやってみたんですが、
 一回の探索で埋まってるところに上書きになるので、どうもうまく行かないみたいで、やめてたんですが、
 考えてみれば、ハッシュを二つもてば良さそうですね。

 上記の手をチェーンで複数記録しておくというのは、見た覚えがありますが、後者の手法は見た覚えが無いですね。
 発表されてないだけで、やってる人はいるかもしれませんが、なるほどなと思いました。


 あと、このあたりで思うのが、
 オーダリングで、静止探索を使ってやってると、ある程度まともな順番になっているので、キーラームーブとか、
 ヒストリーヒューリスティックとかをやっても、あまり効果が無かったんですが、
 もっと簡単なオーダリングをやったら順番はいまいちですが、killerとかhistoryをやると補完する形で、
 全体で高速化するような感じがしました。
 ハッシュに2手ではなく、評価値いを更新した手をすべて保存しておくと、オーダリングの精度が低くても(でも速い)よいかもしれませんね。