🎓 レベル:標準 | 重要度:B(推奨)
📎 前提:待ち行列のシミュレーション | 理論:安全在庫と発注点(オペレーションズ)
要点(BLUF)
- 在庫システムは「需要(確率的)・発注方策・リードタイム」をモデル化すれば、解析解が無くてもシミュレーションで性能を測れます。
- (s,S) 方策:在庫が発注点 以下になったら、在庫を まで戻すよう発注。リードタイム中は欠品リスクがあります。
- 発注点 を上げるほど平均在庫(保有コスト)が増え、欠品が減る——サービス水準とのトレードオフを実測します。
1. 在庫システムの要素
在庫を系・状態・入力・出力で切ると:
- 状態:手持ち在庫量、発注残(発注したがまだ届いていない量)。
- 入力:日々の需要(確率的、ここではポアソン)、リードタイム(発注から納品までの遅れ)。
- 方策:いつ・いくつ発注するか。代表が (s,S) 方策——在庫+発注残が 以下になったら まで補充。
- 出力:平均在庫(保有コストに比例)、フィルレート(需要を在庫で満たせた割合=サービス水準)。
リードタイムがあるので、「発注してから届くまでに在庫が尽きる」リスクがあり、 をどれだけ高く設定するか(安全在庫)が肝になります。
2. (s,S) 方策のシミュレーション
ポアソン需要(平均8/日)、リードタイム3日の (s,S) 在庫をシミュレートし、 を変えて平均在庫とフィルレートを測ります。
import numpy as np
def inventory_sim(s, S, lead, days, seed):
rng = np.random.default_rng(seed)
inv = S # 初期在庫
on_order = 0 # 発注残
arrival_day = -1 # 入荷予定日
inv_levels = []; total_demand = 0; met = 0
for d in range(days):
if arrival_day == d: # 入荷イベント
inv += on_order; on_order = 0
demand = rng.poisson(8) # 日次需要
total_demand += demand
sold = min(demand, max(inv, 0)) # 在庫の範囲で販売
met += sold
inv -= sold
inv_levels.append(inv)
if inv + on_order <= s and on_order == 0: # 発注点を下回ったら発注
on_order = S - inv
arrival_day = d + lead # lead日後に入荷
fill_rate = met / total_demand # サービス水準
return np.mean(inv_levels), fill_rate
for (s, S) in [(20, 60), (30, 80), (40, 100)]:
avg_inv, fill = inventory_sim(s, S, lead=3, days=200_000, seed=3)
print(f"(s={s}, S={S}): 平均在庫={avg_inv:.2f} フィルレート={fill:.4f}")
出力:
(s=20, S=60): 平均在庫=19.68 フィルレート=0.9564
(s=30, S=80): 平均在庫=33.43 フィルレート=0.9988
(s=40, S=100): 平均在庫=48.39 フィルレート=1.0000
出力の意味:発注点 を と上げると、フィルレート(需要を満たせた割合)が と改善する一方、平均在庫は と増えます。サービス水準を上げるには在庫(保有コスト)を積む——この明快なトレードオフが在庫管理の中心問題です。最後の99.9%から100%へ上げるのに在庫が大きく増える「収穫逓減」も読み取れます。最適な は、保有コストと欠品コストの合計を最小化する点で、コストを与えればこのシミュレーションで探索できます(シミュレーション最適化)。
3. 窓口・サービス系への一般化
同じ枠組みは窓口(サービス)系にも使えます。複数の窓口(M/M/c)、優先客、休憩、故障と修理——解析が難しい現実的な要素を、DES なら素直に追加できます。在庫の「発注」は窓口の「増員」に、「欠品」は「待たせて取りこぼす客」に対応し、コストとサービスのトレードオフという構造は共通です。
在庫理論の解析的な公式(安全在庫 、新聞売り子問題の臨界比など)はオペレーションズの領分です。ここは、理論が前提(定常需要・特定分布)を外れたときに、シミュレーションで性能を直接測る役割を担います。
数式の直観的意味
フィルレートと平均在庫のトレードオフは、リードタイム需要の分布の裾で決まります。リードタイム3日・平均8/日なら、その間の需要は平均24・ばらつきあり。発注点 は「この期間の需要を、確率いくつでカバーするか」を決める安全在庫の役割。 を上げると、リードタイム需要の分布のより右の裾までカバーするので欠品確率が下がるが、普段はその在庫が寝てしまう(平均在庫増)。サービス水準を へ上げるのに在庫が急増するのは、正規・ポアソンの裾が指数的に薄いため、最後の数%をカバーするコストが跳ね上がるから。シミュレーションは、この裾の確率を実際に数えてくれるので、分布の仮定が崩れても正しい答えを返します。
⚠️ よくある誤解・落とし穴
- 「リードタイムを無視してよい」ではない:リードタイムが欠品リスクの主因。ゼロにすると問題が自明になり、現実を写しません。
- 「発注残を数えないと過剰発注」になる:在庫が 以下でも、発注済み(on_order)があれば二重発注しない。
inv + on_order <= sで判定。 - 「平均在庫だけ見ればよい」ではない:サービス水準(フィルレート)と必ずセット。在庫が少ない=良い、ではありません。
- 「フィルレートとサイクルサービス率は同じ」ではない:フィルレート(満たせた需要の割合)とサイクル中に欠品しない確率は別指標。目的に合わせて選ぶ。
- 「理論をここで導出」ではない:安全在庫・EOQ の理論はオペレーションズへ。ここはシミュレーション実装(境界)。
対応シミュレーション参照
本文の (s,S) 在庫シミュ(default_rng(3)、 とフィルレートのトレードオフ)。理論は安全在庫と発注点へ。
関連ノート
- 待ち行列のシミュレーション(前提・別の DES)
- 出力解析(過渡・定常・複製)(次のトピック・結果の信頼性)
- シミュレーション最適化(最適な s,S を探索)
- 安全在庫と発注点(オペレーションズ・在庫理論)
- 定量発注と定期発注(オペレーションズ・発注方策)
- 第5章 離散事象シミュレーション 目次
- シミュレーション・モンテカルロ法 全体目次