报童问题 (The Newsvendor Problem)

引言

本文介绍了一个经典的商品采购模型(报童问题)及其解法. 该模型通过考虑需求的不确定性来最大化销售利润. 注: 本文的主要内容参考Gallego[1].

1. 报童问题

这是一个关于卖报商人采购报纸的问题. 每天早上, 卖报商以批发价0.3元(每份)向报社采购当天的报纸, 然后以零售价1元(每份)进行售卖. 如果报纸在当天没有卖完, 他会把报纸以0.05元(每份)的价格卖给废品回收站. 那么卖报商应该如何确定报纸的采购数量?

我们先简单分析一下这个问题的特点:

  1. 采购一个商品.
  2. 在一个采购周期内仅采购一次.
  3. 采购之时不知道准确的需求.
  4. 商品会过期.

2. 数学模型

下面我们用数学语言把这个问题再描述一下.

参数

  • 单位采购成本(cost per unit): c
  • 零售价(sale price): p
  • 残值(salvage value), 即商品过期之后的售价: s
  • 需求(demand): 随机变量D服从分布F, 均值和标准差分别记为\mu, \sigma

决策变量

  • 采购量: x

目标

  • 最大化期望收益\pi(x) := p \cdot \mathbb{E}[\min(x, D)] + s\cdot \mathbb{E}[\max(x-D, 0)] - cx

不失一般性, 我们假设p>c>s, 否则问题的最优解是显而易见的.

3. 求解

x^+ := \max(x, 0), x^-:=\min(x, 0). 因此x=x^+ + x^-, x^- = -(-x)^+. 利用\min(x, D) = D - (D-x)^+, 我们可以把\pi(x)表示成如下形式:

\pi(x) = (p-c)\mu - \alpha(x),

其中

\alpha(x) = (c-s)\mathbb{E}[(x-D)^+] + (p-c)\mathbb{E}[(D-x)^+].

因此 \max \pi(x) \Leftrightarrow \min \alpha(x). 记h = c-s, b=p-c. 则h, b分别代表采购过量(overage)和少量(underage)的单位成本.

f(z) = hz^+ - bz^-. \alpha(x)可以被写成

\alpha(x)=\mathbb{E}[f(x-D)].

由于f(z)是凸函数, 它的线性变换\alpha(x)也是凸函数, 当F是连续分布时, 最优解的一阶导数为0. 我们可以通过交换积分号导, 即

\alpha'(x) = h\cdot \mathbb{E}[\delta(x-D)] - b\cdot \mathbb{E}[\delta(D-x)]

其中\delta(z)=1 如果z>0, 否则\delta(z)为0.

注意到\mathbb{E}[\delta(x-D)] = Pr(x-D>0)\mathbb{E}[\delta(D-x)] = Pr(D-x>0). 我们有

\alpha'(x)= h \cdot Pr(D < x) - b \cdot Pr(D>x).

\alpha'(x)=0, 我们得到

F(x) := Pr(D\leq x) = \frac{b}{b+h}.

临界分位数(Critical Fractile)
\gamma = \frac{b}{b+h}.

由于F是随机变量D的cdf(cumulative distribution function) (单调非递减), 因而存在逆函数. 设最优解为x^*, 因此
x^* = F^{-1}(\gamma).

4. 例子

本节考虑两个具体的例子. 一个是D服从正态分布(连续分布), 可以按照前文的公式计算最优解; 另一个例子是D服从Poisson分布, 我们介绍如何把计算方法适配到离散分布的情形.

4.1 正态分布

D\sim N(\mu,\sigma^2). 令Z\sim N(0, 1), \Phi(z) = Pr(Z\leq z)z_{\gamma} = \Phi^{-1}(\gamma).
由于
Pr\left(\frac{D-\mu}{\sigma}\leq z_{\gamma}\right) = \Phi(z_{\gamma}) = \gamma.
因此
x^* = \mu + z_{\gamma}\sigma.

D服从正态分布, \mu=100, \sigma=20. 设c=5, h=1, b=3. 我们的计算步骤如下:

  1. \gamma = \frac{b}{h+b} = 0.75
  2. z_{\gamma} = \Phi^{-1}(0.75) = 0.6745
    # python
    >>> from scipy.stats import norm
    >>> norm.ppf(0.75)
    0.6744897501960817
    
  3. x^*=\mu + z_{\gamma} \cdot \sigma = 100 + 0.6745 * 20 = 113.49

4.2 Poisson分布

Poisson分布的pmf (probability mass function)为

Pr(D=k) = e^{-\lambda}\frac{\lambda^k}{k!}.

由于Possion分布是离散分布(对任意的\gamma, F^{-1}(\gamma)不一定可计算), 我们令
x^* = \arg\min_x \{x\in \mathbb{N}\mid Pr(D\leq x) \geq \gamma\}.

D服从Poisson分布, \lambda=25. 设c=5, h=1, b=3. 我们的计算步骤如下:

  1. \gamma = \frac{b}{h+b} = 0.75
  2. 利用二分法找到最小的整数x^*使得F(x^*)\geq 0.75(其中F是随机变量D的cdf).
    # python
    >>> from scipy.stats import poisson
    >>> poisson(25).cdf(27)
    0.7001861449652768
    >>> poisson(25).cdf(28)
    0.763400741866402
    
  3. x^*=28

5. 总结

  1. 报童问题是商品采购问题的一个例子. 对该问题的研究和求解可以指导我们在实际中优化采购计划, 从而提高商品的销售利润.
  2. 但在实际中制定商品的采购计划时, 我们的目标与约束一般会比报童问题复杂(例如考虑库存成本), 因此需要根据实际问题进行建模和求解, 不能盲目照搬已有的模型.
  3. 制定采购计划之前可以采用需求预测(销量预测), 但同时也要考虑销量的随机性(详情见《如何在商品采购中考虑销量的随机性?》).

参考文献


  1. Guillermo Gallego. "IEOR 4000 Production Management Lecture 7". Columbia University, 2005.

推荐阅读更多精彩内容