在高中階段,矩陣和矩陣乘法的教學往往不被重視. 在絕大多數高中生眼裡,把一些數字排列成 mn 列然後用圓括弧括起來就是矩陣,把矩陣靜態的理解為一種存儲數字的方式,而把矩陣的運算看作是一種數字運算的批處理,對矩陣乘法僅僅停留在規則記憶的層面上,其應用情境也大多侷限在表示線性方程組或諸如小明、小紅、小王買鉛筆、鋼筆、圓珠筆的問題上. 那麼今天橘子老君將從一道老鼠版Maze Runer的趣味問題入手,帶你看一看矩陣的真正實力.

問題

如下圖所示的迷宮共有9個格子,相鄰格子有門相通,9號格子就是迷宮出口. 整個迷宮將會在5分鐘後坍塌. 1號格子有一隻老鼠,這隻老鼠以每分鐘一格的速度在迷宮裡亂竄(它通過各扇門的機會均等)。求此老鼠在迷宮坍塌之前逃生的概率。如果這隻老鼠速度提高一倍,則老鼠在迷宮坍塌之前逃生的概率能增加多少?

以上是2018年上海應用數學知識競賽的一道初賽試題,橘子老君將會講解如何用矩陣乘法來解決這個問題.

簡化版問題

首先,我們不妨先把問題簡化為一個4個格子的迷宮,老鼠仍以每分鐘一格的速度在迷宮裡亂竄,4號格子是迷宮的出口.

由通過各扇門的機會均等,可得格子之間轉移的概率如圖(由於4號格子是出口,所以老鼠到達四號格子後不會向其他格子轉移),

那麼,老鼠經過一次移動,1分鐘後在1-4號的格子的概率分別為 00.50.50 .

我們不妨用向量 v_n 表示 n 分鐘後老鼠在1-4號的格子的概率,故 v_1=left(0,0.5,0.5,0
ight) .

如上圖,通過列舉每一條路徑,當老鼠經過兩次移動,我們發現老鼠可能落在1號或4號格子.

考慮落在1號格子的情況,其對應有兩條路徑, 1
ightarrow2
ightarrow11
ightarrow3
ightarrow1 .

那麼根據老鼠每次的移動相互獨立和加法原理,我們得到老鼠落在1號格子的概率為 0.5	imes0.5+0.5	imes0.5=0.5 .

同理可得落在4號格子的概率也為 0.5 ,故 v_2=left(0.5,0,0,0.5
ight) .

如上圖,進一步列舉3分鐘後的每一條路徑,考慮落在3號的格子的情況,對應的路徑有兩條 1
ightarrow2
ightarrow1
ightarrow31
ightarrow3
ightarrow1
ightarrow3 . 通過分析格子間的轉移概率不難得到,要使老鼠3分鐘後落在3號格子,則2分鐘後老鼠必須在1號格子. 故我們接下來將嘗試寫出相鄰兩分鐘在不同格子概率的遞推關係.

一般地,不妨用 v_n^{(i)} 表示 n 分鐘老鼠落在 i 號格子的概率,則有

由以上遞推關係,我們可以通過編程由計算機來完成計算:

#!/usr/bin/env python3

n = 5 # 計算到n分鐘後的情況
v = (1, 0, 0, 0) # 0分鐘後的情況
i = 0 # 當前計算到i分鐘後
while i < n:
v = (
0.5 * v[1] + 0.5 * v[2],
0.5 * v[0],
0.5 * v[0],
0.5 * v[1] + 0.5 * v[2] + v[3]
)
i = i + 1
print(v + str(i) + : + str(v))

Output:

v1: (0.0, 0.5, 0.5, 0.0)
v2: (0.5, 0.0, 0.0, 0.5)
v3: (0.0, 0.25, 0.25, 0.5)
v4: (0.25, 0.0, 0.0, 0.75)
v5: (0.0, 0.125, 0.125, 0.75)

由上述結果,我們看到,老鼠在五分鐘後逃出的概率為 0.75 . 如果老鼠的移動速度翻倍那無非就是移動的次數從5次變為10次,得到逃出的概率為 0.96875 .

更一般地,我們可以用 a_{ij} 表示老鼠從 i 號格子向 j 號格子移動的概率,那麼

故由矩陣乘法的定義,遞推關係式可以寫成:

馬爾可夫鏈:一些定義

至此我們得到了解決此問題的矩陣形式,我們把此類在不同狀態間隨機移動的數學模型稱為馬爾可夫鏈. 老鼠在隨機移動的過程中可能落在4個格子內,即存在4個狀態. 而每做一次移動,其狀態即發生轉移. 為了討論更一般的情況,我們不妨設有 m 種狀態.

我們把經過 n 次轉移後處於各個狀態的概率所組成的向量 mathrm{x}_n 稱為狀態向量. mathrm{x}_0 稱為初始狀態向量,即

其中 a_j 表示經過 n 次轉移後處於狀態 j 的概率.

我們把各個狀態之間轉移的概率所組成的方陣 P ,稱為轉移矩陣. 即

其中 p_{ij} 是從狀態 j 轉移到狀態 i 的概率[^1].

[^1]: 注意這裡第 i 行第 j 列的元素是從狀態 j 轉移到狀態 i 的概率.

那麼同上文中的推導,我們可以得到相鄰兩個狀態向量的關係,

根據矩陣乘法的性質,不難推得 mathrm{x_{n}}=P^n mathrm{x_0} .

簡化版問題的矩陣解法

在上文簡化版問題中,

下面我們用計算機來完成矩陣乘法計算:

#!/usr/bin/env python3

import numpy as np
n = 5 # 計算到n次轉移後的情況
i = 0 # 當前進行到i次轉移
x = np.array([
[1],
[0],
[0],
[0]]) # 當前的狀態向量
P = np.array([
[0, 0.5, 0.5, 0],
[0.5, 0, 0, 0],
[0.5, 0, 0, 0],
[0, 0.5, 0.5, 1]
]) # 轉移矩陣
while i < n:
x = P.dot(x) # x=P*x
i = i+1
print(x+str(i)+:
+str(x))

Output:

x1:
[[0. ]
[0.5]
[0.5]
[0. ]]
x2:
[[0.5]
[0. ]
[0. ]
[0.5]]
x3:
[[0. ]
[0.25]
[0.25]
[0.5 ]]
x4:
[[0.25]
[0. ]
[0. ]
[0.75]]
x5:
[[0. ]
[0.125]
[0.125]
[0.75 ]]

結語

相信掌握上文中簡化版問題的解法後,那麼原問題的求解也不過是按部就班而已了.

那麼通過這篇文章,你對矩陣乘法及其應用是不是有了更進一步的理解呢?

如果你解決了原9格迷宮問題,歡迎在文章下方留言與大家分享.

另外橘子老君還有幾個思考題,留給大家:

  • 若迷宮不會坍塌,則老鼠平均需要經過幾分鐘才能逃出迷宮?
  • 若老鼠在進行足夠多(無窮多)次移動後,是不是一定會逃出迷宮?
  • 若迷宮並不存在出口,則老鼠在進行足夠多(無窮多)次移動後,落在各個格子裏的概率如何?

導入自橘子老君的博客.

更多適閤中學生的趣味科普文章,關注微信公眾號:橘子數學


推薦閱讀:
相關文章