静止探索は、通常の探索の葉でそのまま評価関数を呼ぶのではなく、 駒の取り合いや王手などの激しい変化が収まるまで限定的に先を読む手法である。 地平線効果を弱めるために使われる。
探索を深さ d で打ち切って即座に評価すると、
「次の一手で大駒を取られる」「王手が続く」といった不安定な局面を誤って高く評価してしまうことがある。
静止探索では、そうした葉局面で
など、戦術的に重要な手だけを追加で読む。
静止探索ではまず現在局面を静的評価し、その値を stand pat として下限候補にすることが多い。
「何も大きな戦術がなければ、この値を採用してよいだろう」という考え方である。 ただし自玉が王手されている局面では、stand pat を使わず回避手を調べる必要がある。
int quiesce(Position pos, int alpha, int beta) {
int standPat = evaluate(pos);
if (standPat >= beta) {
return standPat;
}
if (standPat > alpha) {
alpha = standPat;
}
for (Move move : generateCaptures(pos)) {
Position next = doMove(pos, move);
int score = -quiesce(next, -beta, -alpha);
if (score >= beta) {
return score;
}
if (score > alpha) {
alpha = score;
}
}
return alpha;
}
実際には、悪い駒取りを減らすために Static Exchange Evaluationや delta pruningを組み合わせることが多い。
将棋は駒の取り合いや王手の応酬が激しく、 葉での単純な静的評価だけでは不安定なことが多い。 そのため、静止探索はアルファベータ法の実用化にほぼ必須である。
特に、
では効果が大きい。