詰め
長らくオセロを放置していたことを思い出したので、ソース公開に向けて最後のつめを。move ordering 戦略を iterator で抽象化してみる。iterator じゃなくて高階関数でやりたいけど、まぁいいか。意外とうまくまとまった。
あとは、置換表か。置換表は、結局 alpha, beta 値の初期値を与えるということで OK? 置換表戦略も抽象化できそうだが、あとは template にするか virtual にするか。オーバーヘッドは少し怖い。
探索戦略も抽象化できないだろうか。結局、こんな感じになるんだろうか。NegaScout と Mtd(f)をうまく抽象化できるかなぁ。
var a, b = init_alpha_beta(board, alpha, beta); // 置換表 var it = new_movable_iterator(); // move ordering while (it.has_next()) { var next = it.get_next(); a = max(a, -alpha_beta(next, a, b)); // 探索戦略 if (b <= a) break; // cut it.go_next(); } save_alpha_beta(board, a, b); // 置換表
雰囲気だけ。深さに応じて、3つの戦略を template で選べるようにすればいいのかな?