📜  求从 N 点移动 N 次后到达所有点的概率(1)

📅  最后修改于: 2023-12-03 15:11:02.540000             🧑  作者: Mango

求从 N 点移动 N 次后到达所有点的概率

移动模型是一个重要的概率模型,它可以应用于很多场景。本文将介绍如何求从 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$ 的概率能够到达所有点。这个结果可以作为随机游走问题中的重要参考。