Mímisbrunnr知恵の泉

← シミュレーション 一覧

🎓 レベル:標準 | 重要度:B(推奨)

📎 前提:待ち行列のシミュレーション | 理論:安全在庫と発注点(オペレーションズ)

要点(BLUF)

1. 在庫システムの要素

在庫を系・状態・入力・出力で切ると:

リードタイムがあるので、「発注してから届くまでに在庫が尽きる」リスクがあり、ss をどれだけ高く設定するか(安全在庫)が肝になります。

2. (s,S) 方策のシミュレーション

ポアソン需要(平均8/日)、リードタイム3日の (s,S) 在庫をシミュレートし、ss を変えて平均在庫とフィルレートを測ります。

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

出力の意味:発注点 ss20304020 \to 30 \to 40 と上げると、フィルレート(需要を満たせた割合)が 95.6%99.9%100%95.6\% \to 99.9\% \to 100\% と改善する一方、平均在庫は 19.733.448.419.7 \to 33.4 \to 48.4 と増えます。サービス水準を上げるには在庫(保有コスト)を積む——この明快なトレードオフが在庫管理の中心問題です。最後の99.9%から100%へ上げるのに在庫が大きく増える「収穫逓減」も読み取れます。最適な s,Ss, S は、保有コストと欠品コストの合計を最小化する点で、コストを与えればこのシミュレーションで探索できます(シミュレーション最適化)。

3. 窓口・サービス系への一般化

同じ枠組みは窓口(サービス)系にも使えます。複数の窓口(M/M/c)、優先客、休憩、故障と修理——解析が難しい現実的な要素を、DES なら素直に追加できます。在庫の「発注」は窓口の「増員」に、「欠品」は「待たせて取りこぼす客」に対応し、コストとサービスのトレードオフという構造は共通です。

在庫理論の解析的な公式(安全在庫 zσLz\sigma\sqrt{L}、新聞売り子問題の臨界比など)はオペレーションズの領分です。ここは、理論が前提(定常需要・特定分布)を外れたときに、シミュレーションで性能を直接測る役割を担います。

数式の直観的意味

フィルレートと平均在庫のトレードオフは、リードタイム需要の分布の裾で決まります。リードタイム3日・平均8/日なら、その間の需要は平均24・ばらつきあり。発注点 ss は「この期間の需要を、確率いくつでカバーするか」を決める安全在庫の役割。ss を上げると、リードタイム需要の分布のより右の裾までカバーするので欠品確率が下がるが、普段はその在庫が寝てしまう(平均在庫増)。サービス水準を 99%99.9%99\% \to 99.9\% へ上げるのに在庫が急増するのは、正規・ポアソンの裾が指数的に薄いため、最後の数%をカバーするコストが跳ね上がるから。シミュレーションは、この裾の確率を実際に数えてくれるので、分布の仮定が崩れても正しい答えを返します。

⚠️ よくある誤解・落とし穴

対応シミュレーション参照

本文の (s,S) 在庫シミュ(default_rng(3)ss とフィルレートのトレードオフ)。理論は安全在庫と発注点へ。

関連ノート