13  在庫モデル

13.1 学習目標

  • 在庫管理の目的と,発注量・発注時期という2つの決定を理解する.
  • 在庫量,手持ち在庫,バックオーダーの関係を計算できる.
  • 在庫に関わる費用を理解し,総費用を計算できる.
  • 需要,観測,リードタイムなどの観点から在庫モデルを分類できる.
  • 代表的な在庫方策を理解する.

13.2 前提知識

13.3 在庫管理とは

商店・工場・倉庫などで,原材料・部品・製品といった品目を適切に管理することを在庫管理(Inventory Management)という.一般的に,在庫管理の目的は,顧客の需要を満たしつつ,在庫に関わる費用を最小化することである.

在庫量が多すぎると,保管費用がかかる.逆に,在庫量が少なすぎると,欠品が発生し,顧客の需要を満たせなくなる.在庫管理では,次の2つを決定する.

  1. どのくらいの量を発注するか?(発注量)
  2. いつ発注するか?(発注時期)

科学的在庫管理(Scientific Inventory Management)では,これら2つの問題に答えるために,次の手順をとる.

  1. 在庫システムを数学モデルとして定式化する.
  2. 最適な発注量と発注時期を決定する.

練習 13.1 (思考実験) あなたは牛乳を毎日1本消費し,なくなる前に買い足しているとする.次の各状況で,1回に買う量と,買いに行くタイミングがどう変わるか,理由とともに答えよ.

  1. スーパーが自宅の隣にある場合と,往復1時間かかる場合.
  2. 冷蔵庫に牛乳を2本しか置けない場合と,20本置ける場合.
  3. 牛乳を切らしても困らない場合と,切らすと必ず買いに行かなければならない場合.
  4. 店で買う代わりに,注文してから3日後に届く宅配を使う場合.

13.4 需要と在庫量

在庫の状況は「いま何個あるか」だけでは言い表せない. 手元にある量と,満たせずに残っている量を分けて数える必要がある.前者は保管費用に, 後者は欠品費用に効くためである.ここでは,そのための概念と記号を導入する.

需要(demand)
ある期間に顧客が購入したい商品の量.d で表す.
在庫量(inventory level)
ある時点での在庫の量.I で表す.満たせなかった需要がある場合,I は負の値をとる.
手持ち在庫(on-hand inventory)
ある時点で,実際に手元にある在庫の量.OH で表す.
バックオーダー(backorder)
手持ち在庫がなく,満たせない需要.BO で表す.

在庫量 I は正にも負にもなりうるのに対し,OHBO は負にならない.一般に,OHBO は在庫量 I を用いて次のように表される.

OH = I^+ = \max(0, I)

BO = I^- = \max(0, -I)

以降,x^+ = \max(0, x)x^- = \max(0, -x) という記法を用いる.

在庫量は時間とともに変化する.需要が発生する前後を区別する必要があるときは,I を需要が発生する前の在庫量とし,需要 d を満たした後の在庫量を I - d と書く.このとき,需要を満たした後の手持ち在庫とバックオーダーは,それぞれ

OH = (I - d)^+, \quad BO = (I - d)^- = (d - I)^+

である.

例 13.1 需要が発生する前の在庫量を I = 50 とする. 需要が d = 30 のとき,需要を満たした後の在庫量は

I - d = 50 - 30 = 20

となる.在庫量が正であるため,手持ち在庫は OH = 20,バックオーダーは BO = 0 である.

例 13.2 需要が発生する前の在庫量を I = 50 とする. 需要が d = 70 のとき,需要を満たした後の在庫量は

I - d = 50 - 70 = -20

となる.このとき,手持ち在庫は

OH = (I - d)^+ = 0

となる.バックオーダーは

BO = (I - d)^- = 20

となる.すなわち,50単位を出荷し,残る20単位が後日の出荷を待つバックオーダーとなる.

13.5 在庫の費用

ここでは,在庫に関わる費用を紹介する.

発注費用(ordering cost)
発注量に関わらず,1回の発注にかかる費用.調達費用,固定費用(fixed cost)などとも呼ばれる.通常,1回の発注にかかる費用を K とする.
購入費用(purchase cost)
商品を購入するためにかかる費用.通常,単位あたりの購入費用を c とする.
欠品費用(stockout cost)
需要が手持ち在庫を上回った場合に発生する費用.通常,単位あたりの欠品費用を p とする.
保管費用(holding cost)
在庫を保管するためにかかる倉庫費用,保険費用,税金,機会費用など.通常,単位時間あたりの1単位の保管費用を h とする.

例 13.3 (発注費用と購入費用) 毎回の発注量を Q,発注費用を K,単位あたりの購入費用を c とする.発注費用 K は発注量によらず1回の発注ごとに,購入費用 cQ は発注量に比例してかかるため,発注1回あたりの費用の合計は

K + cQ

となる.

例 13.4 (欠品費用) 需要が発生する前の在庫量を I,需要を d,単位あたりの欠品費用を p とする.満たせない需要は (d - I)^+ であるため,欠品費用は次のように計算される.

p (d - I)^+

p = 10I = 50d = 70 のとき,欠品費用は次のように計算される.

