疑問点
やねうら王も技巧もAperyもsearchのbeta cutが起きたところでHistoryの更新してなくない?
新しいやり方に変わっている可能性がある? いや、よくみたらbeta-cutのときreturnじゃなくてbreakしてて、whileループの外側でupdateかけてたということに気づいた(技巧2)。
CounterMoveHistoryの概念がわからない
Historyとは別もので、SearchStackのインスタンス変数として持たれている。よくわからないので後回し。
Historyの更新タイミングがわからない
手を調べたときにbeta-cutが起きて、それで更新するならMovePickerによるスコアリングより後じゃん。というかほかの指し手についても混ざっている? 初期化されているの探索開始時点だし、その探索の時点では同じhistoryを更新しながら使いまわしていくのか……? 前のbeta-cutが次の局面のMovePickerに影響する? うーむ。
qsearchの作り
もっと普通のsearchに寄せた作りにしていいんだと思う。そして指し手はMovePickerで制御するべきなんだ。なるほどなぁ。
置換表
複数スレッドを動かしているとすぐ書き換えられるので排他制御入れないとエラー出てしまうんだけど、上位ソフトはそんなことしてないように見える。エントリを小さくして衝突を少なくするとか、クラスタ化して冗長化するという工夫によって安全性が保証されているんだろうか。ちょっと不安な気はする……。
探索が変?
初期局面から考えて反復深化で各深さにかかる時間が
深さ1 : 39 msec
深さ2 : 44 msec
深さ3 : 51 msec
深さ4 : 60 msec
深さ5 : 78 msec
まではいいんだけど、
深さ6 : 6284 msec
深さ7 : 16915 msec
となる。指数関数的に伸びるといっても急激な伸び方に見えて、ちょっとどこか変なのかもしれないなどと。
置換表
置換表のサイズ決定がバグっていた。1 << sizeとすべきところをそのままsizeを使っていた。アホみたいに小さいサイズの置換表しか与えられず頑張っていた海底くんに涙……。