Delta Pruning は、
静止探索で
「最大限うまくいっても alpha を超えない」と判断した候補手を省く枝刈りである。
主に captures や昇格などを読む quiescence search の高速化に使われる。
基本の考え方は、
deltaを使って、
standPat + delta < alpha
なら、その手を読んでも alpha に届かないだろうと見なすことである。
この delta には通常、
などが入る。
for (Move move : generateTacticalMoves(pos)) {
int delta = capturedPieceValue(move);
if (canPromote(move)) {
delta += promotionGain(move);
}
if (!inCheck(pos) && standPat + delta + 200 < alpha) {
continue;
}
Position next = doMove(pos, move);
int score = -quiescence(next, -beta, -alpha);
if (score >= beta) {
return score;
}
if (score > alpha) {
alpha = score;
}
}
安全マージンは評価スケールやゲームに応じて調整される。
静止探索 は、 地平線効果を減らす代わりにノード数が膨らみやすい。
そこで delta pruning を使うと、 見込みの薄い tactical move を早めに切り捨てられる。
特に、
alpha から大きく離れた局面での無駄な tactical moveを減らす効果がある。
将棋では、
があるため、delta の上限見積もりはチェスより難しい。
そのため実装では、
といった保守的な条件が入りやすい。