sakurapyon’s blog

sakurapyon’s blog

オーダリング2

オーダリングと、手生成のコスト、オーダリングがからぶりしたときの損、の関係が複雑だ。

hash move が有用なのは「あれば間違いなく合法手」「なければ無くてもいい」「あれば高確率でβカット」ということなんだなー。
counter move や killer move は、そもそも合法手じゃない場合もあるし、それをオーダリング上位にもってきてスカだったときのダメージがある。

sakurapyonでヒット率をみてみると、hash 9割、counter 5-6割、killer 1-2割、mate killer 0-5% というところだ。

hashは合法手生成の前に試す価値が充分にあるし、counterもそうしても良い気がする。killerが意外に低いんだけど、こんなもんなんだろうな。

今は hash, counter, killer, SEE>0 の順にしてるけど、killerの順序はもうちょっと下げた方がいいのかもしれない。
mate killerは試してみたけどさっぱりなので、今は 王手がβカットになったら history に足す値を増やして様子をみている。

chessprogrammingwikiを読む - ながとダイアリー」には、こう書かれている。SSE>=0の次がやっぱりいいのかな。

  • Killer Move

βカットを起こすquiet move。
兄弟ノード、もしくは部分木の同じ手数のノード。
置換表の手、winning captures(SEEが正の駒取りだと思うお)の後で読む。
Killer Moveがfail-highすれば、残りのquiet moveを探索しなくて良いので、simpleだがefficient。
しかし、合法手か調べる必要あり。


「遠くのkillerより近所のhistory」という諺はどうだろう? だめ?

追記:

このときkillerのヒット率が低かったのは、祖父ノードで孫のキラーを初期化してなかったからだと思う。今は結構ヒットする。