Up MCTS (モンテカルロ木探索) 作成: 2026-03-31
更新: 2026-04-01


    ノード:局面 ( [盤面, 手番] ) を,探索木の分枝点と見る
               a (手)
          s (局面) ─→ s' (局面)

    1. Policy に,局面 ( [盤面, 指し手] ) を入力
      Policy は,手番の有望手の順位を返す
         全手:a_1, a_2, ‥‥, a_K

    2. 有望度の高い手から優先的に読む
        有望な手 → 深く読む
        望み薄の手 → ほとんど読まない

    3. 新訪問のノード (局面) で,
      Value に,局面 ( [盤面, 指し手] ) を入力
      Value は,手番が勝つ可能性 ( 区間 [-1,1] の実数) を返す
      可能性が高い → 局面を進める
      可能性 が低い → 局面を止める

    4. 探索結果を統合
      a_1, a_2, ‥‥, a_K の「訪問回数」を集計し,
      最も訪問された手を選ぶ : a_k

    5. その手を,手番の有望手として出力


    ○「新訪問のノード (局面) で」の詳細
    1. 新訪問のノード s に到達
        新訪問 = 未展開(unexpanded, その先に枝がない)

    2. Policy に,局面 s を入力 ( [盤面, 手番] )
       Policy は,手番の有望手を,確率分布の形で出力    全手:a_s1 , ‥‥, a_sK

       ノードに次の情報を保存:
        P(s,b) = p_b:局面 s での手 b の確率 ( b = a_s1, ‥‥, a_sK )
        N(s,b) = 0:訪問回数
        W(s,b) = 0:累積価値
        Q(s,b) = 0 :平均価値 ( N ≠ 0 では W/N )

    3. Value に,局面 ( [盤面, 手番] ) s を入力
       Value は,手番が勝つ可能性を,[-1, 1] の実数 v_s で出力

    4. 逆伝播
      探索木を逆方向に伝播して
      各手 a の評価を更新:
        訪問回数 : N(s,a) ← N(s,a) +1
        累積価値 : W(s,a) ← W(s,a) + v

    5. 手に順位をつける
      順位をつける式 PUCT(Predictor + UCT) :
         U(s,a) = c⋅P(s,a)⋅√( ∑_b N(s,b) ) / ( 1 + N(s,a) )
      そして
        選択する手 a_t = arg⁡max⁡a( Q(s,a) + U(s,a) )

    6. 順位の高いものから探索
        P(s,a) が大きい手 a は
          → 最初から優先的に読まれる
        N(s,a) が増えると U が減る
          → 読みすぎを防ぐ
        Q(s,a) が良い手は
          → 深く読まれる


    ○ 流れ図
      1. 現在の局面 ([盤面, 手番]) s を,AlphaZero に入力
          │
          ↓
      2. NN(Policy/Value ネット)に s を入力
      ・Policy : P(s, a) = 各手の確率ベクトル
      ・Value : v(s) = 勝率(-1〜+1)
          │
          ↓
      3. MCTS のノード(s)を展開(expand)
      ・P(s, a) をノードに保存
      ・N(s, a) = 0(訪問回数)
      ・W(s, a) = 0(累積価値)
      ・Q(s, a) = 0(平均価値)
          │
          ↓
      4. MCTS の「選択」フェーズ
      ・PUCT 式で手 a を選ぶ
         Q(s,a) + U(s,a)
      ・P(s, a) が高い手 a は優先される
          │
          ↓
      5. 次の局面 s' に進む
             a (手)
         s (局面) ─→ s' (局面)
      ・s' が未展開なら NN に s' を入力(再帰)
      ・展開済みなら Q と N を使って続行
          │
          ↓
      6. v(s) を「バックアップ」
      ・探索経路の各 (s, a) に対して:
         N(s,a) ← N(s,a) + 1
         W(s,a) ← W(s,a) + v(s)
         Q(s,a) ← W(s,a) / N(s,a)
          │
          ↓
      7. これを数千回繰り返す(内部ループ)
      ・Policy が探索を導く
      ・Value が探索を評価する
      ・MCTS が探索を最適化する
          │
          ↓
      8. 最終的に「訪問回数が最大の手」を選ぶ


    ○ 要約
      NN (Policy/Value) が「判断」を返す
      MCTS がその判断を使って探索する
      Value が探索結果を逆流して評価を更新する
      更新された Q が次の選択に影響する
      これが何千回も回る