今天在查詢馬爾科夫鏈的過程中,在網上看到乙個有意思的問題,於是用python將其做了實現和改進,題目如下:
如下圖所示的迷宮共有9個格仔,相鄰格仔有門相通,9號格仔就是迷宮出口. 整個迷宮將會在5分鐘後坍塌.1號格仔有乙隻老鼠,這只老鼠以每分鐘一格的速度在迷宮裡亂竄(它通過各扇門的機會均等)。求此老鼠在迷宮坍塌之前逃生的概率。如果這只老鼠速度提高一倍,則老鼠在迷宮坍塌之前逃生的概率能增加多少?
題目中可以看空間1為入口,空間9為出口,思路上既可以用迭代的方法,也可以用矩陣形式來編寫 。
先是基於馬爾科夫鏈的矩陣形式。馬爾科夫鏈的本質是乙個時間、狀態離散的馬爾可夫過程,本質特徵就是,模型當前的狀態,依賴也僅依賴於前面的那乙個狀態。
設s為狀態分布矩陣,p為狀態轉移矩陣,那麼老鼠的每一次移動,這個過程即是乘上p的過程,當前的狀態分布矩陣,即是p與s的矩陣乘積。(此處s需以列向量的形式呈現)具體不在贅述,如果程式設計採用矩陣運算的形式,那麼對於題中這樣乙個長度為9的狀態分布矩陣,就需要用到9*9的狀態轉移矩陣來計算,如果迷宮變大了,矩陣將會變得非常大。
那麼從迭代的思路來看呢:
在初始狀態的情況下,老鼠所在的位置,空間狀態概率被記為1,其餘位置的概率為零。
現在老鼠只有兩個選擇,要麼去2,要麼去4,在機會均等的情況下,那麼下乙個狀態(也就是老鼠動一步的情況下),老鼠到達2和4的概率都是0.5,而老鼠留在1的概率為0,所以2、4的當前狀態的概率都變成了0.5,而1的當前狀態的概率,變成了0。
現在要進行下一次移動,又會面臨新的選擇,老鼠每一次的移動,就以此類推。
我們拋開確定的狀態,從整體任選乙個狀態。如果老鼠的當前位置處於四個角上,即周圍存在兩個可以去的空間,那麼移動機會均等的情況下,去往每乙個空間的可能性為1/2。如果老鼠當前位於邊上,周圍就有三個可以去的空間,那麼這個概率就變成了1/3,以此類推,內部的話就會有四個空間,概率是1/4。
然後我們再考慮,從上乙個狀態到達當前狀態的概率是多少呢?那就要看,當前位置,老鼠可能是從**來的。如果老鼠**的那個空間,周圍有三個可以去的空間,那麼現在空間的概率,就是老鼠**空間概率的1/3,當然,當前空間不僅僅只會有這乙個老鼠**,會有很多個,那麼當前空間的概率,就是這些**的累積。
除此以外,要考慮幾個點:老鼠走到出口後,是不會再動的,這就意味著,出口相鄰的點,是不會接受來自出口的老鼠的,也就是從出口出來的老鼠,概率應當統統記為0。既然老鼠在出口去不了其他地方,是在出口是不會動的,那麼老鼠在出口的概率,就每次更新狀態時候應當保留。(出口,是乙個只進不出的點)
此外,這個程式可以自行設定迷宮長與寬,設定老鼠當前位置和出口位置,設定步數。
可以的改進:可以擴充套件到三維或是多維;設定某個移動方向的傾向(也就是概率,目前是概率均等)
執行結果示例:import numpy as np
defconnect
(point,size,rat_exit)
: flag =
0 m,n = size
x,y = point
if[x,y]
== rat_exit:
return
0for
[xx,yy]in[
[x-1
,y],
[x+1
,y],
[x,y-1]
,[x,y+1]
]:if0
<=xx
0<=yy
flag +=
1if flag ==1:
return
1elif flag ==2:
return
0.5elif flag ==3:
return1/
3elif flag ==4:
return
0.25
#main
size =
input
('棋盤的長與寬:'
)size =
list
(int
(x)for x in size.split(
',')
)m,n = size
rat =
input
('入口所在座標:'
)rat =
list
(int
(x)for x in rat.split(
',')
)a,b = rat
rat_exit =
input
('出口所在座標:'
)rat_exit =
list
(int
(x)for x in rat_exit.split(
',')
)aa,bb = rat_exit
# l = int(input('逃離步長:'))
t =int
(input
('逃離步數:'))
a = np.zeros(
[m,n]
)a[a,b]=1
('初始狀態為:'
(a)for i in
range
(t):
aa = a.copy(
)for x in
range
(m):
for y in
range
(n):
if[x,y]
!= rat_exit:
aa[x,y]=0
for[xx,yy]in[
[x-1
,y],
[x+1
,y],
[x,y-1]
,[x,y+1]
]:if0
<=xx
0<=yy
aa[x,y]
+= a[xx,yy]
*connect(
[xx,yy]
,size,rat_exit)
a = aa
('第{}次行動後的狀態為:'
.format
(str
(i+1))
(a)print
('\n'
)p = a[aa,bb]
('老鼠到達出口的概率為:'
+str
(p))
乙個走迷宮的程式
本文給出乙個c語言版的走迷宮的程式。迷宮的寬和高,迷宮矩陣,迷宮的入口和出口從檔案讀入。程式首先讀入迷宮資料,然後顯示迷宮矩陣,最後呼叫迷宮搜尋程式找到乙個路徑,並輸出。1.迷宮的表示。迷宮用結構體matrix來表示 包括迷宮矩陣 迷宮的寬,迷宮的高,迷宮入口的座標,迷宮出口的座標。結構體定義如下 ...
老鼠走迷宮問題,求出所有路徑
本次所練習使用的主要方法是遞迴 所要注意的主要問題是 要確定起訖點的相對位置,否則又由於遞迴 的順序會漏掉一些可行路徑 先橫向 縱向接近目標點,然後再橫向 縱向遠離目標點 最好對應 例如 假設訪問的順序是下上右左 相對於乙個固定的矩陣 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 ...
UESTC 853 乙個簡單的走迷宮問題
這是乙個網格迷宮問題,地圖的左上角為 0 0 座標 i j 表示 i 行 j 列。有乙個人,他在乙個迷宮裡,他要去乙個目標位置。他站在網格的交叉點上,障礙物在網格內部。他可以用不同的速度前進,每秒可以走 1 格到 3 格。也可以花費一秒的時間向左或向右轉。同時他不能撞到障礙物,也不能半個身體在地圖外...