📅  最后修改于: 2023-12-03 15:11:02.540000             🧑  作者: Mango
移动模型是一个重要的概率模型,它可以应用于很多场景。本文将介绍如何求从 N 点移动 N 次后到达所有点的概率。
在一个无限大的网格图中,从 $N$ 点开始,做 $N$ 步随机游走,每一步等概率走向上下左右四个方向中的一个。求到达所有点的概率。
这是一个非常经典的概率问题。我们可以考虑使用 Markov Chain 来解决这个问题。
具体来说,我们可以将一个点的状态定义为到达这个点所需要的步数。例如,$N$ 点的状态为 $0$,$N$ 点周围的四个点的状态为 $1$,以此类推。
在 Markov Chain 中,每次转移的概率只与当前状态有关。由于每一步等概率走向上下左右四个方向中的一个,因此每个非零状态 $i$ 都有四个转移概率,分别对应上下左右四个方向。可以用一个四元组记录这四个概率。而状态 $0$ 只有一个转移概率 $1$,转移到周围四个点中的任意一个。
最终的 Markov Chain 是一个有限状态的 Markov Chain,因此我们可以使用矩阵乘法进行计算。设转移矩阵为 $P$,则状态向量的初始值为 $(1,0,0,\dots)$,表示一开始在 $N$ 点,其余点的状态为 $+\infty$。通过连续 $N$ 次矩阵与向量的乘法,我们可以计算出 $N$ 次移动后到达每个点的概率。
下面是 Python 的代码实现。
import numpy as np
def calc_prob(n):
m = (2 * n + 1) ** 2 # 状态数
P = np.zeros((m, m)) # 转移矩阵
for i in range(2 * n + 1):
for j in range(2 * n + 1):
u = i * (2 * n + 1) + j # 当前点的状态编号
if i == 0 and j == 0: # 起始点,只有一个出边
P[u][u] = 1
continue
for (dx, dy) in [(0, -1), (0, 1), (-1, 0), (1, 0)]:
x = i + dx
y = j + dy
if x < 0 or x > 2 * n or y < 0 or y > 2 * n:
continue # 边界外的点无法到达
v = x * (2 * n + 1) + y # 相邻点的状态编号
P[u][v] = 0.25
v = np.zeros((m, 1)) # 初始状态向量
v[0] = 1
for i in range(n):
v = np.dot(P, v)
return v.reshape(2 * n + 1, 2 * n + 1) # 转换成二维数组并返回
下面是 $n=4$ 时的可视化结果。橙色的点表示起点 $N$,红色的点表示到达概率为 $1$ 的点,黄色的点表示到达概率为 $0.5$ 的点,绿色的点表示到达概率为 $0$ 的点。
通过上面的计算,我们可以得出从 $N$ 点移动 $N$ 次后到达所有点的概率。例如,当 $n=4$ 时,概率为 $0.004159$,也就是说,只有不到 $1/240$ 的概率能够到达所有点。这个结果可以作为随机游走问题中的重要参考。