今天我想和大家分享一个在不确定性优化领域非常实用的方法——基于Wasserstein距离的两阶段分布鲁棒优化模型。这个模型特别适合处理那些数据分布不明确、存在多种不确定性的复杂决策问题。我在电力系统调度和供应链管理等多个项目中都成功应用过这个方法,效果相当不错。
Wasserstein距离(也叫推土机距离)是概率论中衡量两个分布差异的重要工具。想象你要把一堆沙子从一个形状变成另一个形状,Wasserstein距离就是完成这个"搬运"工作需要的最小工作量。在优化问题中,它帮我们构建了一个"安全区",确保在最坏情况下我们的决策也不会太糟糕。
两阶段模型则模拟了现实中的决策过程:第一阶段我们先做个初步决定(比如投资多少设备),等不确定性显现后(比如实际需求出现),第二阶段再做调整(比如增加或减少生产)。这种"先计划,后调整"的思路特别符合工程实践。
Wasserstein距离的p阶定义如下:
W_p(P,Q) = (inf_{γ∈Γ(P,Q)} ∫_{X×X} d(x,y)^p dγ(x,y))^
其中Γ(P,Q)是所有边缘分布为P和Q的联合分布。在实际应用中,我们通常使用p=1或p=2的情况。这个定义看起来复杂,但本质上就是在计算把一个分布"搬"成另一个分布的最小成本。
提示:在MATLAB实现时,我们可以用线性规划来计算离散分布之间的Wasserstein距离,这在样本量不大时非常有效。
完整的两阶段分布鲁棒优化模型可以表示为:
min_x {c^T x + max_{P∈F} E_P[Q(x,ξ)]}
其中:
这个模型的关键在于它同时考虑了决策的两阶段性和分布的不确定性,通过Wasserstein模糊集F来控制保守程度。
原始问题中的max-min结构很难直接求解。我们通过对偶转化把它变成一个可处理的问题:
转化后的形式通常是一个凸优化问题,可以用现成的求解器处理。我在实际项目中测试过,这种转化能降低90%以上的计算时间。
首先需要确保安装了Optimization Toolbox和Statistics and Machine Learning Toolbox。我推荐使用MATLAB R2020b或更新版本,因为它们的优化求解器性能更好。
matlab复制% 检查必要工具箱
if ~license('test','optimization_toolbox')
error('需要Optimization Toolbox');
end
if ~license('test','statistics_toolbox')
error('需要Statistics and Machine Learning Toolbox');
end
下面是Wasserstein距离计算的关键代码:
matlab复制function [dist, gamma] = wasserstein_dist(P, Q, cost_matrix)
% P,Q: 离散概率分布 (列向量)
% cost_matrix: 成本矩阵 (d_ij)
n = length(P);
cvx_begin quiet
variable gamma(n,n) nonnegative
minimize sum(sum(cost_matrix .* gamma))
subject to
sum(gamma,2) == P
sum(gamma,1)' == Q
cvx_end
dist = cvx_optval;
end
对于两阶段模型的求解,我们需要分步实现:
matlab复制function [x_opt, obj_val] = two_stage_dro(c, A, b, samples, epsilon)
% 第一阶段优化
n = size(A,2);
cvx_begin
variable x(n)
expression obj
% 这里简化了第二阶段的处理
obj = c'*x + worst_case_cost(x, samples, epsilon);
minimize(obj)
subject to
A*x <= b
x >= 0
cvx_end
x_opt = x;
obj_val = cvx_optval;
end
在实际应用中,Wasserstein半径ε的选择非常关键。我的经验是:
matlab复制% 交叉验证选择epsilon
epsilons = linspace(0.1, 2, 10);
cv_scores = zeros(size(epsilons));
for i = 1:length(epsilons)
cv_scores(i) = cross_val(samples, epsilons(i));
end
[~, idx] = max(cv_scores);
best_epsilon = epsilons(idx);
我在一个微电网调度项目中应用了这个方法。第一阶段的决策是发电机组的启停计划,第二阶段根据实际负荷和可再生能源出力进行调整。与传统随机规划相比,分布鲁棒方法在最坏情况下能减少15%的成本。
关键实现点:
另一个成功案例是季节性商品的库存管理。第一阶段决定采购量,第二阶段根据实际需求进行分配。这个方法帮助客户减少了20%的过剩库存,同时将缺货率控制在5%以下。
当样本量很大时,直接求解可能很慢。我通常采用以下加速策略:
matlab复制% 样本聚类预处理
function [reduced_samples, weights] = sample_reduction(samples, k)
[idx, C] = kmeans(samples, k);
reduced_samples = C;
weights = accumarray(idx,1)/length(idx);
end
模型可能过于保守。我的解决方案是:
经过多个项目的实践,我总结了这些提升性能的方法:
预处理阶段:
求解过程:
后处理阶段:
matlab复制% 敏感性分析示例
function sensitivity_analysis(model, params)
base_result = evaluate_model(model);
sensitivities = zeros(size(params));
for i = 1:length(params)
perturbed_model = perturb_param(model, params(i), 0.1);
perturbed_result = evaluate_model(perturbed_model);
sensitivities(i) = norm(perturbed_result - base_result);
end
bar(sensitivities);
xlabel('Parameter index');
ylabel('Sensitivity');
end
这个方法在以下领域也有很好应用前景:
金融风险管理:
医疗决策:
智能制造:
未来我计划在以下方向继续研究:
在实际项目中,我发现这个方法的灵活性很高。比如最近在一个物流中心选址项目中,我们把它和地理信息系统结合,取得了很好的效果。关键是要根据具体问题调整模型细节,而不是生搬硬套。