吸収マルコフ連鎖と到達時間の理論と実装

コインを1枚ずつ賭けるギャンブラーが、手持ち $i$ ドルから始めて $0$ ドル(破産)か $N$ ドル(目標達成)に到達するまで賭け続けるとしましょう。素朴な疑問が2つ湧きます。「破産する確率はどれくらいか?」 そして 「決着がつくまで平均で何回賭けることになるのか?」。この2つの問いは、シミュレーションを何万回も回さなくても、たった1回の逆行列計算で厳密に答えが出ます。その鍵が「吸収マルコフ連鎖」と「基本行列」です。

「一度入ったら二度と出られない状態(吸収状態)」を持つマルコフ連鎖は、身の回りにあふれています。ゲームの勝敗、病気の治癒/死亡、化学反応が安定生成物に落ち着くまで、ランダムウォークが壁にぶつかるまで——いずれも「ふらふらと過渡的な状態をさまよい、いつか終着点に吸い込まれる」構造を持ちます。こうした過程を解析する道具立てが、この記事の主役です。

この考え方は幅広く応用されます。たとえば 信頼性工学 では、機器が正常・劣化・故障といった状態を遷移し「故障(吸収状態)までの平均時間(MTTF)」を求めるのに使えます。アルゴリズム解析 では、ランダム化アルゴリズムが停止するまでの期待ステップ数を評価できます。ほかにも待ち行列、疫学のSIRモデル、強化学習のエピソード長解析など、「いつ終わるか」「どこに落ち着くか」を問う場面のいたるところに顔を出します。

本記事の内容

  • 吸収マルコフ連鎖と標準形 $\begin{psmallmatrix}Q&R\\0&I\end{psmallmatrix}$ の作り方
  • 基本行列 $N=(I-Q)^{-1}$ が「滞在期待回数」を表す理由を級数 $\sum Q^k$ から導出
  • 期待到達時間 $\bm{t}=N\bm{1}$ と吸収確率 $B=NR$ の導出(省略なし)
  • ギャンブラーの破産・酔歩を例にした Python 実装とモンテカルロ検証

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

マルコフ連鎖の推移行列と、状態が時間発展する仕組みを押さえておくと、以下の議論がすっと入ってきます。とくに「定常分布」を扱った記事ではエルゴード的(どの状態にも行き来できる)連鎖を主に扱いましたが、本記事はそれとは正反対の、一度入ると出られない吸収状態を持つ連鎖が主題です。両者を対比しながら読むと理解が深まります。

吸収マルコフ連鎖の概念図: 過渡状態をさまよい最後に吸収状態へ落ちる

まず全体像です。図のように、連鎖は過渡状態(transient state)の間をランダムに行ったり来たりしますが、いつかは吸収状態(absorbing state)に落ち込み、そこから二度と出てきません。私たちが知りたいのは「落ちるまでに過渡状態で何ステップ過ごすか(到達時間)」と「複数ある吸収状態のどれに落ちるか(吸収確率)」の2つ。この記事は、その両方を線形代数だけで閉じた式に落とし込みます。

吸収マルコフ連鎖とは

まずは直感から入りましょう。すごろくを思い浮かべてください。マス目の上を進んでいき、「あがり」のマスに着いたらゲーム終了、もう動きません。この「あがり」こそが吸収状態です。それ以外の途中のマスは、まだゲームが続いている過渡状態にあたります。吸収マルコフ連鎖とは、大雑把にいえば「いつか必ずあがりに着くすごろく」のことです。

厳密な定義を述べます。マルコフ連鎖の状態 $i$ が吸収状態 (absorbing state) であるとは、その状態にとどまり続ける確率が $1$、すなわち

$$ p_{ii} = 1 $$

を満たすことをいいます。いったん $i$ に入れば、次の時刻も、その次も、永遠に $i$ にとどまります。吸収状態でない状態を過渡状態 (transient state) と呼びます。

そして、マルコフ連鎖が吸収的 (absorbing) であるとは、次の2条件を満たすことをいいます。

  1. 少なくとも1つの吸収状態を持つ
  2. どの過渡状態からも、有限ステップで少なくとも1つの吸収状態に到達できる

条件2が本質的に重要です。これがあるおかげで「どの過渡状態から出発しても、確率1でいつかは吸収される」ことが保証されます。裏を返せば、過渡状態に永遠に居座り続ける確率はゼロです。この性質が、あとで基本行列の存在(逆行列が定義できること)を支えます。

たとえば冒頭のギャンブラーの破産では、手持ちが $0$ ドル(破産)と $N$ ドル(目標)の2つが吸収状態、その間の $1,2,\dots,N-1$ ドルが過渡状態です。どの手持ち額からでも、運が続けば $0$ か $N$ に届くので、条件2が満たされます。

ここまでで「どんな連鎖を扱うのか」がはっきりしました。次に、この連鎖の推移行列を吸収状態と過渡状態でグループ分けして並べ替えると、驚くほど扱いやすい形になります。これを標準形と呼びます。

推移行列の標準形

推移行列 $\bm{P}$ の $(i,j)$ 成分 $p_{ij}$ は「状態 $i$ から状態 $j$ へ1ステップで移る確率」でした。ここで状態の並び順を工夫します。過渡状態を先に、吸収状態を後にまとめて並べ替えるのです。すると、$\bm{P}$ は次の4つのブロックに自然に分かれます。

$$ \begin{equation} \bm{P} = \begin{pmatrix} \bm{Q} & \bm{R} \\ \bm{0} & \bm{I} \end{pmatrix} \end{equation} $$

ここで、過渡状態が $t$ 個、吸収状態が $r$ 個あるとすると、各ブロックの意味と大きさは次の通りです。

ブロック 大きさ 意味
$\bm{Q}$ $t \times t$ 過渡状態 → 過渡状態の遷移確率
$\bm{R}$ $t \times r$ 過渡状態 → 吸収状態の遷移確率
$\bm{0}$ $r \times t$ 吸収状態 → 過渡状態(必ず $0$)
$\bm{I}$ $r \times r$ 吸収状態 → 吸収状態(単位行列)

下段が $\begin{pmatrix}\bm{0} & \bm{I}\end{pmatrix}$ になっているのがポイントです。吸収状態からは過渡状態へ戻れない(左下が $\bm{0}$)ので、いったん吸収されると自分自身にとどまる(右下が $\bm{I}$)だけ。これはまさに $p_{ii}=1$ の定義そのものです。

推移行列の標準形: 過渡Q・過渡→吸収R・0・単位行列Iの4ブロック

図は標準形のブロック構造を色分けで示したものです。左上の $\bm{Q}$(過渡どうしの行き来)と右上の $\bm{R}$(吸収への流出)だけが「ゲームの動き」を担い、下段は「終わったらそのまま」を表すだけであることが視覚的にわかります。したがって、これから解析すべき情報はすべて $\bm{Q}$ と $\bm{R}$ に詰まっています。

標準形を作れたので、次は「連鎖を $k$ ステップ進めるとどうなるか」を調べます。行列のべき乗 $\bm{P}^k$ を計算すると、$\bm{Q}$ のべき乗が主役として現れ、基本行列への道が開けます。

行列のべき乗と基本行列の登場

マルコフ連鎖では、$k$ ステップ後の遷移確率は推移行列の $k$ 乗 $\bm{P}^k$ の成分で与えられます。標準形の $\bm{P}$ をべき乗すると、ブロックの構造がそのまま保たれます。まず2乗を計算してみましょう。ブロック行列の掛け算のルールに従うと、

$$ \bm{P}^2 = \begin{pmatrix} \bm{Q} & \bm{R} \\ \bm{0} & \bm{I} \end{pmatrix}\begin{pmatrix} \bm{Q} & \bm{R} \\ \bm{0} & \bm{I} \end{pmatrix} = \begin{pmatrix} \bm{Q}^2 & \bm{Q}\bm{R}+\bm{R} \\ \bm{0} & \bm{I} \end{pmatrix} $$

となります。左上には $\bm{Q}^2$、右上には $(\bm{Q}+\bm{I})\bm{R}$ が現れました。これを一般化すると、数学的帰納法により $k$ 乗は

$$ \begin{equation} \bm{P}^k = \begin{pmatrix} \bm{Q}^k & \left(\displaystyle\sum_{j=0}^{k-1}\bm{Q}^j\right)\bm{R} \\ \bm{0} & \bm{I} \end{pmatrix} \end{equation} $$

と書けます。左上の $\bm{Q}^k$ は「$k$ ステップ経ってもまだ過渡状態にいて、しかも特定の過渡状態にいる確率」を表します。ここで先ほどの条件2(いつか必ず吸収される)が効いてきます。過渡状態に永遠にとどまる確率はゼロなので、$k\to\infty$ で

$$ \bm{Q}^k \to \bm{0} \quad (k\to\infty) $$

が成り立ちます。これは $\bm{Q}$ のすべての固有値の絶対値が $1$ 未満(スペクトル半径 $< 1$)であることと同値です。

Q^k の各成分が0へ減衰する様子(過渡状態に残る確率が消える)

図は $\bm{Q}^k$ の成分がステップ $k$ とともに $0$ へ減衰していく様子です。指数関数的に消えていくのが読み取れます。これは「時間が経てば経つほど、まだゲームが終わっていない確率が急速に小さくなる」ことを意味します。この収束こそが、次に定義する無限級数が有限の値に収まる根拠です。

$\bm{Q}^k\to\bm{0}$ なら、幾何級数の行列版

$$ \begin{equation} \bm{N} = \sum_{k=0}^{\infty}\bm{Q}^k = \bm{I}+\bm{Q}+\bm{Q}^2+\bm{Q}^3+\cdots \end{equation} $$

が収束します。この $\bm{N}$ を基本行列 (fundamental matrix) と呼びます。次のセクションで、この無限級数が実は簡単な逆行列で書けること、そしてその成分が美しい意味を持つことを示します。

基本行列 $N=(I-Q)^{-1}$ の導出

無限級数を逆行列に畳み込む

まず、無限和 $\bm{N}=\sum_{k=0}^\infty \bm{Q}^k$ を閉じた形にします。スカラーの等比級数 $1+q+q^2+\cdots = 1/(1-q)$($|q|<1$)の行列版を作る要領です。$\bm{N}$ に左から $(\bm{I}-\bm{Q})$ を掛けてみましょう。

$$ (\bm{I}-\bm{Q})\bm{N} = (\bm{I}-\bm{Q})\sum_{k=0}^{\infty}\bm{Q}^k $$

右辺を展開すると、隣り合う項が次々に打ち消し合います(望遠鏡和)。具体的に書き下すと、

$$ (\bm{I}-\bm{Q})(\bm{I}+\bm{Q}+\bm{Q}^2+\cdots) = (\bm{I}+\bm{Q}+\bm{Q}^2+\cdots) – (\bm{Q}+\bm{Q}^2+\bm{Q}^3+\cdots) $$

となります。第2項は第1項を1つずらしたものなので、$\bm{I}$ 以外はすべて消えます。$k\to\infty$ で $\bm{Q}^{k}\to\bm{0}$ だから末尾の項も残りません。したがって

$$ (\bm{I}-\bm{Q})\bm{N} = \bm{I} $$

を得ます。両辺に左から $(\bm{I}-\bm{Q})^{-1}$ を掛けると($\bm{Q}$ のスペクトル半径が $1$ 未満なので $\bm{I}-\bm{Q}$ は正則で逆行列が存在します)、

$$ \begin{equation} \bm{N} = (\bm{I}-\bm{Q})^{-1} \end{equation} $$

が導かれました。無限回の行列積の和が、たった1回の逆行列計算に化けたわけです。これがモンテカルロを回さずに答えが出る種明かしです。

成分 $N_{ij}$ が「滞在期待回数」である理由

次に、この $\bm{N}$ の成分 $N_{ij}$ が何を意味するかを突き止めます。結論は次の通りです。

$N_{ij}$ は、過渡状態 $i$ から出発したとき、吸収されるまでに過渡状態 $j$ を訪れる期待回数(初回の滞在も含む)である。

これを確率の言葉で示します。指示変数(インジケータ)$\mathbb{1}[X_k = j]$ を「時刻 $k$ に状態 $j$ にいれば $1$、そうでなければ $0$」と定めます。すると、$i$ から出発して過渡状態 $j$ を訪れる総回数は、時刻 $0,1,2,\dots$ の指示変数を全部足したもの

$$ V_{ij} = \sum_{k=0}^{\infty}\mathbb{1}[X_k = j \mid X_0 = i] $$

です。その期待値を取ると、期待値と和が交換できて、

$$ E[V_{ij}] = \sum_{k=0}^{\infty} E\big[\mathbb{1}[X_k=j\mid X_0=i]\big] = \sum_{k=0}^{\infty} P(X_k = j \mid X_0 = i) $$

となります。ここで、指示変数の期待値がそのまま確率になること($E[\mathbb{1}[A]]=P(A)$)を使いました。最後に、$i,j$ がともに過渡状態のとき「$k$ ステップで $i$ から $j$ へ移る確率」はまさに $\bm{Q}^k$ の $(i,j)$ 成分ですから、

$$ E[V_{ij}] = \sum_{k=0}^{\infty}(\bm{Q}^k)_{ij} = \left(\sum_{k=0}^{\infty}\bm{Q}^k\right)_{ij} = N_{ij} $$

が得られます。$k=0$ の項 $(\bm{Q}^0)_{ij}=(\bm{I})_{ij}$ が、出発点そのものの滞在($i=j$ のとき1回分)を数えていることに注意してください。これで $N_{ij}$ の意味が確定しました。

基本行列 N のヒートマップ(過渡状態 j の滞在期待回数)

図は後述するギャンブラーの破産(公平な賭け、$N=5$)における基本行列 $\bm{N}$ のヒートマップです。対角成分が大きく、出発点から遠い状態ほど滞在回数が減っていく様子が見て取れます。この行列1つに、到達時間と吸収確率を計算するための情報がすべて凝縮されています。

滞在回数の意味がわかったので、あとは足し算するだけです。次のセクションで、$\bm{N}$ から期待到達時間と吸収確率を一気に取り出します。

期待到達時間と吸収確率の導出

期待到達時間 $\bm{t}=N\bm{1}$

「過渡状態 $i$ から出発して、吸収されるまでに何ステップかかるか」の期待値を $t_i$ とします。吸収されるまでのステップ数は、過渡状態のどこかにいた回数の合計に等しいことに注目してください。つまり、$j$ を過渡状態全体にわたって滞在回数を足し上げれば、それが総ステップ数になります。期待値で書くと、

$$ t_i = \sum_{j:\text{過渡}} N_{ij} $$

です。これは行列 $\bm{N}$ の第 $i$ 行の成分を全部足したものにほかなりません。すべての過渡状態についてまとめてベクトル表記すると、要素がすべて $1$ の列ベクトル $\bm{1}$ を右から掛けることで、

$$ \begin{equation} \bm{t} = \bm{N}\bm{1} = (\bm{I}-\bm{Q})^{-1}\bm{1} \end{equation} $$

と一発で書けます。$\bm{t}$ の第 $i$ 成分 $t_i$ が、状態 $i$ からの期待到達時間(期待吸収時間)です。

別の導き方(1ステップ解析) も紹介しておきます。状態 $i$ から1歩進むと、まず1ステップ消費します。その後、確率 $Q_{ij}$ で過渡状態 $j$ に移り、そこから改めて $t_j$ ステップかかる、と考えると、

$$ t_i = 1 + \sum_{j:\text{過渡}} Q_{ij}\, t_j $$

という漸化式が立ちます。行列で書けば $\bm{t}=\bm{1}+\bm{Q}\bm{t}$。ここで $\bm{Q}\bm{t}$ を左辺に移すと $(\bm{I}-\bm{Q})\bm{t}=\bm{1}$ となり、両辺に $(\bm{I}-\bm{Q})^{-1}$ を掛ければ $\bm{t}=(\bm{I}-\bm{Q})^{-1}\bm{1}=\bm{N}\bm{1}$。級数から導いた結果と完全に一致しました。2つの道が同じ答えに合流するのは気持ちがいいですね。

吸収確率 $B=NR$

複数の吸収状態があるとき、「過渡状態 $i$ から出発して、最終的に吸収状態 $j$ に吸い込まれる確率」を $B_{ij}$ とします。これも1ステップ解析で導けます。状態 $i$ から1歩進んだとき、次の2つの経路があります。

  1. 直接吸収される: 確率 $R_{ij}$ で、いきなり吸収状態 $j$ に入る
  2. 過渡状態を経由する: 確率 $Q_{il}$ で別の過渡状態 $l$ に移り、そこから改めて $j$ に吸収される(確率 $B_{lj}$)

この2つを足し合わせると、

$$ B_{ij} = R_{ij} + \sum_{l:\text{過渡}} Q_{il}\, B_{lj} $$

という関係が得られます。行列で書くと $\bm{B} = \bm{R} + \bm{Q}\bm{B}$。$\bm{Q}\bm{B}$ を左辺に移すと $(\bm{I}-\bm{Q})\bm{B}=\bm{R}$ となり、両辺に左から $(\bm{I}-\bm{Q})^{-1}$ を掛けて、

$$ \begin{equation} \bm{B} = (\bm{I}-\bm{Q})^{-1}\bm{R} = \bm{N}\bm{R} \end{equation} $$

を得ます。$\bm{B}$ は $t\times r$ 行列で、第 $(i,j)$ 成分が「$i$ から出発して吸収状態 $j$ に落ちる確率」です。各行の和は $1$ になります(必ずどこかの吸収状態に落ちるから)。この $B=NR$ は、滞在回数 $\bm{N}$ に「過渡状態から吸収へ流れ出る確率 $\bm{R}$」を掛けることで、「各過渡状態を経由して吸収へ流れ込む総量」を積み上げている、と読むと直感的です。

まとめると、基本行列 $\bm{N}=(\bm{I}-\bm{Q})^{-1}$ さえ計算すれば、$\bm{t}=\bm{N}\bm{1}$ で到達時間、$\bm{B}=\bm{N}\bm{R}$ で吸収確率が一挙に手に入ります。理論はこれで完結です。では、この威力を具体例で味わいましょう。

具体例:公平なギャンブラーの破産

古典的なギャンブラーの破産問題 (gambler’s ruin) を題材にします。手持ち $i$ ドルから始め、毎回1ドルを賭けて、確率 $p$ で1ドル増え、確率 $q=1-p$ で1ドル減ります。手持ちが $0$(破産)または $N$(目標達成)になったらゲーム終了です。ここでは目標 $N=5$、公平な賭け $p=q=1/2$ とします。

状態は $0,1,2,3,4,5$ の6つ。吸収状態は $0$ と $5$、過渡状態は $1,2,3,4$ の4つです。過渡状態を $1,2,3,4$ の順、吸収状態を $0,5$ の順に並べると、$\bm{Q}$($4\times4$)と $\bm{R}$($4\times2$)は次のようになります。

$$ \bm{Q}=\begin{pmatrix}0&\tfrac12&0&0\\ \tfrac12&0&\tfrac12&0\\ 0&\tfrac12&0&\tfrac12\\ 0&0&\tfrac12&0\end{pmatrix},\qquad \bm{R}=\begin{pmatrix}\tfrac12&0\\ 0&0\\ 0&0\\ 0&\tfrac12\end{pmatrix} $$

$\bm{R}$ の列は左が吸収状態 $0$(破産)、右が吸収状態 $5$(達成)です。たとえば手持ち $1$ からは、確率 $1/2$ で $0$(破産)に直行し、確率 $1/2$ で $2$ に上がります。だから $\bm{R}$ の第1行は $(\tfrac12,0)$、$\bm{Q}$ の第1行は $(0,\tfrac12,0,0)$ となっています。

基本行列 $\bm{N}=(\bm{I}-\bm{Q})^{-1}$ を計算すると、

$$ \bm{N}=\begin{pmatrix}1.6&1.2&0.8&0.4\\ 1.2&2.4&1.6&0.8\\ 0.8&1.6&2.4&1.2\\ 0.4&0.8&1.2&1.6\end{pmatrix} $$

となります。これを使って到達時間と吸収確率を求めましょう。到達時間は各行の和 $\bm{t}=\bm{N}\bm{1}$ で、

$$ \bm{t}=(4,\ 6,\ 6,\ 4)^\top $$

吸収確率は $\bm{B}=\bm{N}\bm{R}$ で、

$$ \bm{B}=\begin{pmatrix}0.8&0.2\\ 0.6&0.4\\ 0.4&0.6\\ 0.2&0.8\end{pmatrix} $$

と求まります。ここから多くのことが読み取れます。手持ち $2$ ドルからスタートすると、平均 $6$ 回でゲームが決着し、達成($5$ ドル到達)できる確率は $0.4$、破産する確率は $0.6$ です。真ん中の $2,3$ から始めると長引き($6$ 回)、端の $1,4$ から始めるとすぐ決着する($4$ 回)のも納得できます。

公平な賭けでは、これらの値が有名な閉じた式と一致します。達成確率は $B_{i,N}=i/N$、期待到達時間は $t_i=i(N-i)$ です。実際 $i=2,\ N=5$ なら達成確率 $2/5=0.4$、到達時間 $2\times3=6$ で、上の行列計算とぴったり合います。逆行列がこの美しい公式を自動的に再現しているわけです。次は、これを Python で実装し、モンテカルロ試行と重ねて検証します。

Python での実装と検証

標準形と基本行列の計算

まず、推移行列を標準形に組み立て、基本行列から到達時間と吸収確率を求める関数を書きます。これがこの記事の計算の心臓部です。

import numpy as np

def solve_absorbing(Q, R):
    """吸収マルコフ連鎖を解く。
    Q: 過渡→過渡 (t×t), R: 過渡→吸収 (t×r)
    戻り値: N(基本行列), t(期待到達時間), B(吸収確率)
    """
    t_num = Q.shape[0]
    N = np.linalg.inv(np.eye(t_num) - Q)   # 基本行列 N = (I - Q)^{-1}
    hitting = N @ np.ones(t_num)            # 期待到達時間 t = N·1
    B = N @ R                               # 吸収確率 B = N·R
    return N, hitting, B

# --- 公平なギャンブラーの破産 (N=5, p=1/2) ---
p = 0.5
Q = np.array([[0, p, 0, 0],
              [p, 0, p, 0],
              [0, p, 0, p],
              [0, 0, p, 0]])
R = np.array([[p, 0],   # 状態1 → (破産0, 達成5)
              [0, 0],
              [0, 0],
              [0, p]])   # 状態4 → (破産0, 達成5)

N, hit, B = solve_absorbing(Q, R)
print("基本行列 N =\n", N)
print("期待到達時間 t =", hit)              # [4. 6. 6. 4.]
print("達成確率(状態5) =", B[:, 1])          # [0.2 0.4 0.6 0.8]

出力される基本行列と到達時間 $\bm{t}=(4,6,6,4)$、達成確率 $(0.2,0.4,0.6,0.8)$ は、前セクションで手計算した値と完全に一致します。np.linalg.inv による1回の逆行列計算だけで、無限に続きうる賭けの結末が確定するのが実感できます。

モンテカルロ試行で答え合わせ

理論値が正しいか、実際にランダムな賭けを何万回もシミュレートして確かめます。1回のゲームを最後までプレイし、決着までのステップ数とどちらに吸収されたかを記録する関数を作ります。

def simulate_ruin(start, N_goal, p, trials=20000, rng=None):
    """ギャンブラーの破産をモンテカルロ。
    戻り値: 平均ステップ数, 達成(N_goal到達)した割合"""
    rng = rng or np.random.default_rng(0)
    steps_all, win_all = [], []
    for _ in range(trials):
        pos, steps = start, 0
        while 0 < pos < N_goal:          # 吸収状態に着くまで
            pos += 1 if rng.random() < p else -1
            steps += 1
        steps_all.append(steps)
        win_all.append(1 if pos == N_goal else 0)
    return np.mean(steps_all), np.mean(win_all)

for start in [1, 2, 3, 4]:
    mc_steps, mc_win = simulate_ruin(start, 5, 0.5)
    print(f"開始{start}: MC到達時間={mc_steps:.3f} (理論={start*(5-start)}), "
          f"MC達成確率={mc_win:.3f} (理論={start/5})")

このループを実行すると、モンテカルロの平均ステップ数が理論値 $i(N-i)$ に、達成確率が $i/N$ に、それぞれ小数第2位程度まで一致します。試行回数を増やすほど誤差が縮み、理論式の正しさが数値的に裏づけられます。理論(逆行列)とシミュレーション(実際の賭け)という2つの独立な道が同じ答えに至ることで、導出への信頼が確固たるものになります。

期待到達時間 t_i の理論値 i(N-i) とモンテカルロ実測の一致

図は各開始資金 $i$ に対する期待到達時間を、理論値(基本行列から得た $\bm{t}=N\bm{1}$、実線)とモンテカルロ実測(点)で重ねたものです。放物線状の $i(N-i)$ にぴったり乗っており、真ん中($i=2,3$)から始めると最も長引くことが一目でわかります。両端に近いほど早く決着するのは、吸収状態がすぐ隣にあるからです。

吸収確率 B の理論値 i/N とモンテカルロ実測の一致(公平な賭け)

こちらは達成確率($5$ ドル到達)を理論値 $i/N$(実線)とモンテカルロ(点)で比較した図です。公平な賭けでは達成確率が開始資金に比例して直線的に増えることが確認できます。手持ちが多いほど目標に近く、破産しにくいという直感どおりです。

偏った賭け(酔歩)ではどうなるか

賭けが公平でない場合、つまり $p\neq 1/2$ の偏ったランダムウォーク(酔歩)を見てみましょう。$p=0.6$(各回わずかに有利)とすると、直感的には「有利なのだから達成しやすいはず」です。同じ枠組みで $\bm{Q},\bm{R}$ を作り直すだけで解けます。

# --- 偏った賭け p=0.6 ---
p = 0.6; q = 1 - p
Qb = np.array([[0, p, 0, 0],
               [q, 0, p, 0],
               [0, q, 0, p],
               [0, 0, q, 0]])
Rb = np.array([[q, 0], [0, 0], [0, 0], [0, p]])

Nb, hit_b, Bb = solve_absorbing(Qb, Rb)
print("偏り賭け 期待到達時間 t =", hit_b)     # [4.60 6.00 5.26 3.10]
print("偏り賭け 達成確率(状態5) =", Bb[:, 1]) # [0.38 0.64 0.81 0.92]

達成確率は $(0.38, 0.64, 0.81, 0.92)$ となり、公平なとき $(0.2,0.4,0.6,0.8)$ より軒並み高くなりました。わずか $10\%$ の有利さでも、達成確率が大きく持ち上がるのが読み取れます。理論値は閉じた式 $B_{i,N}=\dfrac{1-(q/p)^i}{1-(q/p)^N}$ とも一致します。到達時間 $(4.60,6.00,5.26,3.10)$ を見ると、有利な方向(上)へ進みやすいので、高い状態から始めるほど早く決着することもわかります。

