Soma Zero Tutorials
🔍 搜索功能尚未开启,敬请期待。

2.8 混合引擎(Rapfi 风格)

这一节是本章棋力的终点站。我们已经有了两件互补的法宝:神经网络(2.7)大局观强、经典搜索 + VCF(2.3–2.6)算杀精确。这一节把它们焊在一起,造出一个“既懂大局、又算得准”的混合引擎——这正是当今最强五子棋引擎(如开源的 Rapfi)所走的路。

一、动机:两条路线的优缺点正好互补

把前面两条路线的长短并排一看,互补得近乎完美:

大局判断深处算杀速度可解释
纯经典(α-β + 棋型)受人类知识限制VCF 精确快(CPU)
纯 AlphaZero偶尔看走眼慢(每步大量 MCTS)低(黑盒)
混合(本节)(用网络)精确(用 VCF)较快中(保留威胁信息)

思路于是水到渠成:让神经网络去做它最擅长的“估这个局面谁占优”,让 α-β + VCF 去做它们最擅长的“精确地往深里算”。各扬其长,各补其短。

二、怎么焊接:拿价值网络当评估函数

焊点其实只有一个,而且优雅得出乎意料——还记得 2.3 那个手工的 evaluate()(数棋型加权求和)吗?我们把它整个换成训练好的价值网络。搜索框架(α-β、迭代加深、置换表、走子排序、VCF 解算器)一行都不用动,只是叶子节点的估分从“人写的棋型分”升级成了“网络学出来的判断”:

def evaluate(board, me):
    """混合引擎的评估:不再数棋型,而是问训练好的价值网络。"""
    x = board_to_planes(board, me)        # 转成 2.7 的 3 平面输入
    with torch.no_grad():
        _, v = net(x.unsqueeze(0).cuda()) # 只取价值头的输出
    return v.item()                       # -1~1 的胜算,喂给 α-β 当叶子分

就这么简单——这正是我们从第一章起死磕“统一接口/统一框架”的终极回报:评估函数是一个可插拔的零件,换掉它,整台搜索机器立刻获得神经网络的眼光。再叠加两点,混合引擎就成型了:

  • 搜索前先跑 VCF/VCT:每一步先用 2.5 的解算器查一遍有没有强制杀——有就直接照着杀,把“算杀”这件事交给最精确的工具,根本不劳烦网络。
  • 用网络的策略头做走子排序:2.4 的棋型排序可以升级(或叠加)成“网络觉得哪几步最好就先搜哪几步”,让 α-β 剪得更狠。

(注:这里把网络当评估器塞进 CPU 搜索,对推理速度敏感。Rapfi 真正的工程绝活是用一个蒸馏过的轻量网络让这步足够快——这属于进阶优化,原理你已经懂了,提速是后话。)

三、对比验证:混合到底强在哪

把三个引擎拉上 1.8 那座擂台,按 Elo 评一评(2.10 会正式做),通常会看到这样的格局:

  • 混合引擎 > 纯 AlphaZero:因为它把 AZ 偶尔失手的深处算杀,交给了分毫不差的 VCF——AZ 的“大局优势”被保留,“算杀短板”被补上。
  • 混合引擎 > 纯经典:因为它的评估来自自我对弈学出的网络,棋感超过人写的棋型权重,不再被我们的认知卡住上限。

这就是“1 + 1 > 2”:神经网络的直觉 + 经典搜索的精确,合起来比任何单独一条路都强。这也是为什么现实里最强的棋类引擎,几乎都不是“纯神经网络”或“纯搜索”,而是两者的融合——这个道理,到第三章的国际象棋(Stockfish 的 NNUE 同样是“神经网络评估 + α-β 搜索”)会再次得到印证。

四、小结与下一节

  • 互补:网络强在大局、弱在深处算杀;经典 VCF 强在精确算杀、弱在大局——天生互补。
  • 焊接:把 2.3 的手工 evaluate() 换成价值网络,搜索框架一行不改;再叠加“先跑 VCF”和“网络策略排序”。
  • 收益:混合引擎通常同时强于纯 AlphaZero 与纯经典,是项目级 SOTA;现实最强引擎大多是这种融合。

本章的棋力主线到此封顶。接下来两节是收尾:下一节 2.9 禁手与开局平衡(进阶),补上竞技规则那一层;再到 2.10 Capstone 把五子棋的人机对弈界面、引擎天梯和开放接口收口。