Late Move Pruning

Late Move Pruning(LMP)は、手の順序のかなり後ろにある quiet move を、 そもそも探索せずに打ち切る前方枝刈りである。 Late Move Reductionsと近い考え方だが、 LMR が「浅く読む」のに対し、LMP は「読まない」点が異なる。

概要

LMP は、

  • 手の並べ替えがよく効いている
  • 後ろの quiet move は有望でないことが多い

という前提を使う。

そこで、たとえば

  • 非 PV-node
  • 深さが浅い
  • 王手でない
  • moveCount がしきい値を超えた

といった条件を満たした quiet move を省く。

実装上は Futility Pruning の近縁として扱われることも多い。

LMR との関係

Late Move Reductionsは、 後ろの手をまず浅く読んで、危険そうなら再探索する。 一方 LMP は、浅い深さでは「その手はまず読まなくてよい」と判断して飛ばす。

このため LMP は LMR より強い選択性を持ち、 誤ると tactical miss に直結しやすい。

実装例

for (Move move : generateMoves(pos)) {
    ++moveCount;

    if (!pvNode
        && depth <= 4
        && moveCount > lateMovePruningLimit(depth)
        && isQuiet(move)
        && !inCheck(pos)
        && !givesCheck(move)) {
        continue;
    }

    Position next = doMove(pos, move);
    int score = -search(next, depth - 1, -beta, -alpha);

    if (score >= beta) {
        return score;
    }
    if (score > alpha) {
        alpha = score;
    }
}

将棋AIでの位置づけ

将棋は分岐数が大きいので、浅いノードで late move を省く効果が出やすい。 ただし、

  • 王手
  • 受け
  • 成り
  • 打ちによる急所手

のように、後ろに並んでいても重要な手がある。

そのため将棋AIでは、 history heuristicCountermove Heuristicを併用し、 本当に読まなくてよい手だけを対象に絞ることが多い。

注意点

  • 手の並べ替えが悪いと有望手を丸ごと捨ててしまう
  • 静止探索直前では条件を慎重に置く必要がある
  • 探索不安定性が強い局面では aggressive にしすぎない方がよい

関連項目

参考にしたホームページ