<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SswSpace</title><link>https://blog.pianobuddy.site/</link><description>Recent content on SswSpace</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 16 Jul 2026 18:56:00 +0800</lastBuildDate><atom:link href="https://blog.pianobuddy.site/index.xml" rel="self" type="application/rss+xml"/><item><title>从概率传播到最短路径</title><link>https://blog.pianobuddy.site/p/%E4%BB%8E%E6%A6%82%E7%8E%87%E4%BC%A0%E6%92%AD%E5%88%B0%E6%9C%80%E7%9F%AD%E8%B7%AF%E5%BE%84/</link><pubDate>Thu, 16 Jul 2026 18:56:00 +0800</pubDate><guid>https://blog.pianobuddy.site/p/%E4%BB%8E%E6%A6%82%E7%8E%87%E4%BC%A0%E6%92%AD%E5%88%B0%E6%9C%80%E7%9F%AD%E8%B7%AF%E5%BE%84/</guid><description>&lt;p&gt;假设一个系统可以处于有限个状态之中，并且每经过一步，都可能从当前状态转移到另一个状态。如果我们已经知道任意两个状态之间的一步转移概率，那么自然会产生一个问题：从状态 $i$ 出发，经过多步之后到达状态 $j$ 的概率是多少？&lt;/p&gt;
&lt;h2 id="从一步转移到多步转移"&gt;从一步转移到多步转移
&lt;/h2&gt;&lt;p&gt;以两步转移为例。从 $A$ 出发，两步后到达 $D$，第一步结束时一定处于某个中间状态。若可能的中间状态只有 $B$ 和 $C$，那么：&lt;/p&gt;
$$
P(A\to D,2\text{ 步})
=P(A\to B\to D)+P(A\to C\to D).
$$&lt;p&gt;其中，一条确定路径上的两次连续转移需要同时发生，所以概率相乘；经过不同中间状态的路径彼此互斥，所以概率相加。若中间状态可以是状态空间中的任意状态，则&lt;/p&gt;
$$
p_{ij}^{(2)}=\sum_k p_{ik}^{(1)}p_{kj}^{(1)}.
$$&lt;p&gt;更一般地，可以在第 $m$ 步处把一段长为 $m+n$ 的转移过程切成前后两段。系统在切分时刻一定处于某个中间状态 $k$，于是有&lt;/p&gt;
$$
\boxed{
p_{ij}^{(m+n)}=\sum_k p_{ik}^{(m)}p_{kj}^{(n)}
}
$$&lt;p&gt;这就是 Chapman–Kolmogorov 方程。它所表达的并不只是一个概率恒等式，而是一种递推思想：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;选择一个中间状态 $k$；&lt;/li&gt;
&lt;li&gt;组合从 $i$ 到 $k$ 与从 $k$ 到 $j$ 的两个子过程；&lt;/li&gt;
&lt;li&gt;汇总所有可能的中间状态。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果用矩阵 $P$ 表示一步转移概率，即 $P_{ij}=p_{ij}^{(1)}$，那么两步转移矩阵为 $P^2$，$n$ 步转移矩阵为&lt;/p&gt;
$$
P^{(n)}=P^n.
$$&lt;p&gt;矩阵乘法中的“乘后再加”，恰好对应“沿一条路径组合概率，再对所有中间状态求和”。&lt;/p&gt;
&lt;h2 id="从概率传播到最短路径"&gt;从概率传播到最短路径
&lt;/h2&gt;&lt;p&gt;现在把问题换成图上的最短路径。设 $d_{ij}^{(k)}$ 表示从顶点 $i$ 到顶点 $j$，并且只允许编号为 $1,2,\ldots,k$ 的顶点作为中间点时，路径的最短长度。&lt;/p&gt;
&lt;p&gt;当把顶点 $k$ 加入允许使用的中间点集合时，最短路径只有两种可能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不经过 $k$，长度仍为 $d_{ij}^{(k-1)}$；&lt;/li&gt;
&lt;li&gt;经过 $k$，可以拆成 $i\to k$ 和 $k\to j$ 两段，长度为 $d_{ik}^{(k-1)}+d_{kj}^{(k-1)}$。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此&lt;/p&gt;
$$
\boxed{
d_{ij}^{(k)}=\min\left(
d_{ij}^{(k-1)},
d_{ik}^{(k-1)}+d_{kj}^{(k-1)}
\right)
}
$$&lt;p&gt;这就是 Floyd–Warshall 算法的核心递推式。不断扩大允许使用的中间点集合，最终便得到任意两点之间的最短路径。&lt;/p&gt;
&lt;p&gt;它与 Chapman–Kolmogorov 方程的递推维度并不相同：前者按“允许使用哪些中间点”递推，后者按“经过多少步”分解。但是，两者共享同一副骨架：通过中间状态拆分问题，组合两个子问题的结果，再从不同候选方案中进行聚合。&lt;/p&gt;
&lt;p&gt;如果改为计算“恰好经过若干条边”的最短路，这种相似性会更加直接。设 $D_{ij}^{(n)}$ 为从 $i$ 到 $j$ 恰好经过 $n$ 条边的最短长度，则&lt;/p&gt;
$$
D_{ij}^{(m+n)}=\min_k\left(D_{ik}^{(m)}+D_{kj}^{(n)}\right).
$$&lt;p&gt;它与 Chapman–Kolmogorov 方程几乎具有相同的外形，只是运算发生了替换：概率中的求和变成了取最小值，概率乘法变成了距离相加。&lt;/p&gt;
&lt;h2 id="它们为什么都是动态规划"&gt;它们为什么都是动态规划
&lt;/h2&gt;&lt;p&gt;动态规划的核心，是为子问题定义状态，并通过已经求得的子问题构造更大的问题。&lt;/p&gt;
&lt;p&gt;在马尔可夫链中，子问题是“从 $i$ 经过若干步到达 $j$ 的概率”；在 Floyd–Warshall 中，子问题是“只允许使用前 $k$ 个中间点时，从 $i$ 到 $j$ 的最短距离”。二者都把一个整体过程从某个中间状态切开，并复用两侧的计算结果。&lt;/p&gt;
&lt;p&gt;从这个角度看，动态规划描述的是计算方法；矩阵乘法描述的是其中一类递推的代数形式。普通矩阵乘法写作&lt;/p&gt;
$$
C_{ij}=\sum_k A_{ik}B_{kj}.
$$&lt;p&gt;其结构可以抽象为&lt;/p&gt;
$$
C_{ij}=\bigoplus_k\left(A_{ik}\otimes B_{kj}\right),
$$&lt;p&gt;其中，$\otimes$ 用于组合一条路径上前后相接的两段，$\oplus$ 用于聚合所有可能的中间选择。&lt;/p&gt;
&lt;h2 id="半环替换加法和乘法"&gt;半环：替换“加法”和“乘法”
&lt;/h2&gt;&lt;p&gt;要让上述“矩阵乘法”成立，我们并不一定要使用普通的加法和乘法。只要两种运算满足一组足以保证组合与聚合一致性的代数规则，就可以在同一个框架中计算。这种结构称为&lt;strong&gt;半环（semiring）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;粗略地说，一个半环包含两种运算：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“加法” $\oplus$：聚合多个候选结果；&lt;/li&gt;
&lt;li&gt;“乘法” $\otimes$：组合连续的子过程。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它们各自满足结合律，“加法”通常还满足交换律；“乘法”对“加法”满足分配律。此外还存在加法单位元与乘法单位元。正是这些性质，使矩阵乘法、路径分解和动态规划递推能够稳定地组合起来。&lt;/p&gt;
&lt;p&gt;不同问题只是为 $\oplus$ 与 $\otimes$ 赋予了不同含义：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;问题&lt;/th&gt;
					&lt;th&gt;聚合候选 $\oplus$&lt;/th&gt;
					&lt;th&gt;连接两段 $\otimes$&lt;/th&gt;
					&lt;th&gt;加法单位元&lt;/th&gt;
					&lt;th&gt;乘法单位元&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;马尔可夫多步转移&lt;/td&gt;
					&lt;td&gt;$+$&lt;/td&gt;
					&lt;td&gt;$\times$&lt;/td&gt;
					&lt;td&gt;$0$&lt;/td&gt;
					&lt;td&gt;$1$&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;最短路径&lt;/td&gt;
					&lt;td&gt;$\min$&lt;/td&gt;
					&lt;td&gt;$+$&lt;/td&gt;
					&lt;td&gt;$+\infty$&lt;/td&gt;
					&lt;td&gt;$0$&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;最长路径（无正环等适用条件下）&lt;/td&gt;
					&lt;td&gt;$\max$&lt;/td&gt;
					&lt;td&gt;$+$&lt;/td&gt;
					&lt;td&gt;$-\infty$&lt;/td&gt;
					&lt;td&gt;$0$&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;路径可达性&lt;/td&gt;
					&lt;td&gt;$\lor$&lt;/td&gt;
					&lt;td&gt;$\land$&lt;/td&gt;
					&lt;td&gt;false&lt;/td&gt;
					&lt;td&gt;true&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;路径计数&lt;/td&gt;
					&lt;td&gt;$+$&lt;/td&gt;
					&lt;td&gt;$\times$&lt;/td&gt;
					&lt;td&gt;$0$&lt;/td&gt;
					&lt;td&gt;$1$&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里的矩阵 $A$ 和 $B$ 分别记录前、后两段子过程在任意两个状态之间的结果，因此 $A_{ik}$ 与 $B_{kj}$ 表示经由中间状态 $k$ 首尾相接的两段路径。&lt;/p&gt;
