# Extension

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

## 概要

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

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

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

そこで extension では、

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

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

## 実装例

```cpp
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](/shogi/shogiwiki/search/reductions/) や pruning の発達により控えめになっている。

## 将棋AIでの位置づけ

将棋では、

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

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

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

## 注意点

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

## 関連項目

- [Reductions](/shogi/shogiwiki/search/reductions/)
- [静止探索](/shogi/shogiwiki/search/quiescence-search/)
- [地平線効果](/shogi/shogiwiki/search/horizon-effect/)

## 参考にしたホームページ

- [Chessprogramming Wiki: Extensions](https://www.chessprogramming.org/Extensions)
- [Chessprogramming Wiki: Check Extensions](https://www.chessprogramming.org/Check_Extensions)
- [Chessprogramming Wiki: Singular Extensions](https://www.chessprogramming.org/Singular_Extensions)