1. 项目背景与核心概念
在现实世界的决策问题中,不确定性无处不在。传统随机规划方法假设我们完全了解概率分布,但这往往过于理想化。分布鲁棒优化(DRO)应运而生,它允许概率分布在一定不确定性集合内变化,寻求最坏情况下的最优解。
Wasserstein距离作为概率分布之间的度量工具,因其良好的数学性质和直观解释能力,成为构建不确定性集合的理想选择。它本质上衡量了将一个分布"搬运"成另一个分布所需的最小"工作量",其中"工作量"取决于两个分布之间点的距离和转移的质量。
两阶段决策模型则完美刻画了"先观察后决策"的现实场景:第一阶段决策在不确定性揭示前做出,第二阶段决策则根据已实现的不确定性进行调整。这种模型结构在供应链管理、金融投资等领域有广泛应用。
2. 模型构建与数学表述
2.1 基础问题设定
考虑如下两阶段线性决策问题:
code复制min_x c^T x + E_P[Q(x,ξ)]
s.t. Ax ≤ b
x ≥ 0
其中Q(x,ξ)是第二阶段价值函数,ξ为随机参数,P为其真实分布(未知)。
2.2 Wasserstein模糊集的构建
我们采用1-Wasserstein距离构建模糊集:
code复制D(P,P0) ≤ ε
其中P0为参考分布(如经验分布),ε为半径参数。Wasserstein距离的具体定义为:
code复制D(P,Q) = inf_π ∫||ξ-ζ|| π(dξ,dζ)
其中π是P和Q的联合分布,边缘分布分别为P和Q。
2.3 对偶转化技术
原始分布鲁棒问题通常是无限维的,难以直接求解。通过对偶理论,我们可以将其转化为有限维优化问题。关键步骤包括:
- 对第二阶段问题取对偶
- 交换min-max顺序
- 应用强对偶定理
最终得到的对偶问题形式为:
code复制min_x c^T x + sup_{P:D(P,P0)≤ε} E_P[Q(x,ξ)]
可进一步转化为:
code复制min_x c^T x + λε + 1/N Σ_{i=1}^N sup_ξ [Q(x,ξ) - λ||ξ-ξ_i||]
3. MATLAB实现详解
3.1 环境准备与数据生成
首先需要准备MATLAB环境,建议使用R2020b或更新版本。关键工具箱包括:
- Optimization Toolbox(用于线性规划求解)
- Statistics and Machine Learning Toolbox(用于分布处理)
matlab复制% 生成参考分布样本
rng(1); % 固定随机种子
N = 100; % 样本量
d = 2; % 随机变量维度
xi_samples = randn(N,d); % 生成正态分布样本
3.2 主问题求解框架
构建主问题求解函数:
matlab复制function [x_opt, obj_val] = solve_dro(c, A, b, xi_samples, epsilon)
[m, n] = size(A);
N = size(xi_samples, 1);
cvx_begin
variables x(n) lambda
variable phi(N)
minimize(c'*x + lambda*epsilon + sum(phi)/N)
subject to
A*x <= b
x >= 0
lambda >= 0
for i = 1:N
phi(i) >= evaluate_subproblem(x, lambda, xi_samples(i,:)');
end
cvx_end
x_opt = x;
obj_val = cvx_optval;
end
3.3 子问题求解实现
子问题求解是算法的核心,需要高效实现:
matlab复制function val = evaluate_subproblem(x, lambda, xi_i)
% 定义第二阶段问题的参数
q = [-1; -1]; % 第二阶段目标系数
W = [1 -1; -1 1]; % 第二阶段约束矩阵
h = [3; 3]; % 第二阶段右侧项
cvx_begin quiet
variable xi(2)
maximize(q'*x - lambda*norm(xi - xi_i))
subject to
W*x + xi <= h
cvx_end
val = cvx_optval;
end
4. 关键参数分析与调优
4.1 Wasserstein半径ε的选择
ε控制模型的保守程度:
- ε→0:退化为传统随机规划
- ε→∞:过于保守,解可能不可行
建议采用交叉验证法确定ε:
- 将数据分为训练集和验证集
- 在训练集上求解不同ε对应的解
- 在验证集上评估解的鲁棒性能
- 选择在验证集上表现最好的ε
4.2 计算效率优化
原始实现可能计算较慢,可采用以下加速策略:
- 并行化子问题求解(使用parfor)
- 缓存已计算的子问题结果
- 采用warm-start技术初始化变量
matlab复制% 并行化版本
phi = zeros(N,1);
parfor i = 1:N
phi(i) = evaluate_subproblem(x, lambda, xi_samples(i,:)');
end
5. 实际应用案例
5.1 供应链库存管理
考虑一个两阶段库存决策问题:
- 第一阶段:决定初始库存水平x
- 第二阶段:根据实际需求ξ调整库存
matlab复制% 供应链特定参数设置
c = 1; % 单位库存成本
q = [0.5; 0.5]; % 第二阶段调整成本
W = [1; -1]; % 库存平衡约束
h = [100; 100]; % 库存容量限制
% 需求样本生成
demand_samples = 50 + 10*randn(N,1);
5.2 结果分析与比较
比较DRO与SP(随机规划)的解决方案:
matlab复制% 随机规划解
[x_sp, obj_sp] = solve_sp(c, A, b, xi_samples);
% 分布鲁棒解
[x_dro, obj_dro] = solve_dro(c, A, b, xi_samples, 0.5);
% 在测试集上评估
test_samples = generate_test_samples();
[cost_sp, cost_dro] = evaluate_on_test(x_sp, x_dro, test_samples);
典型结果显示,DRO方案在最坏情况下表现更好,虽然平均成本可能略高。
6. 常见问题与调试技巧
6.1 数值不稳定问题
当ε过小时,可能出现数值问题:
- 增加λ的下界(如λ≥1e-6)
- 对输入数据进行标准化
6.2 无可行解情况
可能原因:
- ε设置过大
- 原始问题约束过紧
调试建议:
- 检查参考分布是否合理
- 逐步增大ε观察解的变化
- 放松部分非关键约束
6.3 性能瓶颈分析
使用MATLAB Profiler识别耗时环节:
matlab复制profile on
[x_opt, obj_val] = solve_dro(...);
profile viewer
通常子问题求解是主要耗时点,可考虑:
- 减少样本量N(使用重要性采样)
- 采用近似求解方法
7. 模型扩展与进阶方向
7.1 非线性决策规则
当前模型使用线性决策规则,可扩展为:
- 分段线性决策
- 多项式决策规则
matlab复制% 二次决策规则示例
cvx_begin
variable x(n)
variable Q(n,n) symmetric
% ...其他约束...
for i = 1:N
phi(i) >= q'*(x + Q*xi_samples(i,:)') - lambda*norm(xi_samples(i,:)')
end
cvx_end
7.2 动态多阶段扩展
将两阶段模型推广到多阶段:
- 使用嵌套Wasserstein模糊集
- 应用动态规划原理
7.3 数据驱动半径选择
自动化ε选择方法:
- 基于bootstrap的估计
- 贝叶斯优化方法
- 对抗性验证技术
matlab复制% Bootstrap估计示例
epsilon_vals = zeros(B,1);
for b = 1:B
bootstrap_sample = datasample(xi_samples, N);
epsilon_vals(b) = compute_wasserstein(xi_samples, bootstrap_sample);
end
epsilon = quantile(epsilon_vals, 0.9);
