做决策的时候最怕两件事:数据不够,或者数据骗你。两阶段分布鲁棒优化(distributionally robust optimization, DRO)就是在“数据少”和“怕被数据骗”之间找一个平衡。这篇文章要聊的,是基于Wasserstein距离构建模糊集、再做对偶转化并用线性决策规则(linear decision rule)近似求解的两阶段分布鲁棒模型,而且最终会给出一个完整的Matlab实现,属于拿来就能跑的最小闭环。适合正在入门DRO的研究生、做需求不确定下库存或产能规划的工程师,还有那些看到一堆符号推导就头大、想先跑通一个例子再回头啃定理的人。这个例子麻雀虽小,但对偶、模糊集、决策规则这三座大山都能踩到。
1. 从两阶段决策到分布鲁棒:这个模型到底在算什么
1.1 两阶段决策的直觉
两阶段决策在我眼里一直像“先订票,再改签”。第一阶段是那种必须在不确定性揭晓之前拍板的动作,用优化语言说叫 here-and-now 决策;第二阶段是不确定性参数实现之后,你还能做的补救动作,叫 wait-and-see 决策。
举个例子。一家便利店要在周一早上决定本周进货多少箱矿泉水,这是第一阶段,进价便宜但数量一旦定死就改不了。到了周三,天气热得离谱,实际需求出来了,发现库存不够,这时候只能去周边调货,调货价贵很多,这就是第二阶段。两个阶段加起来才是真实总成本。
这类问题最难的点在于:第二阶段的最优决策不是一个固定的数,而是一个“依赖需求长什么样”的函数。需求高就多调货,需求低就少调货。但在第一阶段的时点,你并不知道这个函数到底长什么样,所以只能用历史数据估计需求的分布,然后去优化期望意义上的总成本。这就是两阶段随机规划的基本套路。
1.2 一个具体场景:常规订购加两级补货
为了让模型不飘在空中,我固定一个具体场景,后面所有推导和代码都围绕它来。
第一阶段的常规订购量记为x,单位成本 c = 2;需求 ξ 实现之后,如果不够,可以走紧急补货通道 y,单位成本 d = 5;如果再不够,还有最后一档加急空运 z,单位成本 e = 8。显然 c < d < e,否则没人会在第一阶段囤货,模型就失去意义。需求的支持集假设在 [L, U] = [0, 20] 之间,这是很自然的物理约束,需求不可能为负,也不可能无限大。
于是第二阶段的最小成本函数长这样:
Q(x, ξ) = min_{y,z ≥ 0} d·y + e·z
s.t. x + y + z ≥ ξ
意思就是:你手里有 x 箱库存,需求来了之后,紧急补货 y 箱再加急 z 箱,怎么也得凑够需求量。因为补货成本和加急成本都是线性的,所以这个内层问题本质上是个很简单的小线性规划,理论上可以直接解。
但麻烦在后头:如果只知道一个近似的需求分布,而且这个分布本身可能不准,那“期望成本最小化”这句话就有点虚。万一真实分布和你的历史样本长得不太一样呢?这正是分布鲁棒优化的切入点。
1.3 为什么要引入Wasserstein距离来做模糊集
传统的随机规划假设需求分布 P 完全已知,或者用经验分布去近似。而纯鲁棒优化则把需求放进一个“最坏区间”里,完全不使用概率信息,结果往往保守到没法用。分布鲁棒优化踩在两者中间:你承认自己只知道一个“大概的分布”,然后围绕这个大概的分布画一个圈,让真实分布不管怎么晃都跑不出这个圈,最后在最坏的那个分布下做决策。
这个“圈”就是模糊集(ambiguity set)。画圈的方式有很多,可以用矩约束、KL散度、Wasserstein距离等。我推荐Wasserstein距离,原因有三:
第一,Wasserstein距离对分布之间的“位移”特别敏感,哪怕两个分布在某个点上差别不大,只要质量搬家搬得远,距离数值就会明显变大,这对风险控制很有用。
第二,Wasserstein球能给出有统计保证的结果。样本量越大,球的半径可以取得越小,真实分布落入球内的概率就有下界。
第三,也是最实际的,Wasserstein距离诱导出的模糊集在对偶推导时结构非常好,能转化成可解的标准凸优化问题。这一点是整个模型能落地到Matlab的关键。
生活化理解Wasserstein距离,就是“搬土成本”:把一种分布的形状变成另一种分布,至少要把多少概率质量搬运多远。距离越大,说明两个分布相差越远。我们圈出来的那个模糊集,就是所有“搬土成本不超过给定值 ε”的分布的集合。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模型数学化:目标函数、模糊集与线性决策
2.1 完整数学模型
把上面的库存场景写成数学形式,就是:
min_{x≥0, y(·), z(·)} c·x + sup_{P ∈ B_ε} E_P[ d·y(ξ) + e·z(ξ) ]
其中模糊集定义为:
B_ε = { P ∈ P(Ξ) : W(P, P
