从概率传播到最短路径

假设一个系统可以处于有限个状态之中,并且每经过一步,都可能从当前状态转移到另一个状态。如果我们已经知道任意两个状态之间的一步转移概率,那么自然会产生一个问题:从状态 $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 方程。它所表达的并不只是一个概率恒等式,而是一种递推思想:

  1. 选择一个中间状态 $k$;
  2. 组合从 $i$ 到 $k$ 与从 $k$ 到 $j$ 的两个子过程;
  3. 汇总所有可能的中间状态。

如果用矩阵 $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$falsetrue
路径计数$+$$\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) } $$

概率问题使用“求和—相乘”,最短路径使用“取最小值—相加”,可达性问题使用“逻辑或—逻辑与”。问题的表面含义各不相同,但只要确定了“怎样连接两段”和“怎样聚合候选”,同一套递推、动态规划和广义矩阵乘法框架就会自然出现。

真正统一这些问题的,并不是某一条具体公式,而是公式背后的结构。