一个考虑成本的随机库存模型

问题

考虑一个商品补货问题:

  • 零售商以 pp 元/件的采购价 (purchase price) 从供应商处采购某种商品, 以 rr 元/件的零售价 (retail price) 售卖给消费者, 其中 r>pr>p.
  • 零售商将商品存放在仓库中, 为此需要承担 hh 元/(件·天) 的持有成本 (holding cost).
  • 考虑到运费、人力等因素, 每次从供应商处补货, 零售商都需承担 KK 元的固定成本 (fixed setup cost).
  • 消费者不接受延迟发货, 这意味着当库存量无法满足消费者的需求时, 零售商就要承担缺货损失 (shortage cost).
  • 消费者对商品的需求量是随机的, 但未来任意一段时间的需求量所服从的概率分布是已知的.
  • 零售商从供应商处订货的提前期 (lead time) [1]LL 天, 最小起订量为 moqmoq 件.
  • 零售商采用 (R, Q) 订货策略, 即当库存量下降到再订货点 (Reorder Point) RR 时, 就触发补货, 订货量 (Order Quantity) 为 QQ. 此外, 由于操作上的原因, 两次订货之间的时间间隔不能少于 τ\tau 天. 零售商希望尽可能维持 α\alpha 的服务水平 (service level) [2], 同时尽可能降低成本, 需要由算法来决策 RRQQ.

求解

确定再订货点

计算从当前起的 LL 天之内不发生缺货的概率 α~\tilde\alpha, 若此概率小于或等于目标服务水平 α\alpha、且距离上次补货不少于 τ\tau 天时, 就触发补货.

用随机变量 Dτ1,τ2D_{\tau_1, \tau_2} 表示时间段 [τ1,τ2)[\tau_1, \tau_2) 内的需求, fτ1,τ2(x)f_{\tau_1, \tau_2}(x) 表示 Dτ1,τ2D_{\tau_1, \tau_2} 的概率质量函数, Fτ1,τ2(x)F_{\tau_1, \tau_2}(x) 表示 Dτ1,τ2D_{\tau_1, \tau_2} 的累积分布函数, 即

fτ1,τ2(x)=Prob(Dτ1,τ2=x)Fτ1,τ2(x)=Prob(Dτ1,τ2x)\begin{aligned} f_{\tau_1, \tau_2}(x) &= Prob(D_{\tau_1, \tau_2}= x) \\ F_{\tau_1, \tau_2}(x) &= Prob(D_{\tau_1, \tau_2}\leq x) \end{aligned}

t0t_0 表示当前时刻, s0s_0 表示当前的库存. 用 (t1,s1),(t2,s2),,(tn,sn)(t_1, s_1), (t_2, s_2), \cdots, (t_n, s_n) 表示在途库存, 即 tit_i 时刻将会入库 sis_i 单位货物. 这里 t0<t1<t2<<tn<t0+Lt_0<t_1<t_2<\cdots<t_n<t_0+L.

如果没有在途库存, 则从当前起的 LL 天内不发生缺货等价于 [t0,t0+L)[t_0, t_0+L) 内的需求 Dt0,t0+LD_{t_0, t_0+L} 不超过当前的库存 s0s_0, 即

α~=Prob(Dt0,t0+Ls0)=Ft0,t0+L(s0)\begin{aligned} \tilde\alpha &= Prob(D_{t_0, t_0+L}\leq s_0) \\ &= F_{t_0, t_0+L}(s_0) \end{aligned}

如果有一批在途库存 (t1,s1)(t_1, s_1), 则从当前起的 LL 天不发生缺货等价于 [t0,t1)[t_0, t_1) 内的需求 Dt0,t1D_{t_0, t_1} 不超过 s0s_0[t0,t0+L)[t_0, t_0+L) 内的总需求 Dt0,t0+LD_{t_0, t_0+L} 不超过总库存 s0+s1s_0+s_1. 因此

