报童模型
报童模型(newsvendor model)是先决定一次订货量、再面对随机需求的单周期库存模型。订少了损失未满足需求的贡献,订多了产生剩余成本;最优数量通常由需求分布的某个分位数决定,而不是直接取平均需求。
设一个教学商品单价十二元,采购成本每件六元,期末未售出可回收每件二元。需求 只可能为一、二、四件,概率分别为 。本篇先用这个有限例子计算,再说明一般的分位数规则。所有数字都是为讲解构造的模型输入。
决策时点、成本与目标
设需求 ,且 。订货量 在观察需求之前确定。售完后的剩余量为 ,缺货量为 ,其中 。给定单位过量成本 、单位不足成本 ,目标是 需求有限期望保证固定有限 下的这些期望有限。成本与需求分布为输入, 是决策;不能在每个需求已经知道后分别选择一次订量,再把它称作同一个事前决策。[1]
若销售单价为 、采购成本为 、残值为 ,并满足 ,则没有另加缺货罚款时 这可以从利润核对。对一次需求 ,利润为 需求项 与决策无关,所以最大化期望利润等价于最小化 。缺货成本取损失的毛利,不能在已经扣过采购费用后再次把全部售价作为额外损失重复计算。
分位数规则的推导
先允许 连续。每个实现成本 是分段线性的凸函数,正权重求平均后 仍凸。若分布函数 在 处连续,则边际成本为 原因是需求低于订量时多订一小单位增加过量成本,需求高于订量时减少不足成本。每个实现的斜率被 控制,因此可以对期望取这一边际极限。
定义临界比率 在连续且严格递增的分布区域,最优点由 确定。一般含原子的分布则应使用左右斜率: 凸函数在此最小,当且仅当左斜率不大于零、右斜率不小于零,即 若分布在一段区间内没有需求质量,且该段的 恰等于 ,整段都可能最优;只报出一个分位点不等于证明解唯一。
若需求和订量都取非负整数,也可完全不用微分。比较订 与订 :当 时增加 ,当 时减少 ,故 随着 增大,该差分不减;从负变为非负时达到最小。最小的整数最优订量因此是最小满足 的非负整数。
三种需求下逐项复算
开头价格给出 ,所以 。期望需求为 ,但临界分位数为二。
对 ,需求为一时剩一件,成本四;需求为二时无偏差;需求为四时缺两件,成本十二。按概率加权, 其他相邻选择分别为 由差分式,,,两者与直接求和一致。
此时预计售出 件,预计剩余 件,期望利润为 也可按“完全知道需求时的利润减去偏差成本”核对:。两种计算不重复扣成本。
变式。 只把售价提高到二十二,保持采购、残值与需求分布不变。现在 、; 尚未达到阈值,最小最优订量变为四。此时 、,期望利润分别为 、。最优订量的改变来自不足成本变化,不是需求均值改变。
精确离散分布实现
以下实现接受有限的 (需求整数, 概率) 表,概率与成本使用整数或 Fraction。同一需求的重复记录会合并;概率必须非负且总和恰为一,两个单位成本必须为正。函数不改写输入,返回最小最优整数订量、期望偏差成本与临界比率。
from fractions import Fraction
def discrete_newsvendor(distribution, underage, overage):
def exact(value):
if isinstance(value, bool) or not isinstance(value, (int, Fraction)):
raise TypeError("Use integers or Fraction")
return Fraction(value)
cu, co = exact(underage), exact(overage)
if cu <= 0 or co <= 0:
raise ValueError("Both costs must be positive")
mass = {}
for demand, probability in distribution:
if type(demand) is not int or demand < 0:
raise ValueError("Demand must be a nonnegative integer")
probability = exact(probability)
if probability < 0:
raise ValueError("Negative probability")
mass[demand] = mass.get(demand, Fraction(0)) + probability
if sum(mass.values(), Fraction(0)) != 1:
raise ValueError("Probabilities must sum exactly to one")
alpha, cumulative = cu / (cu + co), Fraction(0)
for quantity in sorted(mass):
cumulative += mass[quantity]
if cumulative >= alpha:
cost = sum((p * (co * max(quantity - d, 0)
+ cu * max(d - quantity, 0))
for d, p in mass.items()), Fraction(0))
return quantity, cost, alpha
probabilities = [(1, Fraction(1, 4)), (2, Fraction(1, 2)),
(4, Fraction(1, 4))]
print(discrete_newsvendor(probabilities, 6, 4))
print(discrete_newsvendor(probabilities, 16, 4))
# (2, Fraction(4, 1), Fraction(3, 5))
# (4, Fraction(7, 1), Fraction(4, 5))
扫描中累计概率始终等于当前需求值处的分布函数;首次达到临界比率就是上面差分证明给出的最小最优点。因为全部概率最终加到一、,合法输入一定返回。若有 条记录,合并、求和成本为线性,排序为 ,存储为 ,有理数位长另计。
模型边界与扩展
模型假设单次事前决策、一个周期、单位成本固定,且需求分布在决定订量时已知或已估计。多周期补货、交货延迟、积压订单、库存容量、售价影响需求以及多商品共享预算,都增加了新的状态或约束,不能只替换一个分位数就认为问题相同。
期望成本最小也不等于每次需求实现时成本都小。本例订二遇到需求四仍会缺两件;若目标变为控制缺货概率或尾部损失,应另写服务约束或条件风险价值等风险目标。输入概率估计不准时,公式代入正确也不保证现实预测可靠;模型的数学最优性与需求资料的准确性应分别检查。
参考资料
- ↑ Fabio Furini:The Newsvendor and its variants,Operations Research Lab,“Basic model and the quantile rule”,过量/不足成本、期望目标及临界分位数。本文使用不同的离散需求和完整边际推导。访问日期:2026年10月25日。