偏った賭け p=0.6 の吸収確率: 公平時より達成確率が上振れ、理論とMC一致

図は偏った賭け($p=0.6$)での達成確率を、公平な賭け(点線、$i/N$)と並べて示したものです。曲線が上に凸に持ち上がり、直線の公平ケースを大きく上回っています。ほんの少しの優位が、長い試行を通じて達成確率の大きな差に増幅されることを物語っています。モンテカルロ(点)も理論曲線(実線)にきれいに重なります。

酔歩のサンプル経路と到達時間の分布

最後に、個々の酔歩がどんな軌跡を描いて吸収されるか、そして到達時間がどう散らばるかを可視化します。数式で得た「期待値」の裏側にある、ばらつきの実態を見るためです。

import matplotlib.pyplot as plt

rng = np.random.default_rng(1)
plt.figure(figsize=(9, 5))
for _ in range(12):                 # 12本のサンプル経路
    pos, path = 2, [2]              # 開始資金 2 ドル
    while 0 < pos < 5:
        pos += 1 if rng.random() < 0.5 else -1
        path.append(pos)
    plt.plot(path, alpha=0.7)
plt.axhline(0, color="k", lw=1); plt.axhline(5, color="k", lw=1)
plt.xlabel("ステップ数"); plt.ylabel("手持ち資金")
plt.title("酔歩のサンプル経路(0 と 5 で吸収)")
plt.show()

このコードは開始資金 $2$ ドルからの酔歩を12本描きます。各経路は上下にふらつきながら、いつかは $0$ か $5$ の水平線に達してそこで止まります。経路ごとに長さも終着点もバラバラで、あるものは数ステップで破産し、あるものは長く粘って達成に至ります。期待到達時間 $6$ ステップはあくまで「平均」であって、個々の結末は大きく散らばることがよくわかります。

酔歩の到達時間の分布(ヒストグラム)と平均値の位置

こちらは大量に試行したときの到達時間のヒストグラムです。分布は右に長く裾を引いており、大半は短時間で決着する一方、まれに非常に長く続くゲームがあることがわかります。平均(縦線)は基本行列から得た理論値と一致しますが、分布の形は平均だけでは語れないほど偏っています。「期待到達時間」は強力な要約統計量ですが、リスク評価にはばらつきまで見る必要がある、という実務的な教訓もここから読み取れます。

まとめ

本記事では、吸収マルコフ連鎖と到達時間の理論を、線形代数の視点から導出し実装しました。

  • 標準形: 過渡状態を先に、吸収状態を後に並べ替えると推移行列は $\bm{P}=\begin{psmallmatrix}\bm{Q}&\bm{R}\\ \bm{0}&\bm{I}\end{psmallmatrix}$ に整理でき、解析すべき情報は $\bm{Q},\bm{R}$ に集約される
  • 基本行列: $\bm{N}=\sum_k\bm{Q}^k=(\bm{I}-\bm{Q})^{-1}$。その成分 $N_{ij}$ は「$i$ から出発して過渡状態 $j$ を訪れる期待回数」
  • 期待到達時間: $\bm{t}=\bm{N}\bm{1}$。1ステップ解析 $(\bm{I}-\bm{Q})\bm{t}=\bm{1}$ からも同じ式が出る
  • 吸収確率: $\bm{B}=\bm{N}\bm{R}$。どの吸収状態に落ちるかの確率を一挙に与える
  • 検証: ギャンブラーの破産と酔歩で、逆行列から得た理論値がモンテカルロ実測と一致することを確認

「無限に続きうる過程の結末」を、たった1回の逆行列計算で厳密に言い当てられる——これが吸収マルコフ連鎖の醍醐味です。シミュレーションと違って誤差もなく、状態数が数千程度までなら一瞬で解けます。

次のステップとして、以下の記事も参考にしてください。