乙個老鼠走迷宮問題的python解法

2021-10-11 02:23:09 字數 3291 閱讀 9127

今天在查詢馬爾科夫鏈的過程中,在網上看到乙個有意思的問題,於是用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

print

('初始狀態為:'

)print

(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

print

('第{}次行動後的狀態為:'

.format

(str

(i+1))

)print

(a)print

('\n'

)p = a[aa,bb]

print

('老鼠到達出口的概率為:'

+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 格。也可以花費一秒的時間向左或向右轉。同時他不能撞到障礙物,也不能半個身體在地圖外...