[{"data":1,"prerenderedAt":29},["ShallowReactive",2],{"i-lucide:grip":3,"i-lucide:chevron-right":8,"i-lucide:moon":10,"i-lucide:sun":12,"i-lucide:languages":14,"i-lucide:chevron-down":16,"i-lucide:shield-check":18,"i-lucide:mail":20,"blog-body-go-mcts-algorithm-zh":22,"i-lucide:cpu":23,"i-lucide:code":25,"i-lucide:star":27},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"5\" r=\"1\"\u002F>\u003Ccircle cx=\"19\" cy=\"5\" r=\"1\"\u002F>\u003Ccircle cx=\"5\" cy=\"5\" r=\"1\"\u002F>\u003Ccircle cx=\"12\" cy=\"12\" r=\"1\"\u002F>\u003Ccircle cx=\"19\" cy=\"12\" r=\"1\"\u002F>\u003Ccircle cx=\"5\" cy=\"12\" r=\"1\"\u002F>\u003Ccircle cx=\"12\" cy=\"19\" r=\"1\"\u002F>\u003Ccircle cx=\"19\" cy=\"19\" r=\"1\"\u002F>\u003Ccircle cx=\"5\" cy=\"19\" r=\"1\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m9 18l6-6l-6-6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m5 8l6 6m-7 0l6-6l2-3M2 5h12M7 2h1m14 20l-5-10l-5 10m2-4h6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":17},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":19},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"\u002F>\u003Cpath d=\"m9 12l2 2l4-4\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":21},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\"\u002F>\u003Crect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"\u002F>\u003C\u002Fg>","\u003Cblockquote>\n\u003Cp>围棋之所以难，不只是「规则复杂」，而是\u003Cstrong>空枰上就有上百个几乎等价的合法点\u003C\u002Fstrong>。穷举到终局不可能，评估函数又极易写偏；MCTS 用「大量随机对局 + 把算力投到更有希望的分支」在两者之间走出一条可落地的路。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cimg src=\"\u002Fblog\u002Fgo-mcts-algorithm\u002Fcover.webp\" alt=\"围棋空盘上分支爆炸，MCTS 用随机对局把算力集中到少数有希望的落点\">\u003C\u002Fp>\n\u003Ch2>为什么围棋特别适合、也特别依赖 MCTS？\u003C\u002Fh2>\n\u003Cp>围棋的搜索空间大到无法靠「算到底」解决：19 路空盘约有 361 个空点，合法着法随局面变化，对局长度常超百手。若每步平均还有几十个合理候选，树的宽度与深度都会爆炸；而手写启发式（吃子优先、占角、连气）在空旷开局又容易退化成贴边乱爬。\u003C\u002Fp>\n\u003Cp>MCTS（Monte Carlo Tree Search，蒙特卡洛树搜索）不试图穷举，也不依赖一张「全局评分表」。它反复做短局随机对局，用胜负结果回传，把更多模拟预算投给看起来更好的分支。分支因子越大、局面评估越难写准时，这种「用采样代替穷举」的思路越有价值——这也是它在围棋、以及后来许多不完全信息游戏里被广泛采用的原因。\u003C\u002Fp>\n\u003Ch2>MCTS 的一轮迭代在做什么？\u003C\u002Fh2>\n\u003Cp>一轮完整的 MCTS 迭代通常拆成四步，循环直到时间或模拟次数用尽：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>选择（Selection）\u003C\u002Fstrong>：从根出发，按 UCB1 一类公式在已展开的子节点里往下走，平衡「已知胜率高」和「还没试够」；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>扩展（Expansion）\u003C\u002Fstrong>：走到还有未试过的合法着法时，随机或按某种先验挑一手，长出一个新子节点；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>模拟（Simulation \u002F Rollout）\u003C\u002Fstrong>：从新局面起双方随机（或弱启发式）下到终局，按规则数子判胜负；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>回传（Backpropagation）\u003C\u002Fstrong>：把这一局的胜负沿路径写回每个节点的 visits \u002F wins。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>最终落子一般取\u003Cstrong>根节点下访问次数最多的子节点\u003C\u002Fstrong>（argmax visits），而不是瞬时胜率最高的那个——访问次数本身已经融合了「试过很多次仍站得住」的信息，比早期噪声很大的胜率更稳。\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>步骤\u003C\u002Fth>\n\u003Cth>输入\u003C\u002Fth>\n\u003Cth>输出\u003C\u002Fth>\n\u003Cth>常见坑\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>选择\u003C\u002Ftd>\n\u003Ctd>已展开的树 + UCB1\u003C\u002Ftd>\n\u003Ctd>一条通向叶\u002F待扩展节点的路径\u003C\u002Ftd>\n\u003Ctd>探索常数过大 → 访问摊平\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>扩展\u003C\u002Ftd>\n\u003Ctd>未试过的合法着法\u003C\u002Ftd>\n\u003Ctd>一个新子节点\u003C\u002Ftd>\n\u003Ctd>根上塞进自杀\u002F填眼点会污染终局\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>模拟\u003C\u002Ftd>\n\u003Ctd>当前局面\u003C\u002Ftd>\n\u003Ctd>一局胜负\u003C\u002Ftd>\n\u003Ctd>模拟阶段若乱填自己的眼，估值失真\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>回传\u003C\u002Ftd>\n\u003Ctd>胜负\u003C\u002Ftd>\n\u003Ctd>路径上 visits\u002Fwins 更新\u003C\u002Ftd>\n\u003Ctd>视角要统一（始终相对同一方）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2>UCB1 是怎么在「利用」和「探索」之间折中的？\u003C\u002Fh2>\n\u003Cp>UCB1 给每个子节点打一个分数，大致是：\u003C\u002Fp>\n\u003Cp>[\n\\frac{w_i}{n_i} + C \\sqrt{\\frac{\\ln N}{n_i}}\n]\u003C\u002Fp>\n\u003Cp>前一项是经验胜率（利用），后一项随该节点访问变少而变大（探索）。(C) 越大，越愿意去试生疏分支。\u003C\u002Fp>\n\u003Cp>教科书常取 (C=\\sqrt{2}\\approx 1.41)，那是收益落在 ([0,1])、且子节点不太多时的理论推导。围棋根上往往有几十上百个合法点，而浏览器里一次思考往往只有几千到几万次模拟：此时探索项很容易压过胜率差，结果是\u003Cstrong>访问几乎均匀，首选手占比可掉到约 2%\u003C\u002Fstrong>——既选不出好棋，根上的「倾向度」也失去可读性。工程上常把 (C) 下调（例如 0.4），让有限预算更快集中。\u003C\u002Fp>\n\u003Cp>一个可观测的收敛信号是根节点首选手的访问占比：同样 9 路局面，约 1200 次模拟时 top1 常只有个位数百分比，两万次可到约 17%，四万次可到约 40% 量级。占比低时，优先怀疑「还没搜够」，而不是「盘上真的到处一样好」。\u003C\u002Fp>\n\u003Ch2>「倾向度」和最终落子是什么关系？\u003C\u002Fh2>\n\u003Cp>根上各子节点的 \u003Ccode>visits \u002F Σvisits\u003C\u002Fcode> 可以读成相对倾向度：搜索把算力投到了哪里。UI 若展示 top-N 候选，通常就是按 visits 排序后截断；最终一手仍取 visits 最大者。\u003C\u002Fp>\n\u003Cp>几条读数时容易忽略的边界：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>总和一般小于 1\u003C\u002Fstrong>：长尾候选被过滤掉后，展示集合的概率和会小于 1，这是刻意的——top1 占比本身在说「有多确定」；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>模拟量不足时分布很平\u003C\u002Fstrong>：19 路把几千次模拟摊到上百空点，每点只有几十次，倾向度接近噪声；\u003C\u002Fli>\n\u003Cli>\u003Cstrong>不要用温度采样去「故意下弱」\u003C\u002Fstrong>：在尚未收敛的分布上按 visits 采样，会把本就平坦的分布变得更接近均匀，棋力会塌成乱下。弱化更干净的做法是\u003Cstrong>减少模拟预算\u003C\u002Fstrong>，仍用 argmax 选点。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>开局为什么不能靠「少想一会儿」提速？\u003C\u002Fh2>\n\u003Cp>空枰合法点最多，单点分到的模拟最少，恰恰是全局最缺算力的阶段。一种直觉是：「首手 top1 只有个位数百分比，说明各点差不多，少搜一点也没事。」自对弈会打脸：同强度引擎，开局砍预算的一方可到约 2:8 的惨败。正确读法是——\u003Cstrong>占比低 = 还没收敛\u003C\u002Fstrong>，不是「已经等价」。\u003C\u002Fp>\n\u003Cp>更稳妥的提速是\u003Cstrong>开局知识收窄根候选\u003C\u002Fstrong>：把根上的未试着法限制在少数公认成立的要点（例如仍空着的角星），分支从上百降到个位数，每个候选反而能分到数百次模拟。等角被占满、或要点周边开始接触、或盘上出现只剩一气的紧急棋块，就整体退回全盘搜索。这种做法在大棋盘上通常既省时间又提高单点信噪比；在 9 路这类分支本就不算夸张的盘上，强行收窄反而可能是净损失，需要按盘面规模开关。\u003C\u002Fp>\n\u003Ch2>收官阶段为什么要显式避开「自己的眼」？\u003C\u002Fh2>\n\u003Cp>围棋里往自己的真眼里落子通常合法却极差——等于自杀气。随机模拟若不禁止填眼，估值会被大量自毁棋污染；根节点若不排除自己的眼，收官时「已无棋可下」的一方还可能去填眼把活棋走死，而不是停手。\u003C\u002Fp>\n\u003Cp>因此成熟一点的纯 MCTS 围棋实现会在两处同时处理：模拟阶段不走填眼；根候选里也滤掉己方眼位。只剩眼可填时，正确动作是\u003Cstrong>停一手\u003C\u002Fstrong>，让双方进入数子流程。\u003C\u002Fp>\n\u003Ch2>纯 MCTS 的能力边界在哪里？\u003C\u002Fh2>\n\u003Cp>理解边界比背公式更重要：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>维度\u003C\u002Fth>\n\u003Cth>纯 MCTS（随机 rollout）\u003C\u002Fth>\n\u003Cth>带策略\u002F价值网络的 MCTS\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>先验\u003C\u002Ftd>\n\u003Ctd>几乎没有，靠访问慢慢集中\u003C\u002Ftd>\n\u003Ctd>网络给出着法先验与局面价值\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>同等时间棋力\u003C\u002Ftd>\n\u003Ctd>受模拟量硬约束，大棋盘噪声大\u003C\u002Ftd>\n\u003Ctd>通常显著更强\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>可解释的「倾向度」\u003C\u002Ftd>\n\u003Ctd>直接来自 visits 分布\u003C\u002Ftd>\n\u003Ctd>还混有网络先验，需分开读\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>实现与算力\u003C\u002Ftd>\n\u003Ctd>可在浏览器 Web Worker 里跑\u003C\u002Ftd>\n\u003Ctd>通常需要模型权重与更大算力\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>弱化难度\u003C\u002Ftd>\n\u003Ctd>减 \u003Ccode>maxSims\u003C\u002Fcode> \u002F 时间即可\u003C\u002Ftd>\n\u003Ctd>还要调温度、噪声等\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>此外还有几条工程边界：没有神经网络时，19 路短时搜索的倾向度只宜作参考；中国数子与日本点目的终局定义不同，模拟终点的计分规则必须与产品规则一致；劫争、自杀合法性要在「合法着法生成」里处理正确，否则树会学到非法捷径。\u003C\u002Fp>\n\u003Ch2>小结\u003C\u002Fh2>\n\u003Cp>MCTS 用「选择 → 扩展 → 模拟 → 回传」把有限算力投向更有希望的分支，最终常按访问次数最多的一手落子。围棋根上分支极多，UCB1 的探索常数、开局是否收窄候选、模拟是否禁填眼，都会在真实预算下决定棋力与可读性。读 visits 占比时，先问「这盘棋搜了多少次」——收敛之前，平坦的分布说明的是算力不够，而不是棋盘上到处都是好点。\u003C\u002Fp>\n",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":24},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 20v2m0-20v2m5 16v2m0-20v2M2 12h2m-2 5h2M2 7h2m16 5h2m-2 5h2M20 7h2M7 20v2M7 2v2\"\u002F>\u003Crect width=\"16\" height=\"16\" x=\"4\" y=\"4\" rx=\"2\"\u002F>\u003Crect width=\"8\" height=\"8\" x=\"8\" y=\"8\" rx=\"1\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":26},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m16 18l6-6l-6-6M8 6l-6 6l6 6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":28},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.12 2.12 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.12 2.12 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.12 2.12 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.12 2.12 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.12 2.12 0 0 0 1.597-1.16z\"\u002F>",1786455169486]