α~=Prob((Dt0,t1s0)(Dt0,t0+Ls0+s1))=Prob((x=0s0Dt0,t1=x)(Dt0,t0+Ls0+s1))=Prob(x=0s0((Dt0,t1=x)(Dt0,t0+Ls0+s1)))=Prob(x=0s0((Dt0,t1=x)(Dt1,t0+Ls0+s1x)))=x=0s0Prob((Dt0,t1=x)(Dt1,t0+Ls0+s1x))=x=0s0Prob(Dt0,t1=x)Prob(Dt1,t0+Ls0+s1x)=x=0s0ft0,t1(x)Ft1,t0+L(s0+s1x)\begin{aligned} \tilde\alpha &= Prob((D_{t_0, t_1}\leq s_0)\cap (D_{t_0, t_0+L}\leq s_0+s_1)) \\ &= Prob((\bigcup_{x=0}^{s_0}D_{t_0, t_1}=x)\cap (D_{t_0, t_0+L}\leq s_0+s_1)) \\ &= Prob(\bigcup_{x=0}^{s_0}((D_{t_0, t_1}=x)\cap (D_{t_0, t_0+L}\leq s_0+s_1))) \\ &= Prob(\bigcup_{x=0}^{s_0}((D_{t_0, t_1}=x)\cap (D_{t_1, t_0+L}\leq s_0+s_1-x))) \\ &= \sum_{x=0}^{s_0}Prob((D_{t_0, t_1}=x)\cap (D_{t_1, t_0+L}\leq s_0+s_1-x)) \\ &= \sum_{x=0}^{s_0}Prob(D_{t_0, t_1} = x)\cdot Prob(D_{t_1, t_0+L}\leq s_0+s_1-x) \\ &=\sum_{x=0}^{s_0}f_{t_0, t_1}(x)\cdot F_{t_1, t_0+L}(s_0+s_1-x) \end{aligned}

下面我们推广到有 nn 批在途库存 (t1,s1),(t2,s2),,(tn,sn)(t_1, s_1), (t_2, s_2), \cdots, (t_n, s_n) 的情况. 在给出详细的推导之前, 我们不妨先引用一下列夫·朗道 (Lev Landau) 在《量子力学: 非相对论理论》第九章中的论断

“The calculation … is in principle very simple; it is easier to do it oneself than to follow an account of it. Hence we shall give only the result of this calculation.”

因此, 我们有

α~=x0=0s0ft0,t1(x0)x1=0s0+s1x0ft1,t2(x1)xn1=0i=0n1sii=0n2xiftn1,tn(xn1)Ftn,t0+L(i=0nsii=0n1xi)\tilde\alpha = \sum_{x_0=0}^{s_0}f_{t_0, t_1}(x_0)\sum_{x_1=0}^{s_0+s_1-x_0}f_{t_1, t_2}(x_1)\cdots\sum_{x_{n-1}=0}^{\sum_{i=0}^{n-1}s_i-\sum_{i=0}^{n-2}x_i}f_{t_{n-1}, t_n}(x_{n-1})F_{t_n, t_0+L}(\sum_{i=0}^{n}s_i-\sum_{i=0}^{n-1}x_i)

可以看到, 当有多批在途库存时, 计算会变得非常反复. 我们有必要做一些近似.

确定订货量

t0t_0 天订货 QQ 件, 第 t0+Lt_0+L 天到货, 假设这批货到第 t0+L+tt_0+L+t 天消耗完(库存先进先出), 则

  • 采购成本为 pQ+Kp\cdot Q + K, 平摊到每天为 pQ+Kt+1\dfrac{p\cdot Q + K}{t+1}.

  • 持有成本从入库开始计算, 直至这批货消耗完为止, 平摊到每天约等于 hQ2\dfrac{h\cdot Q}{2}.

  • 缺货损失从入库开始计算, 直至 τ\tau 天后为止.

    • t<τt<\tau 时, 缺货损失为单位利润 rpr-p 乘以 [t0+L+t,t0+L+τ)[t_0+L+t, t_0+L+\tau) 内的期望需求量 EDt0+L+t,t0+L+τ\mathbb ED_{t_0+L+t, t_0+L+\tau}.
    • tτt\geq\tau 时, 缺货损失为 00.

    为了统一形式, 我们规定当 τ2τ1\tau_2\leq \tau_1 时, Dτ1,τ20D_{\tau_1, \tau_2}\equiv 0. 这样一来, 缺货损失为 (rp)EDt0+L+t,t0+L+τ(r-p)\cdot\mathbb ED_{t_0+L+t, t_0+L+\tau}, 平摊到每天为 (rp)EDt0+L+t,t0+L+τt+1\dfrac{(r-p)\cdot\mathbb ED_{t_0+L+t, t_0+L+\tau}}{t+1}.

