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 での無駄な探索を抑える

という利点がある。

特に、 手の並べ替えが良い場合は、 最初の手で 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 の管理
  • 置換表共有

が重要になる。

Lazy SMP との違い

Lazy SMPは、ゆるく独立探索を走らせる方式である。 それに対して YBWC は、

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

をより厳密に制御する。

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

将棋AIでの位置づけ

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

注意点

  • 最初の手を待つので、並列性が遅れて立ち上がる
  • 手の並べ替えが悪いと利点が減る
  • 負荷分散や split 条件の設計が難しい

関連項目

参考にしたホームページ