商店・工場・倉庫などで,原材料・部品・製品などを適切に管理することを在庫管理(Inventory Management)という.一般的に,在庫管理の目的は,顧客の需要を満たしつつ,在庫に関わる費用を最小化することである.
豊田自動車が提唱したジャストインタイム(Just In Time, JIT)は,生産方式としてよく知られている.
JIT とは必要なものを,必要な時に,必要な量だけ生産することである.JIT の目的は,在庫を最小限に抑え,効率的な生産を実現することである.
アメリカの研究者らは,その生産方式を体系化し,リーン生産方式(Lean Manufacturing)という概念を提唱した.
在庫量が多すぎると,保管費用がかかる.逆に,在庫量が少なすぎると,欠品が発生し,顧客の需要を満たせなくなる.在庫管理は次の二つの問題を決定する.
- どのくらいの量を発注するか?(発注量)
- いつ発注するか?(発注時期)
科学的在庫管理(Scientific Inventory Management)では,これらの問題に答えるために,次の手順で在庫管理を行う.
- 在庫システムを数学モデルとして定式化する.
- 最適な発注量と発注時期を決定する.
練習 12.1 前回スーパーに行ったときに買った商品(例えば,牛乳,卵など)について考える.需要と在庫の観点から,次の質問に答えよ.
- どのくらいの量を買ったか?
- なぜその量を買ったのか?
- どのタイミング・頻度でその商品を買うか?
在庫量
- 需要(demand)
-
ある期間に顧客が購入したい商品の量.通常,\(d\) で表す.
- 手持ち在庫(on-hand inventory)
-
ある時点で,実際に手元にある在庫の量.\(OH\) で表す.
- バックオーダー(backorder)
-
手持ち在庫がなく,満たせない需要.\(BO\) で表す.
- 在庫量(inventory level)
-
ある時点での在庫の量.\(I\) で表す.
一般,\(BO\) と \(OH\) は次のように表される.
\[
OH = I^+ = \max(0, I)
\]
\[
BO = I^- = \max(0, -I)
\]
例 12.1 手持ち在庫が \(OH = 50\),需要が \(d = 30\) のとき,在庫量は次のように計算される.
\[
I = 50 - 30 = 20
\]
手持ち在庫が \(OH = 50\),需要が \(d = 70\) のとき,在庫量は次のように計算される.
\[
I = 50 - 70 = -20
\]
このとき,手持ち在庫は
\[
OH = I^+ = \max(0, I) = 0
\]
となる.バックオーダーは
\[
BO = I^- = \max(0, -I) = 20
\]
となる.
在庫モデルの分類
在庫モデルは,次のような要素で分類される.
- 需要(demand)
-
需要が決定論的 (Deterministic) か確率的(Stochastic)か.
- 観測(review)
-
在庫量を連続観測 (Continuous Review) するか,周期観測 (Periodic Review) するか.連続観測の場合,在庫量が連続的に観測でき,いつでも発注が可能である.周期観測の場合,一定の期間(例えば1週間)ごとに在庫量を観測する.
- リードタイム(lead time)
-
発注から納品までの期間.調達期間とも呼ばれる.リードタイムが決定論的か確率的か.また,リードタイムが0かどうか.在庫モデルを単純化するために,リードタイムを0とし,発注から納品までの期間を無視することもある.
- バックオーダー(backorder)
-
バックオーダーが許容されるかどうか.需要が手持ち在庫を上回った場合,バックオーダーが許容されると,欠品が発生しても,後で需要を満たすことができる.バックオーダーが許容されない場合,欠品が発生すると,上回った需要は失われ,機会損失が発生する.
- 計画期間(planning horizon)
-
単一期間 (Single Period) か,複数期間 (Multi Period) か,無限 (Infinite) か.
以下の表に,需要と観測に基づく,古典的な在庫モデルを示す.
| EOQモデル |
決定論的 |
連続観測 |
| Wagner-Whitin |
決定論的 |
周期観測 |
| 安全在庫 |
確率的 |
連続観測 |
| 新聞売り子問題 |
確率的 |
周期観測 |
在庫の費用
ここでは,在庫に関わる費用を紹介する.
- 発注費用(ordering cost)
-
発注量に関わらず,1回の発注にかかる費用.調達費用,固定費用(fixed cost)などとも呼ばれる.通常,1回の発注にかかる費用を \(K\) とする.
- 購入費用(purchase cost)
-
商品を購入するためにかかる費用.通常,単位あたりの購入費用を \(c\) とする.
- 欠品費用(stockout cost)
-
需要が手持ち在庫を上回った場合に発生する費用.通常,単位あたりの欠品費用を \(p\) とする.
- 保管費用(holding cost)
-
在庫を保管するためにかかる倉庫費用,保険費用,税金,機会費用など.通常,単位時間あたりの1単位あたりの保管費用を \(h\) とする.
例 12.2 (発注費用と購入費用) 毎回の発注量を \(Q\),1回の発注にかかる費用を \(K\),単位あたりの購入費用を \(c\) とする.1回の発注にかかる総費用は,次のように計算される.
\[
K + cQ
\]
となる.
例 12.3 (欠品費用) 在庫量を \(I\),需要を \(d\),単位あたりの欠品費用を \(p\) とする.欠品費用は次のように計算される.
\[
p (d - I)^+
\]
\(p = 10\),\(I = 50\),\(d = 70\) のとき,欠品費用は次のように計算される.
\[
p (d - I)^+ = 10 (70 - 50)^+ = 200
\]
\(p = 10\),\(I = 50\),\(d = 20\) のとき,欠品費用は次のように計算される.
\[
p (d - I)^+ = 10 (20 - 50)^+ = 0
\]
例 12.4 (在庫量が一定の保管費用) 1日あたり1単位の在庫を保管するために,\(h\) の費用がかかるとする.30日間,50単位の在庫を保管するための総保管費用を計算せよ.
保管費用は次のように計算される. \[
30 \times 50 \times h = 1500h
\]
下の図では,横軸が時間,縦軸が在庫量を表す.
コード
import matplotlib.pyplot as plt
import numpy as np
t = np.linspace(0, 30, 1000)
inventory = np.full_like(t, 50)
# Plotting the inventory level
plt.fill_between(t, inventory, color="lightgray", alpha=0.5, label="Inventory Level")
plt.plot(t, inventory, label="Inventory Level", color="black", linewidth=2)
plt.xlabel("Time")
plt.ylabel("Inventory Level")
plt.axhline(0, color="gray", linewidth=1)
plt.tight_layout()
plt.show()
一般的に,保管費用は次の式で計算される.
\[
\text{保管費用} = \text{面積} \times h
\]
例 12.5 (在庫が時間とともに変化する保管費用) 通常,在庫量が定数ではなく,時間とともに変化する.ここでは,在庫量が時間とともに線形に減少し,0になると在庫が補充される場合を考える.毎回の発注量を \(500\) とする.
下の図に示すように在庫量が時間とともに変化するとする.6 日間の保管費用を計算せよ.
コード
# Parameters
d = 250 # Demand rate
Q = 500 # Order quantity
T = Q / d # Cycle length
t = np.linspace(0, 2.999 * T, 1000)
# Inventory level over time
inventory = np.maximum(0, Q - (d * t) % Q)
# Plotting the inventory level
plt.fill_between(t, inventory, color="lightgray", alpha=0.5, label="Inventory Level")
plt.plot(t, inventory, label="Inventory Level", color="black", linewidth=2)
plt.xlabel("Time")
plt.ylabel("Inventory Level")
plt.axhline(0, color="gray", linewidth=1)
plt.ylim(bottom=0, top=Q + 200)
plt.tight_layout()
plt.show()
保管費用は \(\text{面積} \times h\) で計算される.それぞれの三角形の面積は \(\frac{1}{2} \times 500 \times 2\) であるため,6 日間の保管費用は次のように計算される.
\[
\frac{2 \times 500}{2} \times 3 \times h
\]
在庫方策
確率的在庫モデルにおいて,一つ重要な概念は在庫方策(inventory policy)である.在庫方策は,在庫の状況に応じて,在庫管理のルールを定めるものである.代表的な在庫方策を以下に示す.
- \((r, Q)\) 方策:在庫量を連続的に観測し,在庫量が発注点 \(r\) 以下になったときに発注量 \(Q\) を発注する方式である.発注点方式とも呼ばれる.
- BSP 方策(Base Stock Policy):在庫量を定期的に観測し,在庫量が基準在庫 \(S\) 以下になったときに,在庫量を \(S\) まで補充する方式である.定期発注方式とも呼ばれる.
- \((s, S)\) 方策:在庫量を定期的に観測し,在庫量が発注点 \(s\) 以下になったときに,在庫量を補充点 \(S\) まで補充する方式である.
一部の確率的在庫モデルにに対し,これらの在庫方策は最適であることが知られている.その場合,在庫方策が持つパラメータを最適化することで,在庫の期待コストを最小化することができる.
練習問題
- 在庫量 \(I = 40\) のとき,需要 \(d = 25\) が発生した場合の手持ち在庫 \(OH\) とバックオーダー \(BO\) を計算せよ.
- 在庫量 \(I = -30\),需要 \(d = 10\) のとき,手持ち在庫 \(OH\) とバックオーダー \(BO\) を計算せよ.
- 1回の発注にかかる費用 \(K = 1000\),単位あたりの購入費用 \(c = 50\),発注量 \(Q = 200\) のとき,3回の発注にかかる総費用を計算せよ.