1. 两阶段鲁棒优化与CCG算法概述
工厂选址与生产计划调整的决策问题,本质上是一个典型的两阶段鲁棒优化问题。第一阶段需要确定工厂选址等长期决策(x变量),第二阶段则根据实际需求情况(y变量)调整生产计划。这种问题最大的挑战在于需求不确定性——我们无法预知未来的确切需求,但又不希望因为过度保守而付出过高成本。
列约束生成法(Column-and-Constraint Generation, CCG)正是为解决这类问题而生的利器。它通过主问题(Master Problem)和子问题(Subproblem)的交替求解,逐步逼近最优解。主问题负责在当前已知的恶劣场景下寻找最优决策,子问题则负责发掘新的、可能更恶劣的场景。这种"打地鼠"式的策略,使得我们无需一次性考虑所有可能的极端情况,大大降低了计算复杂度。
关键优势:CCG算法将原本需要同时处理无穷多场景的NP难问题,转化为一系列可操作的线性规划问题,在保证鲁棒性的同时维持了计算可行性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法实现核心架构
2.1 主问题构建与动态约束管理
主问题的核心思想是在已知的恶劣场景集合下,寻找成本最低的决策方案。MATLAB实现中,我们使用YALMIP工具箱定义优化变量和约束:
matlab复制%% 主问题初始化
MP = optimizer([], obj, sdpsettings('solver','cplex'), u_real, {x, y, obj});
iter = 1;
LB = -inf; % 下界初始化为负无穷
UB = inf; % 上界初始化为正无穷
cutCount = 0; % 动态约束计数器
while abs(UB - LB) > 1e-3
% 决策变量定义
x = sdpvar(n,1);
y = sdpvar(m,1);
eta = sdpvar(1); % 辅助变量,表示最坏情况下的第二阶段成本
constraints = [x >= 0, y >= 0];
% 动态添加历史约束
for k = 1:cutCount
constraints = [constraints, A{k}*y + B{k}*x <= d{k}];
end
