-
Horizon Effect horizon-effect
horizon-effect
-
-
添付ファイル
-
変更点
-
ソースを表示
-
表示
# 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)