&lt;p&gt;例如，在最短路径的“min-plus 半环”中，广义矩阵乘法为&lt;/p&gt;
$$
(A\otimes B)_{ij}=\min_k(A_{ik}+B_{kj}).
$$&lt;p&gt;在布尔半环中，它则变成&lt;/p&gt;
$$
(A\otimes B)_{ij}=\bigvee_k(A_{ik}\land B_{kj}),
$$&lt;p&gt;用来判断是否存在一条经过某个中间状态的路径。&lt;/p&gt;
&lt;h2 id="总结同一副骨架不同的运算"&gt;总结：同一副骨架，不同的运算
&lt;/h2&gt;&lt;p&gt;马尔可夫链、Floyd–Warshall 算法、动态规划与矩阵乘法并不是偶然地写出了相似的公式。它们都在处理同一个基本问题：一个复杂过程经过中间状态时，如何由局部结果构造整体结果。&lt;/p&gt;
&lt;p&gt;这个框架可以浓缩为一句话：&lt;/p&gt;
$$
\boxed{
\text{整体结果}
=\text{对所有中间选择进行聚合}
\left(
\text{前半段结果}\ \text{与}\ \text{后半段结果的组合}
\right)
}
$$&lt;p&gt;概率问题使用“求和—相乘”，最短路径使用“取最小值—相加”，可达性问题使用“逻辑或—逻辑与”。问题的表面含义各不相同，但只要确定了“怎样连接两段”和“怎样聚合候选”，同一套递推、动态规划和广义矩阵乘法框架就会自然出现。&lt;/p&gt;
&lt;p&gt;真正统一这些问题的，并不是某一条具体公式，而是公式背后的结构。&lt;/p&gt;</description></item></channel></rss>