p (d - I)^+ = 10 (70 - 50)^+ = 200

p = 10I = 50d = 20 のとき,欠品費用は次のように計算される.

p (d - I)^+ = 10 (20 - 50)^+ = 0

保管費用は,保管する量と保管する時間の両方に比例する.在庫量の時間変化を描いた図では,この積は在庫量を表す折れ線と時間軸が囲む面積にあたる.一般的に,保管費用は次の式で計算される.

\text{保管費用} = \text{面積} \times h

在庫量が一定の場合を 例 13.5 で,時間とともに変化する場合を 例 13.6 で確認する.

例 13.5 (在庫量が一定の保管費用) 1日あたり1単位の在庫を保管するために,h の費用がかかるとする.30日間,50単位の在庫を保管するための総保管費用を求める.

保管費用は次のように計算される. 30 \times 50 \times h = 1500h

図 13.1 では,横軸が時間,縦軸が在庫量を表す.上で求めた 1500h は,網掛けした長方形の面積 30 \times 50h を掛けたものである.

コード
import matplotlib.pyplot as plt

t = [0, 30]
inventory = [50, 50]

# Plotting the inventory level
plt.fill_between(t, inventory, color="#16212d", alpha=0.12)  # brand: ink
plt.plot(t, inventory, color="#16212d", linewidth=2)  # brand: ink
plt.xlabel("Time")
plt.ylabel("Inventory Level")
plt.xlim(0, 30)
plt.ylim(0, 60)
plt.tight_layout()
plt.show()
図 13.1: 在庫量が一定の場合の在庫量の時間的変化.網掛けの面積が保管費用の基礎となる.

例 13.6 (在庫が時間とともに変化する保管費用) 通常,在庫量は一定ではなく,時間とともに変化する.ここでは,在庫量が時間とともに線形に減少し,0になると在庫が補充される場合を考える.毎回の発注量を Q = 500,1日あたりの需要量を d = 250 とする.

このとき,1回の発注で Q / d = 2 日分の需要をまかなえるため,在庫量は 図 13.2 のように2日ごとに同じ形を繰り返す.6日間の保管費用を求める.

コード
import matplotlib.pyplot as plt

# Parameters
d = 250  # Demand rate (units per day)
Q = 500  # Order quantity
T = Q / d  # Cycle length
n_cycles = 3

# Inventory level over time: each cycle falls from Q to 0 at rate d,
# then the next order arrives instantaneously.
t = [0.0]
inventory = [Q]
for i in range(n_cycles):
    t += [(i + 1) * T, (i + 1) * T]
    inventory += [0, Q]
t, inventory = t[:-1], inventory[:-1]  # drop the trailing jump back to Q

