引言
本文介绍了一个经典的商品采购模型(报童问题)及其解法. 该模型通过考虑需求的不确定性来最大化销售利润. 注: 本文的主要内容参考Gallego1.
1. 报童问题
这是一个关于卖报商人采购报纸的问题. 每天早上, 卖报商以批发价0.3元(每份)向报社采购当天的报纸, 然后以零售价1元(每份)进行售卖. 如果报纸在当天没有卖完, 他会把报纸以0.05元(每份)的价格卖给废品回收站. 那么卖报商应该如何确定报纸的采购数量?
我们先简单分析一下这个问题的特点:
- 采购一个商品.
- 在一个采购周期内仅采购一次.
- 采购之时不知道准确的需求.
- 商品会过期.
2. 数学模型
下面我们用数学语言把这个问题再描述一下.
参数
- 单位采购成本(cost per unit): c c c
- 零售价(sale price): p p p
- 残值(salvage value), 即商品过期之后的售价: s s s
- 需求(demand): 随机变量 D D D服从分布 F F F, 均值和标准差分别记为 μ , σ \mu, \sigma μ,σ
决策变量
- 采购量: x x x
目标
- 最大化期望收益 π ( x ) : = p ⋅ E [ min ( x , D ) ] + s ⋅ E [ max ( x − D , 0 ) ] − c x \pi(x) := p \cdot \mathbb{E}[\min(x, D)] + s\cdot \mathbb{E}[\max(x-D, 0)] - cx π(x):=p⋅E[min(x,D)]+s⋅E[max(x−D,0)]−cx
不失一般性, 我们假设 p > c > s p>c>s p>c>s, 否则问题的最优解是显而易见的.
3. 求解
记 x + : = max ( x , 0 ) , x − : = min ( x , 0 ) x^+ := \max(x, 0), x^-:=\min(x, 0) x+:=max(x,0),x−:=min(x,0). 因此 x = x + + x − x=x^+ + x^- x=x++x−, x − = − ( − x ) + x^- = -(-x)^+ x−=−(−x)+. 利用 min ( x , D ) = D − ( D − x ) + \min(x, D) = D - (D-x)^+ min(x,D)=D−(D−x)+, 我们可以把 π ( x ) \pi(x) π(x)表示成如下形式:
π ( x ) = ( p − c ) μ − α ( x ) , \pi(x) = (p-c)\mu - \alpha(x), π(x)=(p−c)μ−α(x),
其中
α ( x ) = ( c − s ) E [ ( x − D ) + ] + ( p − c ) E [ ( D − x ) + ] . \alpha(x) = (c-s)\mathbb{E}[(x-D)^+] + (p-c)\mathbb{E}[(D-x)^+]. α(x)=(c−s)E[(x−D)+]+(p−c)E[(D−x)+].
因此 max π ( x ) ⇔ min α ( x ) \max \pi(x) \Leftrightarrow \min \alpha(x) maxπ(x)⇔minα(x). 记 h = c − s h = c-s h=c−s, b = p − c b=p-c b=p−c. 则 h , b h, b h,b分别代表采购过量(overage)和少量(underage)的单位成本.
令 f ( z ) = h z + − b z − f(z) = hz^+ - bz^- f(z)=hz+−bz−. α ( x ) \alpha(x) α(x)可以被写成
α ( x ) = E [ f ( x − D ) ] . \alpha(x)=\mathbb{E}[f(x-D)]. α(x)=E[f(x−D)].
由于 f ( z ) f(z) f(z)是凸函数, 它的线性变换 α ( x ) \alpha(x) α(x)也是凸函数, 当 F F F是连续分布时, 最优解的一阶导数为0. 我们可以通过交换积分号导, 即
α ′ ( x ) = h ⋅ E [ δ ( x − D ) ] − b ⋅ E [ δ ( D − x ) ] \alpha'(x) = h\cdot \mathbb{E}[\delta(x-D)] - b\cdot \mathbb{E}[\delta(D-x)] α′(x)=h⋅E[δ(x−D)]−b⋅E[δ(D−x)]
其中 δ ( z ) = 1 \delta(z)=1 δ(z)=1 如果 z > 0 z>0 z>0, 否则 δ ( z ) \delta(z) δ(z)为0.
注意到 E [ δ ( x − D ) ] = P r ( x − D > 0 ) \mathbb{E}[\delta(x-D)] = Pr(x-D>0) E[δ(x−D)]=Pr(x−D>0)且 E [ δ ( D − x ) ] = P r ( D − x > 0 ) \mathbb{E}[\delta(D-x)] = Pr(D-x>0) E[δ(D−x)]=Pr(D−x>0). 我们有
α ′ ( x ) = h ⋅ P r ( D < x ) − b ⋅ P r ( D > x ) . \alpha'(x)= h \cdot Pr(D < x) - b \cdot Pr(D>x). α′(x)=h⋅Pr(D<x)−b⋅Pr(D>x).
令 α ′ ( x ) = 0 \alpha'(x)=0 α′(x)=0, 我们得到
F ( x ) : = P r ( D ≤ x ) = b b + h . F(x) := Pr(D\leq x) = \frac{b}{b+h}. F(x):=Pr(D≤x)=b+hb.
临界分位数(Critical Fractile)
γ = b b + h . \gamma = \frac{b}{b+h}. γ=b+hb.
由于
F
F
F是随机变量
D
D
D的cdf(cumulative distribution function) (单调非递减), 因而存在逆函数. 设最优解为
x
∗
x^*
x∗, 因此
x
∗
=
F
−
1
(
γ
)
.
x^* = F^{-1}(\gamma).
x∗=F−1(γ).
4. 例子
本节考虑两个具体的例子. 一个是 D D D服从正态分布(连续分布), 可以按照前文的公式计算最优解; 另一个例子是 D D D服从Poisson分布, 我们介绍如何把计算方法适配到离散分布的情形.
4.1 正态分布
D
∼
N
(
μ
,
σ
2
)
D\sim N(\mu,\sigma^2)
D∼N(μ,σ2). 令
Z
∼
N
(
0
,
1
)
Z\sim N(0, 1)
Z∼N(0,1),
Φ
(
z
)
=
P
r
(
Z
≤
z
)
\Phi(z) = Pr(Z\leq z)
Φ(z)=Pr(Z≤z)且
z
γ
=
Φ
−
1
(
γ
)
z_{\gamma} = \Phi^{-1}(\gamma)
zγ=Φ−1(γ).
由于
P
r
(
D
−
μ
σ
≤
z
γ
)
=
Φ
(
z
γ
)
=
γ
.
Pr\left(\frac{D-\mu}{\sigma}\leq z_{\gamma}\right) = \Phi(z_{\gamma}) = \gamma.
Pr(σD−μ≤zγ)=Φ(zγ)=γ.
因此
x
∗
=
μ
+
z
γ
σ
.
x^* = \mu + z_{\gamma}\sigma.
x∗=μ+zγσ.
例 D D D服从正态分布, μ = 100 \mu=100 μ=100, σ = 20 \sigma=20 σ=20. 设 c = 5 c=5 c=5, h = 1 h=1 h=1, b = 3 b=3 b=3. 我们的计算步骤如下:
- γ = b h + b = 0.75 \gamma = \frac{b}{h+b} = 0.75 γ=h+bb=0.75
-
z
γ
=
Φ
−
1
(
0.75
)
=
0.6745
z_{\gamma} = \Phi^{-1}(0.75) = 0.6745
zγ=Φ−1(0.75)=0.6745
# python >>> from scipy.stats import norm >>> norm.ppf(0.75) 0.6744897501960817
- x ∗ = μ + z γ ⋅ σ = 100 + 0.6745 ∗ 20 = 113.49 x^*=\mu + z_{\gamma} \cdot \sigma = 100 + 0.6745 * 20 = 113.49 x∗=μ+zγ⋅σ=100+0.6745∗20=113.49
4.2 Poisson分布
Poisson分布的pmf (probability mass function)为
P r ( D = k ) = e − λ λ k k ! . Pr(D=k) = e^{-\lambda}\frac{\lambda^k}{k!}. Pr(D=k)=e−λk!λk.
由于Possion分布是离散分布(对任意的
γ
\gamma
γ,
F
−
1
(
γ
)
F^{-1}(\gamma)
F−1(γ)不一定可计算), 我们令
x
∗
=
arg
min
x
{
x
∈
N
∣
P
r
(
D
≤
x
)
≥
γ
}
.
x^* = \arg\min_x \{x\in \mathbb{N}\mid Pr(D\leq x) \geq \gamma\}.
x∗=argxmin{x∈N∣Pr(D≤x)≥γ}.
例 D D D服从Poisson分布, λ = 25 \lambda=25 λ=25. 设 c = 5 c=5 c=5, h = 1 h=1 h=1, b = 3 b=3 b=3. 我们的计算步骤如下:
- γ = b h + b = 0.75 \gamma = \frac{b}{h+b} = 0.75 γ=h+bb=0.75
- 利用二分法找到最小的整数
x
∗
x^*
x∗使得
F
(
x
∗
)
≥
0.75
F(x^*)\geq 0.75
F(x∗)≥0.75(其中
F
F
F是随机变量
D
D
D的cdf).
# python >>> from scipy.stats import poisson >>> poisson(25).cdf(27) 0.7001861449652768 >>> poisson(25).cdf(28) 0.763400741866402
- x ∗ = 28 x^*=28 x∗=28
5. 总结
- 报童问题是商品采购问题的一个例子. 对该问题的研究和求解可以指导我们在实际中优化采购计划, 从而提高商品的销售利润.
- 但在实际中制定商品的采购计划时, 我们的目标与约束一般会比报童问题复杂(例如考虑库存成本), 因此需要根据实际问题进行建模和求解, 不能盲目照搬已有的模型.
- 制定采购计划之前可以采用需求预测(销量预测), 但同时也要考虑销量的随机性(详情见《如何在商品采购中考虑不确定性》).
参考文献
Guillermo Gallego. “IEOR 4000 Production Management Lecture 7”. Columbia University, 2005. ↩︎