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探索をすると、
結果は正しいかもしれないけど、探索した手の履歴がかなり変になる。
このへんはどうしたもんか……(^^;
色々とやればやるほど難しい。でも、将棋ソフトの製作はすごく面白いですね。