1. 分布鲁棒优化与Wasserstein距离的基本概念
在现实世界的决策问题中,我们常常面临数据不确定性的挑战。传统随机规划方法假设数据服从某个已知分布,但这种假设往往过于理想化。分布鲁棒优化(Distributionally Robust Optimization, DRO)提供了一种更稳健的解决方案——它不假设精确的分布,而是考虑一个分布集合(不确定性集合),并在这个集合中寻找最坏情况下的最优决策。
Wasserstein距离作为概率分布之间的一种度量方式,近年来在DRO领域大放异彩。它衡量的是将一个分布"搬运"成另一个分布所需的最小"工作量",这种直观的几何解释使其特别适合构建分布不确定性集合。与传统的矩约束方法相比,基于Wasserstein距离的不确定性集合能更精细地控制分布的扰动范围。
提示:Wasserstein距离也被称为"推土机距离"(Earth Mover's Distance),想象把一堆沙子从一个形状移动到另一个形状所需的最小工作量。
两阶段分布鲁棒模型是DRO的一个重要分支,它将决策过程分为两个阶段:
- 第一阶段:在观察到随机变量实现之前做出"此时此地"决策
- 第二阶段:在观察到随机变量实现后做出"等待观望"决策
这种结构特别适合具有时间维度的决策问题,如库存管理、投资组合优化等。而线性决策规则(Linear Decision Rule)则是一种常用的近似方法,它将第二阶段的决策表示为随机变量的线性函数,大大降低了问题的复杂度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Wasserstein距离的数学表达与计算
Wasserstein距离的精确定义需要一些测度论的基础。对于两个概率分布P和Q,p阶Wasserstein距离定义为:
W_p(P,Q) = (inf_{γ∈Γ(P,Q)} ∫_{X×X} d(x,y)^p dγ(x,y))^
其中Γ(P,Q)是所有边缘分布为P和Q的联合分布的集合,d(x,y)是基础空间上的距离函数。在实际应用中,最常用的是p=1和p=2的情况。
对于离散分布,Wasserstein距离的计算可以转化为一个线性规划问题。假设我们有两个离散分布P=∑{i=1}^n a_iδ和Q=∑{j=1}^m b_jδ,其中δ_x表示在x处的点质量,那么1-Wasserstein距离可以通过解以下线性规划得到:
min_{π≥0} ∑{i,j} π d(x_i,y_j)
s.t. ∑{j} π = a_i ∀i
∑{i} π = b_j ∀j
这个线性规划可以高效求解,使得Wasserstein距离在实际应用中非常实用。
在Matlab中,我们可以使用以下代码片段计算两个离散分布之间的Wasserstein距离:
matlab复制function w_dist = wasserstein_distance(P, Q, cost_matrix)
% P和Q是离散概率分布(列向量)
% cost_matrix是成本矩阵,cost_matrix(i,j) = d(x_i,y_j)
n = length(P);
m = length(Q);
% 构造线性规划问题
f = cost_matrix(:);
Aeq = [kron(ones(1,m), eye(n)); kron(eye(m), ones(1,n))];
beq = [P; Q];
lb = zeros(n*m,1);
% 求解线性规划
options = optimoptions('linprog','Display','none');
pi_vec = linprog(f,[],[],Aeq,beq,lb,[],[],options);
% 计算Wasserstein距离
w_dist = f' * pi_vec;
end
3. 两阶段分布鲁棒模型的对偶转化
两阶段分布鲁棒优化问题的一般形式可以表示为:
min_x {c^T x + sup_{P∈P} E_P[Q(x,ξ)]}
s.t. x ∈ X
其中Q(x,ξ)是第二阶段的优化问题:
Q(x,ξ) = min_y
这里P是基于Wasserstein距离构建的不确定性集合。直接求解这个问题非常困难,因此我们需要利用对偶理论将其转化为可处理的形式。
对于基于Wasserstein距离的不确定性集合P = {P : W(P,P̂) ≤ ε},其中P̂是经验分布,ε是半径,我们可以利用强对偶性将sup部分转化为:
sup_{P∈P} E_P[Q(x,ξ)] = inf_{λ≥0} {λε + 1/N ∑{i=1}^N sup [Q(x,ξ) - λd(ξ,ξ̂_i)]}
这个转化是问题的关键,它将一个无限维的优化问题转化为有限维的问题。在实际应用中,我们通常假设Q(x,ξ)关于ξ是凸的,这样内层的sup问题可以通过求解一阶条件来解决。
对于线性决策规则的特殊情况,我们可以进一步简化问题。假设第二阶段的决策y是随机变量ξ的线性函数:y = y_0 + Yξ,那么问题可以转化为:
min_{x,y_0,Y} {c^T x + sup_{P∈P} E_P[q^T (y_0 + Yξ)]}
s.t. W(y_0 + Yξ) ≥ h(ξ) - T(ξ)x, ∀ξ ∈ Ξ
这种表示虽然看起来简单,但由于需要满足对所有ξ∈Ξ的约束,实际上仍然具有挑战性。我们需要利用鲁棒优化的技巧来处理这些半无限约束。
4. Matlab实现的关键步骤与代码解析
现在我们来讨论如何在Matlab中实现这个两阶段分布鲁棒模型。我们将分步骤讲解关键代码实现。
4.1 数据准备与参数设置
首先,我们需要定义问题的基本参数:
matlab复制% 第一阶段决策变量维度
n_x = 3;
% 第二阶段决策变量维度
n_y = 2;
% 随机变量维度
n_xi = 4;
% 样本数量
N = 100;
% Wasserstein球半径
epsilon = 0.1;
% 生成样本数据
rng(1); % 设置随机种子保证可重复性
xi_samples = randn(n_xi, N); % 假设随机变量服从正态分布
% 定义成本向量
c = rand(n_x, 1); % 第一阶段成本
q = rand(n_y, 1); % 第二阶段成本
% 定义约束矩阵
T = rand(n_xi, n_x); % 第一阶段决策对第二阶段约束的影响
W = rand(n_xi, n_y); % 第二阶段决策的约束矩阵
h = rand(n_xi, 1); % 第二阶段约束的右端项
4.2 对偶问题的构建与求解
接下来,我们构建对偶问题并求解:
matlab复制% 定义优化变量
x = sdpvar(n_x, 1); % 第一阶段决策
lambda = sdpvar(1); % 对偶变量
tau = sdpvar(N, 1); % 辅助变量
% 构建目标函数
objective = c'*x + lambda*epsilon + (1/N)*sum(tau);
% 构建约束
constraints = [lambda >= 0];
for i = 1:N
xi_i = xi_samples(:,i);
% 定义内部最大化问题的变量
xi = sdpvar(n_xi,1);
% 定义第二阶段决策规则(线性决策规则)
y0 = sdpvar(n_y,1);
Y = sdpvar(n_y, n_xi);
y = y0 + Y*xi;
% 内部最大化问题的目标
inner_obj = q'*y - lambda*norm(xi - xi_i, 2);
% 内部问题的约束
inner_constraints = [W*y >= h - T*x];
% 使用强对偶性转化
[dual_obj, dual_constraints] = dualize(inner_obj, inner_constraints);
% 添加约束
constraints = [constraints, tau(i) >= dual_obj, dual_constraints];
end
% 求解优化问题
options = sdpsettings('verbose',0,'solver','gurobi');
optimize(constraints, objective, options);
% 获取最优解
x_opt = value(x);
obj_opt = value(objective);
4.3 结果分析与验证
求解完成后,我们需要分析结果的鲁棒性:
matlab复制% 计算在样本分布下的目标值
sample_obj = c'*x_opt;
for i = 1:N
xi = xi_samples(:,i);
% 求解第二阶段问题
y = sdpvar(n_y,1);
constraints = [W*y >= h - T*x_opt];
optimize(constraints, q'*y, options);
sample_obj = sample_obj + q'*value(y)/N;
end
% 计算在最坏情况分布下的目标值
worst_case_obj = c'*x_opt;
for i = 1:N
% 寻找最坏情况的xi
xi = sdpvar(n_xi,1);
y = sdpvar(n_y,1);
constraints = [W*y >= h - T*x_opt];
objective_inner = q'*y;
optimize(constraints, -objective_inner, options);
worst_case_obj = worst_case_obj + q'*value(y)/N;
end
fprintf('最优第一阶段决策:\n');
disp(x_opt);
fprintf('对偶问题目标值: %.4f\n', obj_opt);
fprintf('样本分布下目标值: %.4f\n', sample_obj);
fprintf('最坏分布下目标值: %.4f\n', worst_case_obj);
5. 实际应用中的注意事项与性能优化
在实际应用中,基于Wasserstein距离的两阶段分布鲁棒模型可能会遇到几个关键挑战:
5.1 计算复杂度问题
随着样本量N的增加,问题的规模会线性增长。对于大规模问题,可以考虑以下优化策略:
- 样本缩减技术:使用k-means等方法对样本进行聚类,用聚类中心代表原始样本
- 随机优化方法:使用随机梯度下降等算法处理大规模问题
- 并行计算:将对不同样本的处理分配到多个计算核心
5.2 Wasserstein半径ε的选择
ε的选择对模型的保守性有重要影响。ε太大,解会过于保守;ε太小,可能无法提供足够的鲁棒性。实践中可以:
- 使用交叉验证方法选择ε
- 基于统计理论计算ε的合理范围
- 进行敏感性分析,观察不同ε下解的变化
5.3 线性决策规则的局限性
虽然线性决策规则简化了问题,但在某些非线性问题中可能导致保守的解。可以考虑:
- 分段线性决策规则
- 多项式决策规则
- 基于场景的决策规则
在Matlab实现中,我们可以使用更高级的建模技巧来提高效率:
matlab复制% 使用矩阵形式表示约束,避免循环
Y_all = sdpvar(n_y, n_xi, N); % 为每个样本创建决策规则参数
y_all = reshape(y0 + Y_all.*reshape(xi_samples,1,n_xi,N), n_y, N);
% 矩阵形式的约束
constraints = [lambda >= 0];
constraints = [constraints, W*y_all >= h - T*x_opt*ones(1,N)];
% 更高效的目标函数计算
inner_objs = sum(q'*y_all) - lambda*sum(sqrt(sum((xi_samples - xi_samples).^2,1)));
constraints = [constraints, tau >= inner_objs'];
6. 案例研究:供应链库存管理应用
让我们考虑一个具体的供应链库存管理问题,展示如何应用这个框架。
6.1 问题描述
一个零售商需要决定初始库存水平x(第一阶段决策),然后根据实际需求ξ调整补货量y(第二阶段决策)。目标是最小化总成本,包括:
- 初始库存成本:c·x
- 补货成本:q·y
- 缺货惩罚:max(ξ - x - y, 0)
需求ξ不确定,我们有一组历史需求数据作为经验分布。
6.2 模型构建
我们可以将这个问题表述为:
min_x {c·x + sup_{P∈P} E_P[Q(x,ξ)]}
Q(x,ξ) = min_y
其中s是缺货量,p是单位缺货惩罚成本。
6.3 Matlab实现
matlab复制% 参数设置
c = 0.5; % 单位库存成本
q = 1.2; % 单位补货成本
p = 3.0; % 单位缺货惩罚
N = 50; % 样本量
epsilon = 0.2; % Wasserstein半径
% 生成需求样本(假设服从泊松分布)
lambda_poisson = 20;
xi_samples = poissrnd(lambda_poisson, 1, N);
% 构建优化问题
x = sdpvar(1); % 初始库存
lambda = sdpvar(1);
tau = sdpvar(N,1);
objective = c*x + lambda*epsilon + (1/N)*sum(tau);
constraints = [lambda >= 0, x >= 0];
for i = 1:N
xi_i = xi_samples(i);
xi = sdpvar(1);
y = sdpvar(1);
s = sdpvar(1);
% 内部最大化问题
inner_obj = q*y + p*s - lambda*abs(xi - xi_i);
inner_constraints = [y + x + s >= xi, y >= 0, s >= 0];
% 对偶转化
[dual_obj, dual_constraints] = dualize(inner_obj, inner_constraints);
constraints = [constraints, tau(i) >= dual_obj, dual_constraints];
end
% 求解
optimize(constraints, objective, options);
x_opt = value(x);
% 结果分析
fprintf('最优初始库存水平: %.2f\n', x_opt);
6.4 结果讨论
通过改变ε值,我们可以观察到库存策略的鲁棒性变化:
- 当ε=0(不考虑分布不确定性)时,模型退化为传统的样本平均近似(SAA)方法
- 随着ε增大,最优初始库存水平会提高,反映出更保守的策略
- 在合理的ε范围内,这种方法能有效平衡成本和控制缺货风险
在实际业务场景中,决策者可以根据风险偏好调整ε值,获得不同保守程度的库存策略。
