Jamboree

Jamboree は、 Scout系の探索を並列化するための手法である。 最初の有望手は逐次的にしっかり読み、 残りの手はまず Null Window Search で並列に試す、 という構成を取る。

概要

発想は Young Brothers Wait Concept に近い。 すなわち、

  • 最初の子ノードを先に読む
  • その結果で alpha を更新する
  • 残りの兄弟ノードを narrow window で並列に試す
  • fail-high した手だけ逐次的に full window で読み直す

という流れである。

「有望手の正確値は慎重に求め、 他の手はまず軽くスクリーニングする」という考え方を、 並列環境に拡張したものと見ると分かりやすい。

実装例

概念的な疑似コードは次のようになる。

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も、 最初の有望手を先に読む点では同じである。

Jamboree の特徴は、 後続手の「まず narrow window で試す」段階を強く前面に出していることで、 Principal Variation Searchとの親和性が高い。

将棋AIでの位置づけ

現代の将棋AIでは、 実装容易性と実用効率のバランスから Lazy SMP が好まれることが多い。 そのため Jamboree をそのまま採用する例は多くない。

ただし、

  • 並列 alpha-beta の考え方を理解する
  • YBWC や Lazy SMP との違いを整理する
  • full-window 探索と narrow-window 探索の役割分担を学ぶ

うえでは重要な記事である。

注意点

  • スレッド間同期や abort 制御が複雑になりやすい
  • fail-high 後の再探索や中断処理を慎重に書く必要がある
  • 置換表共有の設計も性能に大きく効く

関連項目

参考にしたホームページ