Extension

Extension は、特定の条件を満たした手に対して探索深さを増やす手法である。 地平線効果を避けたり、強制的な変化を最後まで追うために使われる。

概要

通常の探索では、手を 1 つ進めるたびに深さを 1 ずつ減らす。 しかし、

  • 王手
  • 詰み筋に近い手
  • 危険な駒取り

など、重要な手だけは少し深く読みたいことがある。

そこで extension では、

  • 通常は depth - 1
  • 特定条件なら depth - 1 + ext

という形で深さを増やす。

実装例

int ext = 0;
if (givesCheck(move)) {
    ext = 1;
}

int score = -search(next, depth - 1 + ext, -beta, -alpha);

実際には、

  • 1 手分丸ごと伸ばす
  • 1/2 ply などの fractional extension にする
  • 1 ノード内で合計延長量を制限する

といった工夫が入る。

代表例

よく知られている extension には、

  • check extension
  • recapture extension
  • singular extension

などがある。

ただし、古典的エンジンでは多用された extension も、 現代エンジンでは reductions や pruning の発達により控えめになっている。

将棋AIでの位置づけ

将棋では、

  • 王手
  • 王手の受け
  • 詰みが絡む局面
  • 成りや取り返しが強制的に進む局面

で extension が有効なことがある。

一方で、分岐数が大きいので延長しすぎると探索爆発しやすい。 そのため、現在は控えめな設計が多い。

注意点

  • extension の入れすぎは探索爆発につながる
  • reductionsと逆向きの作用なので、バランスが重要
  • tactical な局面を救う一方で、恣意的な条件になりやすい

関連項目

参考にしたホームページ