Constant order sizes:発注量は一定である.需要率 d が一定であり,かつ在庫量が0のときに発注するため,どのサイクルも同じ状況から始まるからである.
以降では,この2つの性質を満たす方策のみを考え,1回あたりの発注量を Q と書く.
14.4 記号
記号
意味
d
単位時間あたりの需要量
K
1回あたりの発注費用
h
単位時間あたりの1単位の保管費用
c
購入単価
Q
発注量
T
サイクル期間
g(Q)
平均コスト
14.5 サイクル
発注の間隔をサイクル(cycle)と呼び,サイクル期間は
T = \frac{Q}{d}
で与えられる.ZIOと発注量一定の2つの性質から,在庫量の時間的変化は 図 14.1 のような鋸歯状になる.在庫量は発注直後に Q となり,需要率 d で直線的に減少し,0になった時点で次の発注が届く.
コード
import matplotlib.pyplot as plt# Parametersd =250# Demand rateQ =500# Order quantityT = Q / d # Cycle lengthn_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 inrange(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 levelplt.plot(t, inventory, color="#16212d", linewidth=2) # brand: inkplt.axhline(Q /2, color="#5b6b7c", linestyle="--", linewidth=1) # brand: slateplt.xlabel("Time")plt.ylabel("Inventory Level")plt.xticks([i * T for i inrange(n_cycles +1)], ["$0$", "$T$", "$2T$", "$3T$"])plt.yticks([0, Q /2, Q], ["$0$", "$Q/2$", "$Q$"])plt.xlim(0, n_cycles * T)plt.ylim(0, Q *1.15)plt.tight_layout()plt.show()
import matplotlib.pyplot as pltimport numpy as np# ParametersK =40# Order costh =10# Holding costd =5# Demand rateQ = np.linspace(1, 40, 400) # Order quantity from 1 to 40# Cost calculationsorder_cost = K * d / Qholding_cost = (h * Q) /2average_cost = order_cost + holding_costoptimal_Q = np.sqrt(2* K * d / h)# Plotting the costs# Brand palette, spread over L* = 46 / 58 / 32 so the curves stay apart# in grayscale and under colour-vision deficiencyplt.plot(Q, order_cost, label=r"$Kd/Q$", color="#137a72")plt.plot(Q, holding_cost, label=r"$hQ/2$", color="#c17c18")plt.plot(Q, average_cost, label=r"$g(Q)$", color="#144f78", linewidth=2)plt.axvline(optimal_Q, color="#b03535", linestyle="--", label=r"$Q^*$")# The two cost curves cross exactly at Q*plt.plot(optimal_Q, K * d / optimal_Q, "o", color="#16212d", alpha=0.5, zorder=5)plt.xlabel("Order Quantity Q")plt.ylabel("Cost")plt.ylim(bottom=0)plt.legend()plt.tight_layout()plt.show()
import numpy as npdef eoq(K, d, h):""" Calculate the Economic Order Quantity (EOQ). Parameters: K (float): Order cost d (float): Demand rate h (float): Holding cost Returns: float: Optimal order quantity Q* """return np.sqrt(2* K * d / h)if__name__=="__main__": K =5000# Order cost d =250# Demand rate (units per month) h =150# Holding cost (per unit per month) Q_star = eoq(K, d, h) T_star = Q_star / dprint(f"Optimal Order Quantity (Q*): {Q_star:.2f}")print(f"Optimal Cycle Time (T*): {T_star:.2f}")
Optimal Order Quantity (Q*): 129.10
Optimal Cycle Time (T*): 0.52
14.9 リードタイム*
EOQモデルでは,リードタイムは0と仮定している.リードタイムが L > 0 の場合でも最適発注量 Q^* は変わらず,納品してほしい時点の L 期間前に発注すればよい.変わるのは発注量ではなく,発注のタイミングだけである.
在庫量がある水準 r に達した時点で発注することにし,この r を発注点(reorder point)と呼ぶ.リードタイム L の間に需要は dL 個発生するため,発注点は次のように表される.
r = dL
警告r = dL が使えるのは L < T^* のときだけ
r = dL は,発注してから納品されるまでに,未納品の発注が高々1件しかないことを前提としている.L \geq T^* の場合は,前の発注が届く前に次の発注時点が来るため,発注点は r = dL - \lfloor L / T^* \rfloor Q^* とする必要がある.
import numpy as npK =5000# Order costd =50# Demand rate (units per week)h =100# Holding cost (per unit per week)Q_star = np.sqrt(2* K * d / h)# Since order quantity must be an integer, compare g(70) and g(71)def g(Q):return (K * d / Q) + (h * Q /2)g_70 = g(70)g_71 = g(71)optimal_Q =70if g_70 < g_71 else71T_star = optimal_Q / dprint(f"Optimal Order Quantity (Q*): {optimal_Q} units")print(f"Optimal Cycle Time (T*): {T_star:.2f} weeks")
Optimal Order Quantity (Q*): 71 units
Optimal Cycle Time (T*): 1.42 weeks
Camm, Jeffrey, James Cochran, Michael Fry, ほか. 2022年. An introduction to management science: Quantitative approaches to decision making. 16番目 版. South-Western College Publishing.
Harris, Ford W. 1990年. 「How many parts to make at once」. Oper. Res. 38 (6): 947–50.
Hillier, Frederick, と Gerald Lieberman. 2025年. ISE introduction to operations research. 11番目 版. McGraw-Hill Education.
Snyder, Lawrence V, と Zuo-Jun Max Shen. 2019年. Fundamentals of supply chain theory. 2番目 版. John Wiley & Sons.