Principal Variation(PV、従来「主変化」とも呼ばれる)は、その時点で探索器が最善とみなしている読み筋である。 解析時にエンジンが表示する「候補手列」の本体であり、 反復深化や手の並べ替えでも重要な役割を持つ。
ミニマックス法やアルファベータ法では、 ルートから葉までさまざまな候補手順を調べる。 その中で、現在もっとも良いと評価されている手順列が Principal Variation である。
たとえば、
7六歩3四歩2六歩という順が最善と見えているなら、この列が PV になる。
Principal Variation は表示用だけでなく、探索の効率化にも使われる。
つまり PV は、「読み筋の説明」と「次の探索の手掛かり」の両方を兼ねている。
Principal Variation 上にあるノードは PV-node と呼ばれる。
PV-node では正確な値が必要なので、
といった実装上の違いが入ることが多い。
単純な方法では、子ノードから最善手列を受け取り、親で先頭に自分の手を付ける。
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;
}
実戦的には、
などの方法が使われる。
将棋AIでは、USI の info pv ... に出る読み筋がこれにあたる。
対局時の最善手選択だけでなく、解析やデバッグにも重要である。
特に、
といった現象は、探索不安定性や Aspiration Windowsの再探索と関係することがある。