Razoring

Razoring は、浅い残り深さで静的評価が alpha よりかなり低いとき、 通常探索を省いて静止探索へ直接落とす選択的探索手法である。

概要

考え方としては、

  • 残り深さが浅い
  • 静的評価がすでにかなり悪い

なら、その局面は通常探索で持ち直しにくいだろうという見立てを使う。

そこで、

  1. 条件を満たしたら通常探索を打ち切る
  2. 静止探索で tactical な確認だけする

という流れを取る。

実装例

if (depth <= 2 && !inCheck(pos)) {
    int razorMargin = 300 + 200 * depth;
    if (staticEval(pos) + razorMargin <= alpha) {
        return quiesce(pos, alpha, beta);
    }
}

実際には、深さや評価差に応じてマージンを変えたり、 fail-high したときだけ通常探索へ戻すこともある。

Futility Pruning との違い

Futility Pruningは「ある手を飛ばす」発想だが、 Razoring は「そのノード全体を通常探索せず quiescence に落とす」発想に近い。

そのため、

  • futility は手単位
  • razoring はノード単位

という違いで捉えると分かりやすい。

将棋AIでの注意点

将棋では、

  • 受けの一手
  • 王手の応酬
  • 成りを伴う急変

が多いため、浅い深さでも突然評価がひっくり返ることがある。 そのため razoring は強力だが、条件を攻めすぎると tactical miss が増えやすい。

実際に Stockfish 系でも、stalemate 周辺で razoring が絡む不具合報告が出ている。

注意点

  • 王手中には通常使わない
  • 終局や特殊な引き分け判定を誤ると危険
  • 探索不安定性が強い局面では再探索コストや誤判定が起こりやすい

関連項目

参考にしたホームページ