静止探索

静止探索は、通常の探索の葉でそのまま評価関数を呼ぶのではなく、 駒の取り合いや王手などの激しい変化が収まるまで限定的に先を読む手法である。 地平線効果を弱めるために使われる。

概要

探索を深さ d で打ち切って即座に評価すると、 「次の一手で大駒を取られる」「王手が続く」といった不安定な局面を誤って高く評価してしまうことがある。

静止探索では、そうした葉局面で

  • 駒を取る手
  • 王手の回避手
  • 必要に応じて王手や成り

など、戦術的に重要な手だけを追加で読む。

stand pat

静止探索ではまず現在局面を静的評価し、その値を 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 Evaluationdelta pruningを組み合わせることが多い。

将棋AIでの位置づけ

将棋は駒の取り合いや王手の応酬が激しく、 葉での単純な静的評価だけでは不安定なことが多い。 そのため、静止探索はアルファベータ法の実用化にほぼ必須である。

特に、

  • 王手中の局面
  • 直近で大きな駒得損が起こる局面
  • 成りや取り返しが絡む局面

では効果が大きい。

注意点

  • 深さ制限がないので、候補手の絞り方が悪いと探索爆発しやすい
  • 王手をどこまで広げるかは実装差が大きい
  • stand pat はZugzwang的な例外に注意が必要

関連項目

参考にしたホームページ