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

3.7 残局库 Tablebases

一节有趣的小知识。我们说国象“未解”,但这话有个例外——当棋盘上只剩很少几个子时,它其实已经被完全解出了。这块“已解的小角落”被做成了残局库(tablebase),引擎在残局阶段直接查表,就能走出数学上完美的着法。

一、Syzygy 表库:把残局算到底、存起来

道理其实就是第一章 Minimax 的“搜到底”——只不过反过来做:从所有终局倒推。当盘上子很少时(比如只剩王、车、兵),局面总数有限,强到可以用超级计算机把每一个局面的完美结果(赢/和/输、以及最快几步)全部算出来、存进文件。这就是Syzygy 表库,目前覆盖了所有 ≤7 子的残局。

于是国象出现了一个奇妙的分界:开局中局“未解、只能逼近”,残局却“已解、可以查表走完美”。这恰好串起了全课——井字棋整盘可查表(1.1),五子棋自由规则已被证明先手必胜(1.1),国象只有残局这一小块已解。“已解 vs 未解”不是非黑即白,而是看你能不能把它算到底;子一少,国象的残局就落进了“能算到底”的那一侧。

二、在引擎/接口里查表,并交给 ANIMA

用起来很简单:python-chess 自带 Syzygy 查询。引擎一进入残局(盘上子数 ≤ 表库覆盖),就不再费力搜索,直接查表拿到精确结论——既快又绝对正确,比任何评估函数都靠谱:

import chess.syzygy

with chess.syzygy.open_tablebase("/path/to/syzygy") as tb:
    if len(board.piece_map()) <= 7:        # 进入表库覆盖的残局
        wdl = tb.probe_wdl(board)          # 赢/和/输(Win-Draw-Loss)
        dtz = tb.probe_dtz(board)          # 距离“不可逆进展”还有几步
        # 据此直接走出完美着法,无需搜索

照例把它接进开放信息接口:info() 在残局阶段可以多返回一个 tablebase 字段——“此局已解:结果是赢/和/输,最优着法是……”。这是又一种“可读的确定信息”:和五子棋的 forced_win 必胜线一样,它让引擎不只是“给一步棋”,而是能笃定地告诉 ANIMA “这个残局的标准答案我知道”——这种确定性,正是黑盒神经网络给不出的。

三、小结与下一节

  • 残局已解:≤7 子残局被完全算出存进 Syzygy 表库,本质是反向的“搜到底”。
  • 未解 vs 已解是渐变:国象开局中局未解、残局已解;子越少越落入“能算到底”一侧。
  • 用法:进入残局直接查表,得精确胜负与最优着法;接入 info()tablebase 字段,又一种可读确定信息。

自研、借力、查表都讲过了,还差最后一条路线。下一节 3.8 Leela Chess Zero 概念(进阶),我们把第二章的 AlphaZero 思想搬到国象,并诚实地谈谈单卡 5070 Ti 能做到哪一步。