利用狀態轉移矩陣和VBA求遊戲中各種事件達成次數的期望
在工作中計算經濟數值的時候,經常會遇到需要計算各種事件完成期望的工作(比如計算集齊一套特定的卡牌搭配需要抽多少次……)。本文就介紹一種比較快捷的計算方法。
一般來說,計算期望有以下幾種方法:
依據期望的定義式,套用某些概型公式,數學推導計算期望。
這種方法需要解題靈感,有了靈感五分鐘就解出來,沒思路的話就要卡很久。工作中不是很推薦這種方法,因為工作需要穩定的產出。
用vba寫程序模擬事件過程,跑很多次模擬期望次數。
這種穩定是達到了,但就是很麻煩,而且有的事件自己用vba寫出來的難度幾乎相當於重構了一遍項目對應模塊的代碼。
寫出該事件的狀態轉移矩陣,再用VBA處理求出具體期望。
以下介紹這種方法。
什麼是狀態轉移矩陣
就是一個矩陣,裡面的元素都是非負的,且各行元素之和為1.
舉個例子:
某個裝備有+0,+1,+2三種狀態。
+0強化至+1,成功率50%,失敗後等級不變。
+1強化至+2,成功率40%,失敗後等級下降至+0。
求由+0強化至+2的次數的期望值。
則該事件的一步狀態轉移矩陣可以寫為:
第一列第一行的0.5代表,強化一次從狀態+0變為狀態+2的概率為0.5,
同理,第i列第j行的元素即代表強化一次從狀態i變為狀態j的概率。
一步狀態概率矩陣我們可以依照給定的情況很方便的寫出來。
什麼是K步狀態轉移矩陣
k步狀態轉移矩陣即為一步狀態轉移矩陣的K次方
矩陣的乘法規則自己百度。
舉個例子:
該事件的則該事件的二步狀態轉移矩陣可以經計算得到:
第i列第j行的元素即代表強化二次從狀態i變為狀態j的概率。
可以看到,強化二次從狀態+0變為狀態+2的概率為0.2
同理我們可以獲得強化K次從狀態+0變為狀態+2的概率。
由期望定義式可知:
Xk=K
Pk=[K步狀態轉移矩陣中的Pij]-[K-1步狀態轉移矩陣中的Pij]
然後累加即可。
之所以Pk=[K步狀態轉移矩陣中的Pij]-[K-1步狀態轉移矩陣中的Pij],是因為[K步狀態轉移矩陣中的Pij]包含了[K-1步狀態轉移矩陣中的Pij],減去後才是僅經過K次強化後強化至+2的次數。
(其實就是一個概率分布函數)
Pij的值最終會收斂於1
用VBA計算上述過程,代碼如下(我寫的程序比較糙,屬於能跑起來的那種):
Sub Matrix()
Dim i, j, k, a(1 To 10000, 1 To 10, 1 To 10), b(1 To 10000, 1 To 10, 1 To 10), p(1 To 1000), e(1 To 1000)
For i = 1 To 3 一步轉移矩陣寫入
For j = 1 To 3
a(1, i, j) = Cells(i + 3, j + 2)
Next j
Next i
p(1) = 0
For k = 2 To 1000 K步轉移矩陣計算
For i = 1 To 3
For j = 1 To 3
a(k, i, j) = a(1, i, 1) * a(k - 1, 1, j) + a(1, i, 2) * a(k - 1, 2, j) + a(1, i, 3) * a(k - 1, 3, j)
Next j
Next i
p(k) = a(k, 1, 3) Pk=[K步狀態轉移矩陣中的Pij]
Next k
e(1) = 0
For k = 2 To 1000
e(k) = e(k - 1) + k * (p(k) - p(k - 1)) 累加求和求得最終期望值
Next k
MsgBox e(1000)
End Sub
輸出結果為: