假设一个系统可以处于有限个状态之中,并且每经过一步,都可能从当前状态转移到另一个状态。如果我们已经知道任意两个状态之间的一步转移概率,那么自然会产生一个问题:从状态 $i$ 出发,经过多步之后到达状态 $j$ 的概率是多少?
从一步转移到多步转移
以两步转移为例。从 $A$ 出发,两步后到达 $D$,第一步结束时一定处于某个中间状态。若可能的中间状态只有 $B$ 和 $C$,那么:
$$ P(A\to D,2\text{ 步}) =P(A\to B\to D)+P(A\to C\to D). $$其中,一条确定路径上的两次连续转移需要同时发生,所以概率相乘;经过不同中间状态的路径彼此互斥,所以概率相加。若中间状态可以是状态空间中的任意状态,则
$$ p_{ij}^{(2)}=\sum_k p_{ik}^{(1)}p_{kj}^{(1)}. $$更一般地,可以在第 $m$ 步处把一段长为 $m+n$ 的转移过程切成前后两段。系统在切分时刻一定处于某个中间状态 $k$,于是有
$$ \boxed{ p_{ij}^{(m+n)}=\sum_k p_{ik}^{(m)}p_{kj}^{(n)} } $$这就是 Chapman–Kolmogorov 方程。它所表达的并不只是一个概率恒等式,而是一种递推思想:
- 选择一个中间状态 $k$;
- 组合从 $i$ 到 $k$ 与从 $k$ 到 $j$ 的两个子过程;
- 汇总所有可能的中间状态。
如果用矩阵 $P$ 表示一步转移概率,即 $P_{ij}=p_{ij}^{(1)}$,那么两步转移矩阵为 $P^2$,$n$ 步转移矩阵为
$$ P^{(n)}=P^n. $$矩阵乘法中的“乘后再加”,恰好对应“沿一条路径组合概率,再对所有中间状态求和”。
从概率传播到最短路径
现在把问题换成图上的最短路径。设 $d_{ij}^{(k)}$ 表示从顶点 $i$ 到顶点 $j$,并且只允许编号为 $1,2,\ldots,k$ 的顶点作为中间点时,路径的最短长度。
当把顶点 $k$ 加入允许使用的中间点集合时,最短路径只有两种可能:
- 不经过 $k$,长度仍为 $d_{ij}^{(k-1)}$;
- 经过 $k$,可以拆成 $i\to k$ 和 $k\to j$ 两段,长度为 $d_{ik}^{(k-1)}+d_{kj}^{(k-1)}$。
因此
$$ \boxed{ d_{ij}^{(k)}=\min\left( d_{ij}^{(k-1)}, d_{ik}^{(k-1)}+d_{kj}^{(k-1)} \right) } $$这就是 Floyd–Warshall 算法的核心递推式。不断扩大允许使用的中间点集合,最终便得到任意两点之间的最短路径。
它与 Chapman–Kolmogorov 方程的递推维度并不相同:前者按“允许使用哪些中间点”递推,后者按“经过多少步”分解。但是,两者共享同一副骨架:通过中间状态拆分问题,组合两个子问题的结果,再从不同候选方案中进行聚合。
如果改为计算“恰好经过若干条边”的最短路,这种相似性会更加直接。设 $D_{ij}^{(n)}$ 为从 $i$ 到 $j$ 恰好经过 $n$ 条边的最短长度,则
$$ D_{ij}^{(m+n)}=\min_k\left(D_{ik}^{(m)}+D_{kj}^{(n)}\right). $$它与 Chapman–Kolmogorov 方程几乎具有相同的外形,只是运算发生了替换:概率中的求和变成了取最小值,概率乘法变成了距离相加。
它们为什么都是动态规划
动态规划的核心,是为子问题定义状态,并通过已经求得的子问题构造更大的问题。
在马尔可夫链中,子问题是“从 $i$ 经过若干步到达 $j$ 的概率”;在 Floyd–Warshall 中,子问题是“只允许使用前 $k$ 个中间点时,从 $i$ 到 $j$ 的最短距离”。二者都把一个整体过程从某个中间状态切开,并复用两侧的计算结果。
从这个角度看,动态规划描述的是计算方法;矩阵乘法描述的是其中一类递推的代数形式。普通矩阵乘法写作
$$ C_{ij}=\sum_k A_{ik}B_{kj}. $$其结构可以抽象为
$$ C_{ij}=\bigoplus_k\left(A_{ik}\otimes B_{kj}\right), $$其中,$\otimes$ 用于组合一条路径上前后相接的两段,$\oplus$ 用于聚合所有可能的中间选择。
半环:替换“加法”和“乘法”
要让上述“矩阵乘法”成立,我们并不一定要使用普通的加法和乘法。只要两种运算满足一组足以保证组合与聚合一致性的代数规则,就可以在同一个框架中计算。这种结构称为半环(semiring)。
粗略地说,一个半环包含两种运算:
- “加法” $\oplus$:聚合多个候选结果;
- “乘法” $\otimes$:组合连续的子过程。
它们各自满足结合律,“加法”通常还满足交换律;“乘法”对“加法”满足分配律。此外还存在加法单位元与乘法单位元。正是这些性质,使矩阵乘法、路径分解和动态规划递推能够稳定地组合起来。
不同问题只是为 $\oplus$ 与 $\otimes$ 赋予了不同含义:
| 问题 | 聚合候选 $\oplus$ | 连接两段 $\otimes$ | 加法单位元 | 乘法单位元 |
|---|---|---|---|---|
| 马尔可夫多步转移 | $+$ | $\times$ | $0$ | $1$ |
| 最短路径 | $\min$ | $+$ | $+\infty$ | $0$ |
| 最长路径(无正环等适用条件下) | $\max$ | $+$ | $-\infty$ | $0$ |
| 路径可达性 | $\lor$ | $\land$ | false | true |
| 路径计数 | $+$ | $\times$ | $0$ | $1$ |
这里的矩阵 $A$ 和 $B$ 分别记录前、后两段子过程在任意两个状态之间的结果,因此 $A_{ik}$ 与 $B_{kj}$ 表示经由中间状态 $k$ 首尾相接的两段路径。
例如,在最短路径的“min-plus 半环”中,广义矩阵乘法为
$$ (A\otimes B)_{ij}=\min_k(A_{ik}+B_{kj}). $$在布尔半环中,它则变成
$$ (A\otimes B)_{ij}=\bigvee_k(A_{ik}\land B_{kj}), $$用来判断是否存在一条经过某个中间状态的路径。
总结:同一副骨架,不同的运算
马尔可夫链、Floyd–Warshall 算法、动态规划与矩阵乘法并不是偶然地写出了相似的公式。它们都在处理同一个基本问题:一个复杂过程经过中间状态时,如何由局部结果构造整体结果。
这个框架可以浓缩为一句话:
$$ \boxed{ \text{整体结果} =\text{对所有中间选择进行聚合} \left( \text{前半段结果}\ \text{与}\ \text{后半段结果的组合} \right) } $$概率问题使用“求和—相乘”,最短路径使用“取最小值—相加”,可达性问题使用“逻辑或—逻辑与”。问题的表面含义各不相同,但只要确定了“怎样连接两段”和“怎样聚合候选”,同一套递推、动态规划和广义矩阵乘法框架就会自然出现。
真正统一这些问题的,并不是某一条具体公式,而是公式背后的结构。