# Reduction

Reduction は、特定の手やノードに対して探索深さを減らす手法の総称である。
[Late Move Reductions](/shogi/shogiwiki/search/late-move-reductions/)が代表例であり、
現代的な alpha-beta 探索では重要な高速化技術になっている。

## 概要

発想は extension の逆で、

- この手は重要そうだから深く読む

ではなく、

- この手は重要でない可能性が高いから浅く読む

という判断を使う。

典型的には、

- 後ろに並んだ quiet move
- hash move でも capture でも check でもない手

に対して reduction をかける。

## 実装例

```cpp
int reduction = 0;

if (depth >= 3 && moveCount > 3 && isQuiet(move)) {
    reduction = 1;
}

int score = -search(next, depth - 1 - reduction, -alpha - 1, -alpha);
```

浅く読んだ結果が良ければ、通常深さで再探索するのが一般的である。

## 代表例

- [Late Move Reductions](/shogi/shogiwiki/search/late-move-reductions/)
- Internal Iterative Reductions

また、[Improving](/shogi/shogiwiki/search/improving/)やノードタイプによって reduction 量を変えることも多い。

## Extension との関係

- [Extension](/shogi/shogiwiki/search/extensions/)
  重要な手を深く読む
- Reduction
  重要でなさそうな手を浅く読む

という対称的な関係にある。

現代的な探索では、全体としては reduction の方が大きな役割を持つことが多い。

## 将棋AIでの位置づけ

将棋は分岐数が大きいので、reduction の恩恵が大きい。
ただし、

- 王手
- 受け
- 成り
- 打つ手

のような tactical な手を浅く読みすぎると危険である。

## 注意点

- reduction しすぎると tactical miss が増える
- [手の並べ替え](/shogi/shogiwiki/search/move-ordering/)が悪いと有望手まで浅く読んでしまう
- extension や pruning との全体バランスが重要

## 関連項目

- [Late Move Reductions](/shogi/shogiwiki/search/late-move-reductions/)
- [Improving](/shogi/shogiwiki/search/improving/)
- [ノードタイプ](/shogi/shogiwiki/search/node-types/)
- [Extension](/shogi/shogiwiki/search/extensions/)

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

- [Chessprogramming Wiki: Reductions](https://www.chessprogramming.org/Reductions)
- [Chessprogramming Wiki: LATE MOVE Reductions](https://www.chessprogramming.org/Late_Move_Reductions)
- [Chessprogramming Wiki: Internal Iterative Reductions](https://www.chessprogramming.org/Internal_Iterative_Reductions)