Triangular PV-Table は、 Principal Variationを保持するための古典的なデータ構造である。 ply ごとに「その深さから先の最善手列」を格納するため、 全体として三角形状のメモリ配置になる。
探索中に best move が更新されたら、 子ノードで得られた PV を親へコピーし、 先頭に自分の手を付ける。
深さ d のノードは最大で d 手ぶんの PV を持つので、
となり、配列の使用量が三角形状になる。
これは、
の実装で長く使われてきた。
最も単純には、pv[ply][remainingDepth] のような 2 次元配列を用意する。
best move が見つかったら、
pv[ply][0] にその手を書くpv[ply + 1] の内容を後ろへコピーするという流れになる。
Move pvTable[MAX_PLY][MAX_PLY];
int pvLength[MAX_PLY];
void updatePv(int ply, Move bestMove) {
pvTable[ply][0] = bestMove;
for (int i = 0; i < pvLength[ply + 1]; ++i) {
pvTable[ply][i + 1] = pvTable[ply + 1][i];
}
pvLength[ply] = pvLength[ply + 1] + 1;
}
この方法は分かりやすい一方で、 毎回コピーが入る。 そのため実戦的には、
といった代替も用いられる。
将棋AIでは USI の info pv 出力が重要なので、
Principal Variation を安定して組み立てる仕組みが必要になる。
現代的なエンジンでは、 置換表から PV を復元する方式も多いが、 Triangular PV-Table は仕組みが明快で、
という利点がある。