# Principal Variation

Principal Variation(PV、従来「主変化」とも呼ばれる)は、その時点で探索器が最善とみなしている読み筋である。
解析時にエンジンが表示する「候補手列」の本体であり、
[反復深化](/shogi/shogiwiki/search/iterative-deepening/)や[手の並べ替え](/shogi/shogiwiki/search/move-ordering/)でも重要な役割を持つ。

## 概要

[ミニマックス法](/shogi/shogiwiki/search/minimax/)や[アルファベータ法](/shogi/shogiwiki/search/alpha-beta/)では、
ルートから葉までさまざまな候補手順を調べる。
その中で、現在もっとも良いと評価されている手順列が Principal Variation である。

たとえば、

- ルートで `7六歩`
- 相手が `3四歩`
- こちらが `2六歩`

という順が最善と見えているなら、この列が PV になる。

## 何に使うか

Principal Variation は表示用だけでなく、探索の効率化にも使われる。

- 前回反復の PV 手を次の反復で最初に読む
- ルートで最善手候補として表示する
- [Principal Variation Search](/shogi/shogiwiki/search/principal-variation-search/)の前提になる

つまり PV は、「読み筋の説明」と「次の探索の手掛かり」の両方を兼ねている。

## PV-node

Principal Variation 上にあるノードは `PV-node` と呼ばれる。
PV-node では正確な値が必要なので、

- 探索窓を広めに取る
- 一部の枝刈りを弱める

といった実装上の違いが入ることが多い。

## 実装例

単純な方法では、子ノードから最善手列を受け取り、親で先頭に自分の手を付ける。

```cpp
struct SearchResult {
    int score;
    std::vector<Move> pv;
};

SearchResult search(Position pos, int depth) {
    SearchResult best{ -INF, {} };

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

        if (score > best.score) {
            best.score = score;
            best.pv.clear();
            best.pv.push_back(move);
            best.pv.insert(best.pv.end(), child.pv.begin(), child.pv.end());
        }
    }

    return best;
}
```

実戦的には、

- [Triangular PV-Table](/shogi/shogiwiki/search/triangular-pv-table/)
- stack 上の PV バッファ
- [置換表](/shogi/shogiwiki/search/transposition-table/)からの復元

などの方法が使われる。

## 将棋AIでの位置づけ

将棋AIでは、USI の `info pv ...` に出る読み筋がこれにあたる。
対局時の最善手選択だけでなく、解析やデバッグにも重要である。

特に、

- PV が頻繁に揺れる
- 深くなると急に別の筋へ飛ぶ

といった現象は、[探索不安定性](/shogi/shogiwiki/search/search-instability/)や
[Aspiration Windows](/shogi/shogiwiki/search/aspiration-windows/)の再探索と関係することがある。

## 注意点

- [置換表](/shogi/shogiwiki/search/transposition-table/)から PV を復元すると、不完全な列になることがある
- fail-high だけでは正確な PV が得られないことがある
- 表示用の PV と内部で保持する PV の実装を混同しない方がよい

## 関連項目

- [反復深化](/shogi/shogiwiki/search/iterative-deepening/)
- [Principal Variation Search](/shogi/shogiwiki/search/principal-variation-search/)
- [置換表](/shogi/shogiwiki/search/transposition-table/)
- [探索不安定性](/shogi/shogiwiki/search/search-instability/)

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

- [Chessprogramming Wiki: Principal Variation](https://www.chessprogramming.org/Principal_Variation)
- [Chessprogramming Wiki: Triangular PV Table](https://www.chessprogramming.org/Triangular_PV-Table)
- [Chessprogramming Wiki: Principal Variation Search](https://www.chessprogramming.org/Principal_Variation_Search)