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