M4.1 進去就出不來:Absorbing State 與吸收時間
本篇重用M4.0明天的天氣只看今天:Markov Chain 與 Transition Matrix
一個會自己結束的遊戲
一款單人手機遊戲,每一回合結束時系統擲一顆十面骰:擲到 0 遊戲結束,否則進入下一回合。結束了就是結束了——沒有復活、沒有續命,要玩得重開一局。
請先用直覺回答,並寫下你有多確定:
- 一局遊戲平均玩幾回合?
- 你已經玩了二十回合還沒結束。接下來平均還能再玩幾回合?
- 「一半的玩家在第幾回合之前就結束了」——這個數字跟第一題一樣嗎?
第一題幾乎所有人都說十,而且很有把握。第二題就開始分裂:有人說「已經二十回合了,應該快結束了,大概再兩三回合」;有人說「還是十」。第三題多數人下意識覺得跟第一題差不多。這一篇要做的是:把「十」的來源說清楚,然後看它沒有告訴你的事。
課堂提問Q1
用上一篇的語言,這個遊戲是一條什麼樣的 Markov chain?狀態是什麼?我們要算的量「平均玩幾回合」在數學上是哪一個隨機變數的什麼?
先想一想,再展開看整理後的答案
課堂上第一個反應通常是「狀態是第幾回合」——這樣狀態會無限多,而且回合數本身不是隨機的,是我們在數的東西。更好的選擇是只用兩個狀態:「還在玩」(記作 ,alive)與「已結束」(記作 ,ended)。每回合的規則是:
第二列 寫的就是「結束了就出不來」。狀態 這種 的格子叫 absorbing state(吸收態);其他格子叫 transient。
我們要算的量是一個隨機變數:首次到達 的時刻 ,也就是玩到第幾回合結束。「平均玩幾回合」是 ;第三題問的是 的中位數;第二題問的是 conditional expectation 。三個問題問的是同一個隨機變數的三個不同摘要——這是它們答案可以不同的原因。
先抓住這個畫面
回到上一篇的棋子。兩個格子,但這次「已結束」那格是個坑:棋子掉進去就留在裡面,每天擲的骰子都寫「留下」。放一千顆棋子在「還在玩」格。第一回合約一百顆掉坑,剩九百;第二回合九百顆的一成、九十顆掉坑,剩八百一十;每回合掉進去的數量越來越少,但比例永遠是一成。
這個畫面立刻回答了第二題:站在「還在玩」格的棋子,不管已經站了多久,下一回合掉坑的機率都是一成——它沒有記憶。所以「玩了二十回合的人」跟「剛開始的人」面對的未來一模一樣,還能再玩的期望還是十。「應該快結束了」是把「平均十回合」誤讀成「配額」,好像每局有十回合的額度會用完;實際上額度不存在,只有每回合一成的骰子。
把畫面寫成方程式
分佈:幾何遞減
第 回合還在玩,需要前 次骰子都不是 0:
這是 geometric distribution:每回合以固定機率 成功(這裡的「成功」是結束),數到第一次成功為止。用上一篇的矩陣語言,—— 是上三角的, 的左上角就是 。
期望:一行 first-step analysis
要算 ,可以老實對 geometric 求和,但有一個更好的辦法,它適用於任何 absorbing chain。看第一步:走一回合(花掉 1),然後以機率 結束(之後花 0),以機率 回到同一個狀態、面對同樣的未來(再花 ):
這叫 first-step analysis:對每個 transient 狀態 ,令 是從 出發的期望吸收時間,則
一個線性方程組,未知數的個數等於 transient 狀態數。「回到同一個狀態就面對同樣的未來」用掉的正是 Markov property;上一篇的 是把規則往前推,這裡是把「未來的期望」往回推,兩者是同一條性質的兩個方向。
中位數與變異數
中位數解 :,所以一半的玩家在第 7 回合前就結束了。變異數是 ,標準差約 ——幾乎跟期望一樣大。「平均十回合」這句話幾乎沒有告訴你任何一局會玩多久;它只告訴你很多局加起來的總回合數。第三題的直覺(中位數≈期望)錯在把一個右偏、長尾的分佈當成對稱的。
展開細節多個 transient 狀態:fundamental matrix 與兩關遊戲的手算
把 依「transient / absorbing」分塊寫成 。 是「第 步還在 transient 狀態 」的機率,所以從 出發在 停留的期望總步數是 。矩陣 叫 fundamental matrix,期望吸收時間是 ——這就是把 first-step analysis 的方程組 解出來。 可逆的條件是每個 transient 狀態都到得了某個 absorbing state。
例:遊戲分兩關。第 1 關每回合以 0.5 升到第 2 關、0.4 留在第 1 關、0.1 結束;第 2 關每回合 0.8 留下、0.2 結束。方程組 給 ; 給 。從第 1 關開始平均玩約 5.8 回合。細節見 Kemeny–Snell [3] 第 3 章。
跟上一篇的 chain 差在哪
上一篇的 chain 有一個有意義的 stationary distribution ,長期會在兩格之間來回。這裡 的解是 :所有質量最後都在坑裡,這個答案正確但無趣。有 absorbing state 的 chain 不是 irreducible(從 到不了 ),上一篇的收斂定理不適用於「回到 」這件事。問題於是換了:不問「長期在哪」,問「多久到那裡」與「從哪條路到那裡」。
回頭看那三個直覺
理論的判斷。 在「每回合結束機率固定為 、結束後不再回來」的假設下:期望 (直覺對,原因是 first-step analysis);已玩二十回合後剩餘期望仍是 10(「快結束了」錯在假想了一個不存在的配額——geometric 的 memoryless 性質 與從頭開始一樣);中位數約 7,不等於期望(直覺錯在忽略分佈的右偏)。
哪裡可能失準。 兩個假設都可能不成立。若結束機率隨回合增加(難度爬升、玩家疲勞), 遞增,期望會低於 ,而且 memoryless 失效——這時「玩了很久應該快結束了」反而是對的。若結束後可以復活(), 就不是 absorbing state,chain 變回 irreducible,「平均玩幾回合」要改問成「每一段連續遊玩的平均長度」,而長期在 的比例 又變得有意義。
動手跑一次
import numpy as np
rng = np.random.default_rng(0)
q, T = 0.1, 100_000
tau = rng.geometric(q, size=T) # 每局的結束回合
print("平均", tau.mean(), " 中位數", np.median(tau), " 標準差", tau.std())
alive20 = tau[tau > 20]
print("已玩 20 回合者,剩餘平均", (alive20 - 20).mean()) # ≈ 10
# 違反假設:結束機率隨回合遞增 q_n = 0.1 + 0.02 (n-1)
def play():
n = 1
while rng.random() >= min(1, 0.1 + 0.02 * (n - 1)): n += 1
return n
tau2 = np.array([play() for _ in range(T)])
print("遞增 q:平均", tau2.mean(), " 已玩 5 回合者剩餘", (tau2[tau2 > 5] - 5).mean())
先消化一下
參考文獻
- Norris, J. R. Markov Chains. Cambridge University Press, 1997.(1.3 節 hitting times 與 first-step analysis。)
- Grimmett, G., Stirzaker, D. Probability and Random Processes, 3rd ed. Oxford University Press, 2001.(第 6 章。)
- Kemeny, J. G., Snell, J. L. Finite Markov Chains. Springer, 1976.(absorbing chain 與 fundamental matrix 的經典處理。)