# 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)