# Plotting the inventory level
plt.fill_between(t, inventory, color="#16212d", alpha=0.12)  # brand: ink
plt.plot(t, inventory, color="#16212d", linewidth=2)  # brand: ink
plt.xlabel("Time")
plt.ylabel("Inventory Level")
plt.xlim(0, n_cycles * T)
plt.ylim(0, Q * 1.15)
plt.tight_layout()
plt.show()
図 13.2: 在庫量が線形に減少する場合の在庫量の時間的変化(Q = 500d = 250

保管費用は \text{面積} \times h で計算される.6日間はこの繰り返し3回分にあたり,1回分の三角形の面積は \frac{1}{2} \times 2 \times 500 = 500 であるため,6日間の保管費用は次のように計算される.

\frac{2 \times 500}{2} \times 3 \times h = 1500h

この面積を6日で割ると,1日あたりの平均在庫量が \frac{1500}{6} = 250 = \frac{Q}{2} であることがわかる.在庫量が Q から0まで直線的に減少するとき,平均在庫量は \frac{Q}{2} になる.この関係は チャプター 14 で用いる.

在庫管理では,これら4つの費用を個別に最小化するのではなく,その合計を最小化する.ある期間について,期首(需要が発生する前)の在庫量を I,発注量を Q,需要を d とすると,その期間の総費用は次のように書ける.

K + cQ + h (I - d)^+ + p (d - I)^+

第1項と第2項が発注費用と購入費用,第3項が保管費用,第4項が欠品費用である.発注しない期間では K + cQ を0とする.また,ここでは保管費用が期末の在庫量 (I - d)^+ にかかるものとした.

例 13.7 (1日の総費用) ある日,A社が100単位の商品を1単位あたり c 円で発注したとする.1回の発注にかかる費用は K 円,1日あたり1単位の保管費用は h 円,1単位あたりの欠品費用は p 円である.その日の期首の在庫量は50単位であり,発注した100単位は翌日に届くため,その日の在庫には含まれない.

その日の需要が40単位であった場合,在庫は十分であり,欠品は発生しない.このとき,A社の1日の総費用は次のように計算される.

\begin{align*} & K + 100c + (50 - 40)h + 0 \cdot p \\ = & K + 100c + 10h \end{align*}

需要が70単位であった場合,在庫が不足し,(70 - 50) 単位の欠品が発生し,期末の在庫量は0になる.このとき,A社の1日の総費用は次のように計算される.

\begin{align*} & K + 100c + 0 \cdot h + (70 - 50)p \\ = & K + 100c + 20p \end{align*}

以降の章では,この総費用(需要が確率的な場合はその期待値)を最小化する発注量と発注時期を求める.

13.6 在庫モデルの分類

在庫モデルは,次のような要素で分類される.

需要(demand)
需要が決定論的(deterministic)か確率的(stochastic)か.
観測(review)
在庫量を連続観測(continuous review)するか,周期観測(periodic review)するか.連続観測の場合,在庫量が連続的に観測でき,いつでも発注が可能である.周期観測の場合,一定の期間(例えば1週間)ごとに在庫量を観測する.
リードタイム(lead time)
発注から納品までの期間.調達期間とも呼ばれる.決定論的か確率的か,また0かどうかで分類する.在庫モデルを単純化するために,これを0とみなすこともある.
バックオーダー(backorder)
バックオーダーが許容されるかどうか.許容される場合,需要が手持ち在庫を上回っても,満たせなかった分は後日出荷される.許容されない場合,その需要は失われ,機会損失が発生する.
計画期間(planning horizon)
単一期間(single period)か,複数期間(multi-period)か,無限期間(infinite horizon)か.

観測と需要の組み合わせで,本書が扱う古典的な在庫モデルを整理すると 表 13.1 のようになる.表の並びは,本書で扱う順序に対応する.

表 13.1: 観測と需要に基づく在庫モデルの分類
在庫モデル 観測 需要 本書での扱い
EOQモデル 連続観測 決定論的 チャプター 14
安全在庫 連続観測 確率的 チャプター 15
Wagner-Whitin モデル 周期観測 決定論的 チャプター 16
新聞売り子問題 周期観測 確率的 チャプター 17

13.7 在庫方策

確率的在庫モデルにおいて重要な概念の一つが,在庫方策(inventory policy)である.在庫方策は,在庫の状況に応じて,在庫管理のルールを定めるものである.代表的な在庫方策を以下に示す.

  1. (r, Q) 方策:在庫量を連続的に観測し,在庫量が発注点 r 以下になったときに発注量 Q を発注する方式である.発注点方式とも呼ばれる.チャプター 15 で扱う.
  2. BSP 方策(Base Stock Policy):在庫量を定期的に観測し,観測のたびに在庫量を基準在庫 S まで補充する方式である.定期発注方式とも呼ばれる.チャプター 17 で扱う.
  3. (s, S) 方策:在庫量を定期的に観測し,在庫量が発注点 s 以下になったときに,在庫量を補充点 S まで補充する方式である.s = S とすると BSP 方策に一致する.

確率的在庫モデルによっては,これらの在庫方策が最適であることが知られている.その場合,在庫方策が持つパラメータを最適化することで,在庫の期待コストを最小化することができる.

13.8 まとめ

  • 在庫管理の目的は,顧客の需要を満たしつつ在庫に関わる費用を最小化することである.そのために,発注量と発注時期を決定する.
  • ある時点の在庫量 I に対して,手持ち在庫は OH = I^+,バックオーダーは BO = I^- である.
  • 需要が発生する前の在庫量を I,需要を d とすると,需要を満たした後の手持ち在庫は OH = (I - d)^+,バックオーダーは BO = (d - I)^+ となる.
  • 在庫に関わる費用には,発注費用 K,購入費用 c,欠品費用 p,保管費用 h がある.保管費用は,在庫量と時間が作る面積に h を掛けて求める.在庫量が Q から0まで直線的に減少する場合,平均在庫量は \frac{Q}{2} になる.
  • 在庫管理では,これらの合計である総費用 K + cQ + h (I - d)^+ + p (d - I)^+ を最小化する.
  • 在庫モデルは,需要(決定論的/確率的),観測(連続観測/周期観測),リードタイム,バックオーダーの可否,計画期間によって分類される.
  • 代表的な在庫方策には,(r, Q) 方策,BSP 方策,(s, S) 方策がある.確率的在庫モデルによっては,これらの方策が最適であることが知られている.

13.9 練習問題

  1. 需要が発生する前の在庫量 I = 40 のとき,需要 d = 25 が発生した場合の手持ち在庫 OH とバックオーダー BO を計算せよ.
  2. 需要が発生する前の在庫量 I = -30 のとき,需要 d = 10 が発生した場合の手持ち在庫 OH とバックオーダー BO を計算せよ.
  3. 1回の発注にかかる費用 K = 1000,単位あたりの購入費用 c = 50,発注量 Q = 200 のとき,3回の発注にかかる費用の合計を計算せよ.
  4. 需要が発生する前の在庫量 I = 60 のとき,需要 d = 100 が発生したとする.単位あたりの欠品費用を p = 20 として,欠品費用を計算せよ.
  5. 1日あたり1単位の保管費用を h = 5 とする.10日間,80単位の在庫を保管するための総保管費用を計算せよ.
  6. ある期間について,期首の在庫量を I = 60,発注量を Q = 100,需要を d = 40 とする.K = 1000c = 50h = 2p = 20 のとき,この期間の総費用を計算せよ.