围棋:极简规则与状态空间的数学推导
围棋(Go / Weiqi)是世界上最古老且最复杂的棋类游戏。它的规则极其简单,但由于棋盘广阔、落子自由,其演化出的变化数量超越了可观测宇宙中的原子总数。本文将系统梳理围棋的核心规则,并从计算机科学的角度,详细推导围棋“合法棋面数量(状态空间)”的计算方法与震撼结果。
第一部分:围棋的核心规则 (The Rules of Go)
围棋的规则可以被归纳为几个极简的公理。只要满足这些公理,任何落子都是合法的。
1. 棋盘与棋子
- 棋盘:标准的围棋盘是由 19 条横线和 19 条竖线交叉组成的网格,共有 19 \times 19 = 361 个交叉点。
- 落子:黑白双方交替将棋子放在交叉点上。黑棋先走。棋子一旦落定,不能移动(除非被吃掉拿走)。
2. 生死法则:气 (Liberties) 与 提子 (Capture)
- 气 (Liberties):一个棋子在棋盘上,与其直线紧邻(上下左右)的空交叉点,称为这个棋子的“气”。如果一个棋子有 4 个方向都是空的,它就有 4 气。在边角的棋子气会变少。
- 连接:同色的棋子如果直线紧邻,它们就连接成一个不可分割的**“整体(块)”**,它们共享所有的“气”。
- 提子 (Capture):当一个棋子(或一块连接的棋子)周围所有的“气”都被对方的棋子占满时(气数为 0),这块棋子就被“吃掉”了,必须立即从棋盘上移出。
3. 两大禁手规则
为了防止游戏陷入死循环或逻辑悖论,围棋设定了两个禁手规则:
- 禁自杀 (No Suicide):禁止将棋子下在会使自己这块棋“气变为 0”的位置。例外:如果你的落子虽然让自己没气了,但同时也能让对方的棋子没气(也就是能“吃掉”对方),此时由于吃子优先,这步棋是合法的。
- 打劫法则 (Ko Rule / 禁全局同形):禁止任何落子导致棋盘的状态(所有棋子的位置)完全恢复到上一个回合该你走棋时的状态。这主要是为了防止双方在一个地方无限循环地互相吃子(这种情况称为“打劫”)。
4. 胜负判定
棋局在双方都同意“无棋可下”(双重跳过 pass)时结束。
- 地盘 (Territory):用自己的棋子在棋盘上围住的空交叉点。
- 中国规则 (数子法):你的总得分 = 你在棋盘上活着的棋子数 + 你围住的空交叉点数。
- 贴目 (Komi):因为黑棋先走有巨大优势,所以结算时黑棋需要补偿白棋分数(目前中国规则通常黑贴 3 又 3/4 子,即 7.5 目)。总得分多者胜。
第二部分:围棋所有可能棋面数量的数学推导
经常有人说“围棋的变化比宇宙原子还多”。在算法领域,我们需要区分两个概念:
- 博弈树复杂度 (Game Tree Complexity):所有可能对局的变化步数总和(约 10^{360})。
- 状态空间复杂度 (State Space Complexity):棋盘上能够摆出的合法局面(图案)的总数量。
我们今天要推导的是状态空间复杂度(棋面数量)。
1. 朴素上限推导(暴力排列组合)
棋盘有 361 个交叉点。每个交叉点有 3 种可能的状态:【空】、【黑子】、【白子】。因此,如果我们随手在棋盘上乱摆,不考虑规则,总共有:
通过对数计算 \log_{10}(3^{361}) = 361 \cdot \log_{10}(3) \approx 361 \cdot 0.4771 \approx 172.2。
2. 为什么 3^{361} 是错的?
因为这 3^{361} 种状态中,包含了大量违背围棋规则的非法状态。根据围棋规则:任何回合结束后的棋盘上,绝对不能存在“气数为 0”的棋子块! 例如:整个棋盘全部摆满黑子(没有一丝空位),或者一个白子被四个黑子死死包围且没有被提走。这些“死子残留”的状态在实际对局中是不可能出现的。
我们需要从 3^{361} 中精准地剔除所有非法的“无气”状态。
3. 如何精确计算?(状态压缩 DP 的终极应用)
由于棋盘连通性和“气”的判定是全局性的,用纯数学公式无法直接得出精确解。2016 年,计算机科学家 John Tromp 和 Gunnar Farnebäck 利用极其复杂的算法计算出了确切数字。
他们使用的核心方法,正是您学习过的【状态压缩 DP (轮廓线 DP)】与【转移矩阵】的超级进化版!
推导思路:
- 轮廓线推进:不把整个棋盘一次性算完,而是像扫描线一样,一个交叉点一个交叉点地推进(从左上到右下)。
- 状态定义:在 DP 的轮廓线上,我们不仅要记录每个格子是黑、白还是空,还必须记录棋子的连通性(哪几个棋子是同一块的)以及这块棋是否已经有了“气”。
- 连通性压缩 (插头 DP):类似于求解哈密顿路径的插头 DP,他们使用最小表示法(或并查集的状压)来记录轮廓线上棋子块的连通状态。
- 状态转移:每次新加入一个格子(填黑/白/空),就更新它与左边、上边棋子的连通性和气数。如果某一块棋的轮廓已经完全闭合,且计算出它的气数为 0,那么这种转移分支就直接抛弃(非合法状态)。
为了在合理时间内算完,他们甚至用了一定程度的并行计算。即使是 19 \times 19 的棋盘,使用这种高度优化的轮廓线 DP 算法,也耗费了大量的集群计算时间。
4. 最终精确结果揭晓
经过精密计算,19x19 围棋盘上绝对合法的棋面总数为(确切数字):
208168199381979984699478633344862770286522453884530548425639456820927419612738015378525648451698519643907259916015628128546089888314427129715319317557736620397247064840935
如果用科学计数法表示,大约是:
合法率:
也就是说,在用黑白空三种状态随机生成的 361 格图案中,只有约 1.19% 是符合围棋规则的合法棋面!
总结:震撼的对比
为了直观感受这个数字的大小:
- 国际象棋的状态空间:大约是 10^{43} 到 10^{50}。
- 可观测宇宙的原子总数:大约是 10^{80} 左右。
- 围棋的合法棋面数量:\sim 10^{170}。
这意味着,即使我们把宇宙中所有的原子都变成一个包含整个宇宙原子数量的超级宇宙,其原子的总数依然远远不及围棋盘上可能出现的图案多。这就是为什么传统的暴力搜索(如 Alpha-Beta 剪枝)在围棋面前彻底失效,必须依赖深度强化学习(AlphaGo)来引入人类直觉的原因。
而得出这个确切数字的背后,依然是组合数学与状态压缩 DP (转移矩阵) 的伟大胜利。