1. 项目背景与核心价值
两阶段鲁棒优化问题在电力系统调度、物流规划、金融风险管理等领域有着广泛的应用。这类问题的核心挑战在于:第一阶段决策需要在不完全了解未来不确定参数的情况下做出,而第二阶段决策则需根据实际发生的不确定参数进行调整。传统随机规划方法依赖于精确的概率分布假设,而鲁棒优化则仅需不确定参数的波动范围,更适合实际工程应用。
列约束生成法(Column-and-Constraint Generation, CCG)是求解两阶段鲁棒优化问题的有效算法。它通过主问题(Master Problem)和子问题(Subproblem)的迭代求解,逐步逼近最优解。与传统的Benders分解相比,CCG在每次迭代中向主问题添加变量和约束,而非仅添加约束,这使得算法收敛速度更快。
2. 算法原理详解
2.1 问题标准形式
考虑如下两阶段鲁棒优化问题:
min_{x} c^T x + max_{u∈U} min_{y∈F(x,u)} d^T y
其中:
- x为第一阶段决策变量
- u为不确定参数,属于不确定集合U
- y为第二阶段决策变量
- F(x,u)定义了给定x和u时y的可行域
2.2 CCG算法流程
-
初始化:
- 设置上界UB=+∞,下界LB=-∞
- 生成初始场景集合Ξ=∅
- 设定收敛阈值ε>0
-
主问题求解:
min c^T x + η
s.t. η ≥ d^T y^l, ∀l∈Ξ
A x ≥ b
T^l x + W y^l ≥ h^l, ∀l∈Ξ
(x, y^l, η)为决策变量 -
子问题求解:
给定主问题解x*,求解:
max_{u∈U} min_{y} d^T y
s.t. T(u) x* + W y ≥ h(u) -
收敛判断:
- 更新上界UB=min(UB, c^T x* + obj_sub)
- 更新下界LB=max(LB, c^T x* + η*)
- 如果(UB-LB)/UB ≤ ε,算法终止
- 否则,将子问题解对应的场景加入Ξ,返回步骤2
3. MATLAB实现详解
3.1 主问题实现
matlab复制function [x_opt, eta_opt, LB] = solveMasterProblem(c, d, A, b, Xi, T_cell, W_cell, h_cell)
% 创建优化模型
model = rsome('CCG_Master');
% 决策变量
x = model.decision(size(c)); % 第一阶段变量
eta = model.decision; % 辅助变量
y = cell(length(Xi), 1); % 第二阶段变量集合
% 目标函数
model.min(c'*x + eta);
% 第一阶段约束
model.append(A*x >= b);
% 第二阶段约束
for l = 1:length(Xi)
y{l} = model.decision(size(d));
model.append(eta >= d'*y{l});
model.append(T_cell{l}*x + W_cell{l}*y{l} >= h_cell{l});
end
% 求解
solution = model.solve();
% 提取结果
x_opt = solution.eval(x);
eta_opt = solution.eval(eta);
LB = solution.objVal;
end
3.2 子问题实现
matlab复制function [obj_sub, u_opt, y_opt] = solveSubProblem(x_star, d, U, T_func, W, h_func)
% 创建鲁棒模型
model = rsome('CCG_Sub');
% 不确定参数
u = model.random(size(U.center));
model.uncertain(u in U); % 定义不确定集合
% 第二阶段变量
y = model.decision(size(d));
% 约束
model.append(T_func(u)*x_star + W*y >= h_func(u));
% 目标
model.maxmin(d'*y, y);
% 求解
solution = model.solve();
% 提取结果
obj_sub = solution.objVal;
u_opt = solution.eval(u);
y_opt = solution.eval(y);
end
3.3 主程序框架
matlab复制function [x_opt, UB, LB, iter] = CCG_Algorithm(c, d, A, b, U, T_func, W, h_func, epsilon, max_iter)
% 初始化
UB = inf;
LB = -inf;
Xi = {};
T_cell = {};
W_cell = {};
h_cell = {};
iter = 0;
while (UB - LB)/UB > epsilon && iter < max_iter
iter = iter + 1;
% 求解主问题
[x_star, eta_star, LB] = solveMasterProblem(c, d, A, b, Xi, T_cell, W_cell, h_cell);
% 求解子问题
[obj_sub, u_opt, y_opt] = solveSubProblem(x_star, d, U, T_func, W, h_func);
% 更新上界
UB = min(UB, c'*x_star + obj_sub);
% 添加新场景
Xi{end+1} = u_opt;
T_cell{end+1} = T_func(u_opt);
h_cell{end+1} = h_func(u_opt);
W_cell{end+1} = W;
fprintf('Iter %d: UB=%.4f, LB=%.4f, Gap=%.2f%%\n', ...
iter, UB, LB, 100*(UB-LB)/UB);
end
x_opt = x_star;
end
4. 关键实现技巧
4.1 不确定集合的处理
常见的不确定集合形式包括:
- 盒式不确定集:U =
- 椭球不确定集:U = {u | (u-u0)'Σ^{-1}(u-u0) ≤ Ω^2}
- 多面体不确定集:U =
在MATLAB中,可以使用RSOME或YALMIP工具箱定义这些集合:
matlab复制% 盒式不确定集示例
U.center = u0;
U.radius = Gamma;
% 椭球不确定集示例
U.center = u0;
U.shape = Sigma;
U.scale = Omega;
4.2 对偶转换技巧
子问题中的max-min问题可以通过对偶转换为单层max问题:
原始子问题:
max_{u∈U} min_{y} d^T y
s.t. T(u)x + Wy ≥ h(u)
对偶转换后:
max_{u∈U, λ≥0} (h(u) - T(u)x)^T λ
s.t. W^T λ = d
这种转换可以显著提高求解效率,特别是在第二阶段问题为线性时。
4.3 加速收敛策略
- 热启动(Warm Start):使用前一次迭代的解作为当前迭代的初始点
- 场景筛选:定期检查并移除冗余场景,控制主问题规模
- 并行求解:对于大规模问题,可以并行求解多个子问题场景
5. 应用案例:微电网能量管理
5.1 问题描述
考虑一个包含光伏发电、蓄电池和负载的微电网系统:
- 第一阶段决策:日前发电计划
- 不确定性:光伏出力和负载需求
- 第二阶段决策:实时平衡调整
目标是最小化总运行成本(发电成本+不平衡惩罚)。
5.2 MATLAB实现
matlab复制% 参数设置
c = [generator_cost]; % 发电成本系数
d = [penalty_cost]; % 惩罚成本系数
A = [capacity_constraints]; % 机组约束
b = [demand_forecast]; % 预测负荷
% 不确定集合定义
U.center = [pv_forecast; load_forecast];
U.radius = [pv_uncertainty; load_uncertainty];
% 约束函数
T_func = @(u) [generation_cons(u)];
h_func = @(u) [balance_cons(u)];
% 算法参数
epsilon = 1e-3;
max_iter = 20;
% 运行CCG算法
[x_opt, UB, LB, iter] = CCG_Algorithm(c, d, A, b, U, T_func, W, h_func, epsilon, max_iter);
5.3 结果分析
典型收敛过程:
code复制Iter 1: UB=1520.4, LB=980.2, Gap=35.54%
Iter 2: UB=1423.7, LB=1120.5, Gap=21.30%
Iter 3: UB=1385.2, LB=1250.8, Gap=9.70%
Iter 4: UB=1362.4, LB=1320.3, Gap=3.09%
Iter 5: UB=1350.8, LB=1345.2, Gap=0.41%
6. 性能优化建议
- 稀疏矩阵利用:对于大规模问题,使用稀疏矩阵存储约束矩阵
- 求解器选择:根据问题特性选择合适求解器:
- 小规模问题:MATLAB内置linprog
- 中大规模问题:Gurobi或CPLEX
- 整数规划问题:使用分支定界法
- 预处理:识别并消除冗余约束,简化问题规模
- 参数调优:调整收敛阈值ε和最大迭代次数平衡精度与效率
7. 常见问题排查
-
算法不收敛:
- 检查不确定集合U是否合理
- 验证约束是否互相矛盾
- 尝试调整收敛阈值
-
内存不足:
- 使用稀疏矩阵
- 实施场景筛选策略
- 考虑分布式计算
-
求解时间过长:
- 检查问题规模,必要时简化模型
- 尝试不同的求解器
- 使用并行计算加速子问题求解
-
结果不鲁棒:
- 扩大不确定集合范围
- 检查约束是否完整反映实际问题
- 验证目标函数是否合理
8. 扩展应用方向
- 多阶段鲁棒优化:将CCG扩展到三阶段及以上问题
- 数据驱动鲁棒优化:结合机器学习方法构建不确定集合
- 分布式鲁棒优化:处理大规模分布式系统问题
- 整数鲁棒优化:处理包含整数变量的复杂问题