这批货到第 t0+L+tt_0+L+t 天消耗完到概率记作 p(t)p(t), 则平摊到每天的期望成本为

cost(Q)=t=0p(t)[pQ+Kt+1+hQ2+(rp)EDt0+L+t,t0+L+τt+1]cost(Q) = \sum_{t=0}^{\infty}p(t)\left[\frac{p\cdot Q + K}{t+1}+ \frac{h\cdot Q}{2}+\frac{(r-p)\cdot\mathbb ED_{t_0+L+t, t_0+L+\tau}}{t+1}\right]

接下来我们来计算 p(t)p(t).

采购单于第 t0+Lt_0+L 天入库, 此时仓库中可能还有剩余的库存 ss. 因此, 采购单入库后到第 t0+L+tt_0+L+t 天消耗完, 等价于第 t0+Lt_0+L 天的总库存量 Q+sQ+s 到第 t0+L+tt_0+L+t 天消耗完. 这意味着 Q+sQ+s 能满足 [t0+L,t0+L+t)[t_0+L, t_0+L+t) 的总需求, 但不能满足 [t0+L,t0+L+t+1)[t_0+L, t_0+L+t+1) 的总需求, 即 Dt0+L,t0+L+tQ+s<Dt0+L,t0+L+t+1D_{t_0+L, t_0+L+t}\leq Q+s < D_{t_0+L, t_0+L+t+1}.

如果没有在途库存, 则

p(t)=Prob(Dt0,L>s0)Prob(Dt0+L,t0+L+tQ<Dt0+L,t0+L+t+1)+x=0s0Prob(Dt0,L=x)Prob(Dt0+L,t0+L+tQ+s0x<Dt0+L,t0+L+t+1)=(1Ft0,L(s0))(Ft0+L,t0+L+t(Q)Ft0+L,t0+L+t+1(Q))+x=0s0ft0,L(x)(Ft0+L,t0+L+t(Q+s0x)Ft0+L,t0+L+t+1(Q+s0x))\begin{aligned} p(t) &= Prob(D_{t_0, L}>s_0)\cdot Prob(D_{t_0+L, t_0+L+t}\leq Q< D_{t_0+L, t_0+L+t+1}) \\ &+ \sum_{x=0}^{s_0}Prob(D_{t_0, L}=x)\cdot Prob(D_{t_0+L, t_0+L+t}\leq Q+s_0-x< D_{t_0+L, t_0+L+t+1})\\ &=(1-F_{t_0, L}(s_0))\cdot (F_{t_0+L, t_0+L+t}(Q)-F_{t_0+L, t_0+L+t+1}(Q))\\ &+\sum_{x=0}^{s_0}f_{t_0, L}(x)\cdot(F_{t_0+L, t_0+L+t}(Q+s_0-x)-F_{t_0+L, t_0+L+t+1}(Q+s_0-x))\\ \end{aligned}

下面考虑有在途库存的情况.

有了这些公式之后, 我们可以通过下面的算法确定订货量 QQ.

1
2
3
4
5
6
7
Q = moq
cost = cost(Q)
while True:
if cost(Q+1) > cost:
return Q
Q = Q+1
cost = cost(Q)

如果有箱规的约束, 也可以在此处一并考虑.


  1. 提前期指从下单开始到入库为止, 所经历的时间. Lead time is the amount of time between the placement of and order to replenish inventory and the receipt of the goods into inventory. ↩︎

  2. 服务水平指从下单开始到入库为止, 期间不发生缺货的概率. Service level is the probability that a stockout will not occur between the time an order is placed and the order quantity is received. ↩︎