# Jamboree
Jamboree は、
[Scout](/shogi/shogiwiki/search/principal-variation-search/)系の探索を並列化するための手法である。
最初の有望手は逐次的にしっかり読み、
残りの手はまず [Null Window Search](/shogi/shogiwiki/search/null-window-search/) で並列に試す、
という構成を取る。
## 概要
発想は [Young Brothers Wait Concept](/shogi/shogiwiki/search/young-brothers-wait-concept/) に近い。
すなわち、
- 最初の子ノードを先に読む
- その結果で `alpha` を更新する
- 残りの兄弟ノードを narrow window で並列に試す
- fail-high した手だけ逐次的に full window で読み直す
という流れである。
「有望手の正確値は慎重に求め、
他の手はまず軽くスクリーニングする」という考え方を、
並列環境に拡張したものと見ると分かりやすい。
## 実装例
概念的な疑似コードは次のようになる。
```cpp
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;
}
```
## YBWC との関係
[Young Brothers Wait Concept](/shogi/shogiwiki/search/young-brothers-wait-concept/)も、
最初の有望手を先に読む点では同じである。
Jamboree の特徴は、
後続手の「まず narrow window で試す」段階を強く前面に出していることで、
[Principal Variation Search](/shogi/shogiwiki/search/principal-variation-search/)との親和性が高い。
## 将棋AIでの位置づけ
現代の将棋AIでは、
実装容易性と実用効率のバランスから [Lazy SMP](/shogi/shogiwiki/search/lazy-smp/) が好まれることが多い。
そのため Jamboree をそのまま採用する例は多くない。
ただし、
- 並列 alpha-beta の考え方を理解する
- YBWC や Lazy SMP との違いを整理する
- full-window 探索と narrow-window 探索の役割分担を学ぶ
うえでは重要な記事である。
## 注意点
- スレッド間同期や abort 制御が複雑になりやすい
- fail-high 後の再探索や中断処理を慎重に書く必要がある
- [置換表](/shogi/shogiwiki/search/transposition-table/)共有の設計も性能に大きく効く
## 関連項目
- [並列探索](/shogi/shogiwiki/search/parallel-search/)
- [Young Brothers Wait Concept](/shogi/shogiwiki/search/young-brothers-wait-concept/)
- [Lazy SMP](/shogi/shogiwiki/search/lazy-smp/)
- [Null Window Search](/shogi/shogiwiki/search/null-window-search/)
## 参考にしたホームページ
- [Chessprogramming Wiki: Jamboree](https://www.chessprogramming.org/Jamboree)
- [Chessprogramming Wiki: Parallel Search](https://www.chessprogramming.org/Parallel_Search)
- [people.csail.mit.edu: Kuszmaul95b.Pdf](https://people.csail.mit.edu/bradley/papers/Kuszmaul95b.pdf)
- [courses.cs.washington.edu: Jamboree%20Diagrams.Pdf](https://courses.cs.washington.edu/courses/cse332/19wi/sections/08/Jamboree%20Diagrams.pdf)