次の協調ゲーム (coordination game) を考えます:
$ \begin{bmatrix} 4, 4 & 0, 3 \\ 3, 0 & 2, 2 \end{bmatrix} $
行プレイヤーをプレイヤー $0$,列プレイヤーをプレイヤー $1$, またそれぞれのプレイヤーの行動を行動 $0$,行動 $1$ と呼ぶことにします.
ベースになる非摂動動学 (unperturbed dynamics) は次で定義されるマルコフ連鎖で与えられます:
$N$ 人のプレイヤーがいて,各プレイヤーは行動 $0$ か $1$ かをプレイしている.
$t$ 期において行動 $1$ をプレイしているプレイヤーの数を $X_t$ と表す.
$X_0$ の値は $0$ としてもよいし,何らかの確率分布に従ってランダムに決まるとしてもよい.
各 $t$ 期において,$N$ 人のうち1人が等確率でランダムに選ばれ,その行動を (変えたければ) 変えることができる. その他のプレイヤーはいまとっている行動をとり続ける.
行動変更の機会を与えられたプレイヤーは,行動を決めたあと,残りの $N - 1$ 人から等確率でランダムに選ばれたプレイヤーと上のゲームをプレイする.
したがって,自分が行動 $0$ をとっているならば行動 $1$ をとっているプレイヤーとマッチする確率は $\frac{X_t}{N - 1}$, 自分が自分が行動 $1$ をとっているならば行動 $1$ をとっているプレイヤーとマッチする確率は $\frac{X_t - 1}{N - 1}$ である.
そのことを見越して,自分が行動 $0$ をとっているならば混合戦略 $\left(1 - \frac{X_t}{N - 1}, \frac{X_t}{N - 1}\right)$ に対する最適反応を, 自分が行動 $1$ をとっているならば混合戦略 $\left(1 - \frac{X_t - 1}{N - 1}, \frac{X_t - 1}{N - 1}\right)$ に対する最適反応をとる.
行動 $0, 1$ に対して無差別な場合は確率半々でランダムにいずれかを選ぶとする (が,どちらかの行動の決め打ちにしてもよい).
上記の場合分けが煩わしければ,「自分自身と対戦する」ことも許して, 行動 $1$ をとっているプレイヤーとマッチする確率はつねに $\frac{X_t}{N}$,としてもよい.
本体の摂動動学 (perturbed dynamics) は次で定義されるマルコフ連鎖で与えられます:
上で定義された摂動動学は uniformly ergordic なので,定常分布を一意にもちます.
上では,1人のみが行動変更の機会を与えられる,としましたが,全員が行動変更できる,としてもよいです. すなわち,「各期,各人は独立に,確率 $\varepsilon$ でランダムな選択を行い,残りの確率 $1 - \varepsilon$ で最適反応をとる」としてもよいです.
あるいは,「各期,各人は独立に確率 $\eta > 0$ で行動変更の機会を得る. 行動変更の機会を得たプレイヤーは,確率 $\varepsilon$ でランダムな選択を行い,残りの確率 $1 - \varepsilon$ で最適反応をとる」としてもよいです ($\eta = 1$ が上のケース).
遷移行列を書きやすいようなルールを選んでかまいません. (どういうルールを選んだかコメントを書いておく.)
収束の遅さはどっちもどっちですね. 両方やってみましょう.
以下で,$p \in [0, 1]$ を「相手が行動 $1$ をとる確率が $p$ より小さいなら自分の最適反応は $0$, $p$ より大きいなら自分の最適反応は $1$」であるような数とします. 上の利得行列では $p = 1/3$ です.
現時点で行動 $1$ をとっているプレイヤーの数を $n$ とします.
$1$ をとっているプレイヤーの数が減少するのは (つまり,状態が $n$ から $n-1$ に変わるのは):
$1$ をとっているプレイヤーが行動改訂の機会を得て (確率 $n/N$),かつ,
「実験」を行い (確率 $\varepsilon$),行動 $0$ をとる (確率 $1/2$) か,
通常の最適反応を行い (確率 $1 - \varepsilon$),$0$ が厳密な最適反応である ($(n-1)/(N-1) < p$ のとき) か,
無差別で ($(n-1)/(N-1) = p$ のとき) $0$ をとる (確率 $1/2$) とき.
$1$ をとっているプレイヤーの数が増加するのは (つまり,状態が $n$ から $n+1$ に変わるのは):
$0$ をとっているプレイヤーが行動改訂の機会を得て (確率 $(N-n)/N$),かつ,
「実験」を行い (確率 $\varepsilon$),行動 $1$ をとる (確率 $1/2$) か,
通常の最適反応を行い (確率 $1 - \varepsilon$),$1$ が厳密な最適反応である ($n/(N-1) > p$ のとき) か,
無差別で ($n/(N-1) = p$ のとき) $1$ をとる (確率 $1/2$) とき.
$1$ をとっているプレイヤーの数が変化しないのは:
上のケース以外のとき.
「自分自身と対戦しない」設定で議論しましたが,「自分自身と対戦する」ことも許す設定にしてもよいです.
現時点で行動 $1$ をとっているプレイヤーの数を $n$ とします. 「自分自身と対戦する」ことを許して, $\frac{n}{N} < p$ ならば $0$ が最適反応, $\frac{n}{N} = p$ ならば無差別, $\frac{n}{N} > p$ ならば $1$ が最適反応,ということにしましょう. ($\eta = 1$ とします.)
各プレイヤーについて,行動 $1$ をとる確率は,
$\frac{n}{N} < p$ のとき: 「実験」を行い (確率 $\varepsilon$),行動 $1$ をとる (確率 $1/2$) ときなので,確率 $\varepsilon/2$
$\frac{n}{N} = p$ のとき: 確率 $1/2$
$\frac{n}{N} > p$ のとき: 「『実験』を行い (確率 $\varepsilon$),行動 $0$ をとる (確率 $1/2$)」以外のときなので,確率 $1 - \varepsilon/2$
です. したがって,行動 $1$ をとる人数は,
$\frac{n}{N} < p$ のとき: 試行回数 $N$,成功確率 $\varepsilon/2$ の2項分布
$\frac{n}{N} = p$ のとき: 試行回数 $N$,成功確率 $1/2$ の2項分布
$\frac{n}{N} > p$ のとき: 試行回数 $N$,成功確率 $1 - \varepsilon/2$ の2項分布
にそれぞれ従います.
2項分布に従う確率変数は scipy.stats.binom が生成してくれるのでそれを使うのが一つの手です.
scipy.stats.binom
pmf メソッドを使って
from scipy.stats import binom
binom.pmf((0 から N までのリスト), (試行回数), (成功確率))
とすると,$\{0, \ldots, N\}$ 上の確率分布を返してくれます. これを遷移行列の各 $n$ 行に ($n$ で適切に場合分けして) 代入していけばよい.
いずれの場合も,確率行列 $P$ を設定してしまえば,
あとは mc_tools.py の
mc_sample_path 関数に代入すればサンプルパスを生成してくれるし,
mc_compute_stationary 関数に代入すれば定常分布を計算してくれます.