# NegaScout
NegaScout は、
[negamax](/shogi/shogiwiki/search/negamax/) を基礎に、
最初の手は通常窓で、残りの手はまず [Null Window Search](/shogi/shogiwiki/search/null-window-search/) で試す探索アルゴリズムである。
現在では [Principal Variation Search](/shogi/shogiwiki/search/principal-variation-search/) と非常に近いものとして扱われる。
## 概要
考え方は単純で、
- 最善と思われる手を full window で読む
- 残りの手は narrow window で試す
- その narrow window を破った手だけ再探索する
という流れである。
[手の並べ替え](/shogi/shogiwiki/search/move-ordering/) が良ければ、
最初の手が本当に最善である可能性が高い。
その結果、後続手の多くは cheap な null-window だけで済む。
## 実装例
```cpp
int negascout(Position pos, int depth, int alpha, int beta) {
if (depth <= 0) {
return quiescence(pos, alpha, beta);
}
int b = beta;
bool firstMove = true;
for (Move move : generateMoves(pos)) {
Position next = doMove(pos, move);
int score = -negascout(next, depth - 1, -b, -alpha);
if (!firstMove && score > alpha && score < beta) {
score = -negascout(next, depth - 1, -beta, -alpha);
}
if (score > alpha) {
alpha = score;
}
if (alpha >= beta) {
return alpha;
}
b = alpha + 1;
firstMove = false;
}
return alpha;
}
```
実務上は、この再探索条件や窓の置き方が
[探索不安定性](/shogi/shogiwiki/search/search-instability/)と深く関わる。
## PVS との関係
歴史的には NegaScout と
[Principal Variation Search](/shogi/shogiwiki/search/principal-variation-search/) は別名義で紹介されることが多いが、
現代エンジンの実装ではかなり近い。
厳密な差を論じるより、
- null window による後続手のスクリーニング
- fail-high 時の再探索
という共通の発想を押さえる方が実装上は重要である。
## 将棋AIでの位置づけ
将棋AIでも、
[アルファベータ法](/shogi/shogiwiki/search/alpha-beta/) をそのまま使うより、
PVS / NegaScout 系で探索量を減らすのが一般的である。
ただし、
- [置換表](/shogi/shogiwiki/search/transposition-table/)
- [手の並べ替え](/shogi/shogiwiki/search/move-ordering/)
- [Aspiration Windows](/shogi/shogiwiki/search/aspiration-windows/)
が十分に機能して初めて性能が出やすい。
## 注意点
- move ordering が悪いと再探索が増える
- fail-soft / fail-hard の違いや再探索窓の取り方で挙動が変わる
- [静止探索](/shogi/shogiwiki/search/quiescence-search/) や extension に依存して不安定になりやすい
## 関連項目
- [Principal Variation Search](/shogi/shogiwiki/search/principal-variation-search/)
- [Null Window Search](/shogi/shogiwiki/search/null-window-search/)
- [Aspiration Windows](/shogi/shogiwiki/search/aspiration-windows/)
- [探索不安定性](/shogi/shogiwiki/search/search-instability/)
## 参考にしたホームページ
- [Chessprogramming Wiki: Negascout](https://www.chessprogramming.org/NegaScout)
- [Chessprogramming Wiki: Principal Variation Search](https://www.chessprogramming.org/Principal_Variation_Search)
- [Chessprogramming Wiki: Alexander Reinefeld](https://www.chessprogramming.org/Alexander_Reinefeld)
- [www.egaroucid.nyanyan.dev: Explanation](https://www.egaroucid.nyanyan.dev/en/technology/explanation)