Futility Pruning は、現在局面の静的評価に安全マージンを足しても alpha を超えそうにない手を、
探索しても無駄とみなして省く前方枝刈りである。
Late Move ReductionsやNull Move Pruningと並ぶ、
選択的探索の代表技術のひとつである。
発想は単純で、
evalmarginを使い、
eval + margin <= alpha
なら、その手を読んでも alpha を超えないだろうと見なして枝を省く。
この判断は主に frontier node 付近の浅いノードで使われるが、 近年は深さに応じてマージンを広げる形で非葉ノードにも拡張されている。
通常は tactical な安全性のため、
は futility pruning の対象から外す。
また、mate 値に近い局面では使わないことが多い。
if (!inCheck(pos) && depth == 1) {
int margin = 150;
int futilityValue = staticEval(pos) + margin;
if (futilityValue <= alpha && isQuiet(move) && !givesCheck(move)) {
continue;
}
}
実戦的には、
といった拡張が入る。
将棋は分岐数が大きく、特に quiet move を全部丁寧に読むとノード数が膨らみやすい。 そのため futility pruning は、終端近くの quiet move を大きく減らす手段として有効である。
ただし将棋では、
があるため、除外条件はチェス以上に慎重である必要がある。
Chessprogramming Wiki では、
のような拡張も紹介されている。 また、Late Move Pruningとの関係も深い。