Jamboree は、 Scout系の探索を並列化するための手法である。 最初の有望手は逐次的にしっかり読み、 残りの手はまず Null Window Search で並列に試す、 という構成を取る。
発想は Young Brothers Wait Concept に近い。 すなわち、
alpha を更新するという流れである。
「有望手の正確値は慎重に求め、 他の手はまず軽くスクリーニングする」という考え方を、 並列環境に拡張したものと見ると分かりやすい。
概念的な疑似コードは次のようになる。
int jamboree(Node node, int alpha, int beta) {
auto moves = generateMoves(node);
int best = -INF;
int firstScore = -search(moves[0], -beta, -alpha);
best = std::max(best, firstScore);
if (best >= beta) {
return best;
}
alpha = std::max(alpha, best);
parallel_for (int i = 1; i < moves.size(); ++i) {
int score = -search(moves[i], -alpha - 1, -alpha);
publishCandidate(i, score);
}
for (auto candidate : collectedCandidates()) {
if (candidate.score > alpha) {
int exact = -search(moves[candidate.index], -beta, -alpha);
best = std::max(best, exact);
alpha = std::max(alpha, exact);
if (best >= beta) {
return best;
}
}
}
return best;
}
Young Brothers Wait Conceptも、 最初の有望手を先に読む点では同じである。
Jamboree の特徴は、 後続手の「まず narrow window で試す」段階を強く前面に出していることで、 Principal Variation Searchとの親和性が高い。
現代の将棋AIでは、 実装容易性と実用効率のバランスから Lazy SMP が好まれることが多い。 そのため Jamboree をそのまま採用する例は多くない。
ただし、
うえでは重要な記事である。