求めたい量
「区間 0 ≤ t ≤ T のあいだずっと,動作中(=ダウンしていない)ワーカーが m 個以上ある確率」
は,次のようにモデル化すると計算できます。
• ワーカーの故障は独立に指数分布(故障率 λ)で起こる
• 故障したワーカーは一定時間 t だけ停止したのち必ず復帰する
(復帰時間 t が一定だとマルコフ性が壊れるので,
計算しやすい形にするため「平均 t の指数分布で復帰する」と近似するのが普通です。
一定時間にこだわる場合も,後述の方法をそのまま
Erlang 分布(指数分布を k 本直列にしたもの)で近似すれば十分高精度が得られます。)
この仮定の下で
μ = 1/t …修復率
N …総ワーカー数
m …「動いていてほしいワーカー数」
F = N – m …同時にダウンしていても許される台数
と置きます。
────────────────────
連続時間マルコフ過程を作る ──────────────────── 時刻 t に同時にダウンしているワーカー数 X(t) ∈ {0,1,…,N} を状態とする連続時間マルコフ連鎖(いわゆる birth-death 過程)を考えます。
(故障) (修復)
i ─────────► i+1 i ◄──────── i+1 率 λ(N–i) 率 μ(i+1)
すなわち
移動 i→i+1 … 生存中マシンは (N–i) 台あるので率 λ(N–i)
移動 i→i–1 … ダウン中マシンは i 台あるので率 μi
で遷移する単純な birth-death 連鎖です。
──────────────────── 2. 「許容台数を超えたら失敗」状態を吸収状態にする ──────────────────── 「同時ダウン数が F+1 台以上になるとサービス不能」とします。 そこで
S = {0,1,…,F} 安全圏
B = {F+1,…,N} を 1 つにまとめた状態 † 失敗(吸収)状態
という (F+2) 個の状態から成るマルコフ連鎖を作ります。 († 安全圏を出てしまえば“もう十分ではない”という意味で 以後の細かい内訳は気にしないので一つにまとめてよい。)
生成行列 Q は
q_{i,i+1} = λ(N–i) (0≤i<F)
q_{i,i–1} = μi (0<i≤F)
q_{i,i} = –(λ(N–i)+μi) (0≤i≤F)
q_{F,B} = λ(N–F) (安全圏→失敗)
q_{B,B} = 0 (吸収)
その他は 0 です。
──────────────────── 3. 微分方程式 (Kolmogorov forward) を解く ──────────────────── p(t) = [p_0(t), p_1(t), …, p_F(t), p_B(t)] … 時刻 t に各状態にいる確率ベクトル は
dp(t) / dt = p(t) Q, p(0) = [1, 0, …, 0]
を満たします。
行列指数を使えば
p(t) = p(0) · exp(Q t)
で一括計算できます(exp は行列指数)。
──────────────────── 4. 求める確率 ──────────────────── 「区間 [0, T] の間,常に安全圏にいる」確率は 「時刻 T にも吸収されていない」確率と同値なので
P_survive(N,m,λ,μ,T) = Σ_{i=0}^{F} p_i(T)
= 1 – p_B(T)
となります。これが質問に出てきた p = f(N,m,λ,t,T) です。
──────────────────── 5. 逆に「必要な N」を求める ──────────────────── 所望の信頼度 p_req が与えられたら
最小の N で P_survive(N,m,λ,1/t,T) ≥ p_req
を満たす N を線形探索 or 二分探索すればよいだけです。 F が大きくなると行列次元も大きくなりますが, F が 20 程度までなら机上でも数秒, もっと大きくても Scipy / R / MATLAB などの 行列指数ライブラリで十分高速に求まります。
──────────────────── 6. 「修復時間は必ず t」という仮定を厳密に扱いたいとき ──────────────────── 修復が“必ず t”の場合は Markov 性が無くなりますが, 修復時間を k 段の指数分布 (Erlang(k, μ)) で近似すると 平均は t,分散は t²/k にでき, k を大きくするほど「ほぼ一定時間」で復帰する挙動を 任意の精度で再現できます。 その場合は状態数が k 倍になりますが 同じ手順(吸収 Markov 連鎖 → 行列指数)でまったく同様に解けます。
──────────────────── 7. スナップショット近似(おまけ) ──────────────────── 「ある瞬間に m 台以上生きている確率」だけで良いなら 各台の稼働確率を A = μ/(λ+μ) として
P_snapshot = Σ_{k=m}^{N} C(N,k) A^k (1–A)^{N–k}
で一発ですが, 「区間中ずっと m 台以上」とはまったく別物になります。 T がごく短いときや λ,μ が大きい(= 状態が高速に入れ替わる) ときには粗い上界として使えますが, 業務で求められる “ミッションクリティカル時間” が 分・時間オーダなら必ず前節の連鎖を使って下さい。
──────────────────── 8. Python での例 ────────────────────
import numpy as np
from scipy.linalg import expm
def survive_prob(N, m, lam, t_repair, T):
mu = 1/t_repair
F = N - m # 許容ダウン台数
S = F + 2 # 状態数(0…F, B)
Q = np.zeros((S, S))
# 0 … F
for i in range(F+1):
if i < F:
Q[i, i+1] = lam * (N - i) # 故障
else:
Q[i, F+1] = lam * (N - i) # →吸収
if i > 0:
Q[i, i-1] = mu * i # 修復
Q[i, i] = -Q[i].sum()
# 吸収状態
# Q[F+1, F+1] = 0
p0 = np.zeros(S)
p0[0] = 1.0
pt = p0 @ expm(Q * T)
return 1.0 - pt[F+1] # 安全に完走する確率
# 例:λ=1/10000, t=10s, T=3600s, m=8, p_req=0.99999
lam = 1/10000
t_rep = 10
T = 3600
m = 8
p_req = 0.99999
for N in range(m, 50):
if survive_prob(N, m, lam, t_rep, T) >= p_req:
print("必要最小 N =", N)
break
──────────────────── まとめ ────────────────────
この方法は通信ネットワークや半導体冗長回路 (k-out-of-n system with repair) の信頼度評価で定番として使われている標準手法です。
Was this answer helpful?
version: o3-2025-04-16
Status: UQ Validated
Validated: 8 months ago
Status: Needs Human Verification
Loading model reviews...
Loading reviews...