思うだけで学ばない日記 2.0

思うだけで学ばない日記から移転しました☆!よろしくお願いします。

一○一△

今日わ、いまから合法手判定メソッドのデバッグとkiller moveの再実装を行う
ていうかkiller moveとか、よそ様のホームページの解説でちらと見た記憶をたどるならば、多分ゲーム木のある深さで最も評価値が高かっった手の何個かを記憶しておき、探索が再びその深さに達したときその手を真っ先(ぐらい)に指す、というものだったと思う。いや知らんけど多分、、
もちろんある親の子の中でBestだったからといって、他の親の子に対して優越するとは限らないわけだし、ことによったら反則手であったりもする。というわけで評価値の高かった手を記憶するといってもガチガチに覚えて一切忘れないというわけにいかず、探索が親や祖父や曽祖父ノードといった祖先を経由して遠く離れた部分木に移るにつれ、killer moveはじわじわ忘れていってもらわねば困る。また探索の中でkiller moveを試す前に、それが合法なのか否かが高速に判定できねばならない*1

以上の知識と考察を基に、以前実装したkiller moveは1 depth 1 killer moveという簡素なものだった*2

その上つい最近わかったことだが、反則手のごくごく一部らしいが、誤って合法手とみなしてしまうバグがいるっぽい

それを潰した上で、1 depth 1 killer moveをうまい具合に脱却する。

*1:理論上は普通の差し手ルーチンで差してみて、局面が壊れたら元に戻す、とかでも良いのだが、復旧に備えて1局面 81x81枡+駒台×2 分のデータをkiller moveする度に退避するのはとうてい許容し得ない速度低下をもたらすハズ。よってこの合法手判定ルーチンは、通常の差し手生成処理とは独立に、高速なやつを書き起こす必要がある。

*2:途中でinsertion sortで2手とか3手とか維持更新をやりだしたが、それでも1 depth 2〜3 killer movesであることに変わりない。