Singular Extensions

Singular Extensions は、 ある手だけが他の候補手より著しく良いと判断されたとき、 その手を通常より深く読む extension 手法である。 強制的な一手や極端に有望な手を深掘りするために使われる。

概要

発想は、 「この局面では実質的にこの一手しかない」 という状況を検出し、その手だけ探索深さを増やすことである。

典型的には、

  • 現在の最善手を求める
  • その手を除外または制限した探索をする
  • 他の候補手が十分悪いなら、その手を singular とみなす

という流れを取る。

実装イメージ

if (depth >= 6 && ttMove != MOVE_NONE) {
    int singularBeta = ttScore - margin(depth);
    int excluded = searchExcluding(pos, ttMove, depth / 2, singularBeta - 1, singularBeta);

    if (excluded < singularBeta) {
        extension = 1;
    }
}

実戦的には、 置換表 の best move を起点に判定することが多い。

将棋AIでの位置づけ

将棋では、

  • 王手に対する唯一の受け
  • 詰めろを防ぐ一手
  • 大駒取りを回避する急所手

のように、実質的に一手しかない場面が現れる。

そのため singular extensions は、 Check Extensions より一般的な 「強制性の検出」として理解できる。

注意点

  • 判定用の追加探索が重い
  • 条件を緩めすぎると extension だらけになって遅くなる
  • 探索不安定性 と結びつくことがある

関連項目

参考にしたホームページ