# Young Brothers Wait Concept

Young Brothers Wait Concept(YBWC)は、並列 alpha-beta 探索で
「最初の有望手を先に読み、その結果が分かるまで後続の兄弟ノードの並列化を待つ」
という考え方である。

## 概要

alpha-beta 探索では、最初に読んだ手が beta cut を起こすことが多い。
もしそうなら、残りの兄弟ノードを並列に読んでも無駄になる。

そこで YBWC では、

1. 最初の兄弟ノードを先に探索する
2. それが cut を起こさないと分かってから
3. 残りの兄弟ノードを並列化する

という方針を取る。

この「無駄な並列探索を減らすため、若い兄弟は待つ」という発想が名前の由来である。

## 何がうれしいのか

YBWC は、

- 不要な並列仕事を減らす
- alpha-beta の性質を壊しにくい
- CUT-node での無駄な探索を抑える

という利点がある。

特に、
[手の並べ替え](/shogi/shogiwiki/search/move-ordering/)が良い場合は、
最初の手で cut する確率が高いため効果が出やすい。

## 実装イメージ

    int parallelSearch(Node node) {
        Move first = firstOrderedMove(node);
        int alpha = search(first);

        if (alpha >= node.beta) {
            return alpha;
        }

        parallel_for_each(remainingMoves(node), [&](Move move) {
            search(move);
        });

        return collectBestScore();
    }

これは概念を示す簡略化例であり、実際には

- split の条件
- idle thread の管理
- [置換表](/shogi/shogiwiki/search/transposition-table/)共有

が重要になる。

## Lazy SMP との違い

[Lazy SMP](/shogi/shogiwiki/search/lazy-smp/)は、ゆるく独立探索を走らせる方式である。
それに対して YBWC は、

- どこで並列化を開始するか
- eldest son を先に読むか

をより厳密に制御する。

そのため、YBWC の方が理論的には整理されているが、実装は複雑になりやすい。

## 将棋AIでの位置づけ

将棋AIでもマルチスレッド探索は重要だが、
近年は実装容易性から[Lazy SMP](/shogi/shogiwiki/search/lazy-smp/)寄りが多い。
それでも YBWC は、並列 alpha-beta を理解する基礎概念として重要である。

## 注意点

- 最初の手を待つので、並列性が遅れて立ち上がる
- [手の並べ替え](/shogi/shogiwiki/search/move-ordering/)が悪いと利点が減る
- 負荷分散や split 条件の設計が難しい

## 関連項目

- [並列探索](/shogi/shogiwiki/search/parallel-search/)
- [Lazy SMP](/shogi/shogiwiki/search/lazy-smp/)
- [アルファベータ法](/shogi/shogiwiki/search/alpha-beta/)
- [手の並べ替え](/shogi/shogiwiki/search/move-ordering/)

## 参考にしたホームページ

- [Chessprogramming Wiki: Young Brothers Wait Concept](https://www.chessprogramming.org/Young_Brothers_Wait_Concept)
- [Chessprogramming Wiki: ABDADA](https://www.chessprogramming.org/ABDADA)
- [Chessprogramming Wiki: Jamboree](https://www.chessprogramming.org/Jamboree)