ProbCutについて
gps将棋開発チームのたわけさんが、とりあえずサンプルという形で
ProbCutのコードを以前紹介してくださいましたが、
if (depth == D_probcut) { if ( search(alpha - 1, alpha, D_shallow) < alpha - margin ) return alpha; else if (search(beta, beta + 1, D_shallow) > beta + margin) return beta; return search(alpha, beta, depth); }
これは、
if (depth == D_probcut) { if ( search(alpha-margin - 1, alpha-margin, D_shallow) < alpha - margin ) return alpha; else if (search(beta+margin, beta+margin + 1, D_shallow) > beta + margin) return beta; return search(alpha, beta, depth); }
こう書く必要は無いのかなと疑問。
たとえば仮にwindowが{-120,150}と探索する場合に、マージンが200だとすると、
nullwindowで、{-121,-120}と検索して、結果<-120-200の場合カットと
{-121-200,-120-200}で検索して、結果<-120-200
の場合は、どういう違いがあるんだろう?
頭の中で考えても、わからない(^^; 実際に実験すれば分かるんだろうか……
このnullwindowsはFutility Pruningでも使っていいのだろうか?
ためしにやってみると、どうも結果が悪いような気がする。確かに早くはなってるんだろうけど。
本来の探索も、PVSで、PV以外の手は、alphaでnullwindow探索をすると、
結果は正しいかもしれないけど、探索した手の履歴がかなり変になる。
このへんはどうしたもんか……(^^;
色々とやればやるほど難しい。でも、将棋ソフトの製作はすごく面白いですね。