# Horizon Effect

Horizon Effect(地平線効果)は、
不都合な出来事を探索の「見える範囲」の外へ押しやることで、
探索器が局面を実際より良く見積もってしまう現象である。
[静止探索](/shogi/shogiwiki/search/quiescence-search/) が導入された大きな理由のひとつでもある。

## 概要

深さ制限つきの探索では、
葉に到達した時点で探索を打ち切り、
[評価関数](/shogi/shogiwiki/search/evaluation-function/)の値を使う。

しかしその直前に、

- 大きな駒損
- 詰めろ
- 王手の連続
- 取り合いの継続

のような激しい変化が控えていると、
探索は「今はまだ大丈夫」と誤解することがある。

たとえば負ける駒をすぐに助けられない局面で、
探索器が価値の低い待ち手を選んで損失を 1 手先送りし、
その結果だけを見て「こちらの方が得」と判断するのが典型例である。

## なぜ起こるのか

原因は単純で、
探索が深さ `d` で止まるからである。

値の悪化が `d + 1` 手目にあるなら、
探索木の中にはその損失が現れない。

このため、探索器は

- その場しのぎの手
- 問題を遅らせるだけの手

を過大評価しやすい。

## 緩和策

最も代表的な対策は [静止探索](/shogi/shogiwiki/search/quiescence-search/) である。
葉局面で、

- 駒を取る手
- 王手
- 大きな戦術変化

だけを追加で読むことで、
「落ち着いていない局面」で探索を止めないようにする。

加えて、

- [Extension](/shogi/shogiwiki/search/extensions/)
- [Static Exchange Evaluation](/shogi/shogiwiki/search/static-exchange-evaluation/)
- 適切な[手の並べ替え](/shogi/shogiwiki/search/move-ordering/)

も役立つ。

## 実装例

地平線効果そのものに直接対処するというより、
葉で静止探索へ移るのが一般的である。

```cpp
int search(Position pos, int depth, int alpha, int beta) {
    if (depth <= 0) {
        return quiescence(pos, alpha, beta);
    }

    for (Move move : generateMoves(pos)) {
        Position next = doMove(pos, move);
        int score = -search(next, depth - 1, -beta, -alpha);

        if (score >= beta) {
            return score;
        }
        if (score > alpha) {
            alpha = score;
        }
    }

    return alpha;
}
```

## 将棋AIでの位置づけ

将棋では、

- 王手の連続
- 成りの発生
- 駒打ちによる急所
- 受けの一手

があるため、地平線効果はチェス以上に表れやすい場面がある。

特に、
[静止探索](/shogi/shogiwiki/search/quiescence-search/)に何を含めるか、
[Extension](/shogi/shogiwiki/search/extensions/)をどこで入れるかは、
強さに直結する設計点である。

## 注意点

- [静止探索](/shogi/shogiwiki/search/quiescence-search/)を入れても完全には消えない
- 枝刈りを強くしすぎると、別の形で地平線効果が悪化することがある
- 要塞や長手数詰めのように、評価関数だけでは扱いにくい問題は別に残る

## 関連項目

- [静止探索](/shogi/shogiwiki/search/quiescence-search/)
- [Static Exchange Evaluation](/shogi/shogiwiki/search/static-exchange-evaluation/)
- [Extension](/shogi/shogiwiki/search/extensions/)
- [評価関数](/shogi/shogiwiki/search/evaluation-function/)

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

- [Chessprogramming Wiki: Horizon Effect](https://www.chessprogramming.org/Horizon_Effect)
- [Chessprogramming Wiki: Hermann Kaindl](https://www.chessprogramming.org/Hermann_Kaindl)
- [webdocs.cs.ualberta.ca: Icca.Mar1986.Pp3 18.Pdf](https://webdocs.cs.ualberta.ca/~tony/OldPapers/icca.Mar1986.pp3-18.pdf)