两阶段鲁棒优化的 Benders分解与行列生成(C&CG) 算法

行列生成算法(CCG)的基本思想是将问题分解为一个主问题(Master Problem)和一个子问题(Subproblem)。主问题包含小部分原始决策变量,而子问题通常包含大多数决策变量。主问题的目标是生成一个合理的子问题,以便在子问题中生成一些列(或变量),这些列会在主问题中加入,并优化主问题。这个过程迭代进行,直到找到最优解决方案。

行列生成算法通常用于解决那些具有大规模整数规划问题的情况,由于传统的整数规划方法效率较低,这种方法通过将问题分解成子问题来减小问题规模,从而加速了求解过程。

1. 两阶段鲁棒优化与Benders对偶切平面方法

本文讨论的一阶段与二阶段的问题均为线性规划问题,且不确定集为有限离散集(finite discrete set)或多面体集(polyhedron)。令y为一阶段决策变量,x为二阶段决策变量。不确定集μ为离散集或多面体集,则二阶段鲁棒优化的一般形式(加粗的字母表示向量形式)一阶段问题为:

其中,F(x,u)为二阶段问题,如下:

即一阶段问题中不考虑不确定性,做出决策。之后将一阶段的变量y作为常数传入二阶段问题进行求解。这只是建模的思路,想要得到最优解还需要对模型做一些变换及用到算法。此时二阶段问题为max-min问题,我们根据对偶理论将内层的min问题做一次变换,令π为对偶变量,则转换后的二阶段问题如下,这个问题也是Bender对偶方法的子问题。

此时的二阶段问题为max问题,但注意不确定参数u与对偶变量π 均为决策变量,目标函数中存在二次项,该问题为双线性(Bilinear)问题,该问题通常为NP-Hard问题。双线性问题的求解可以通过近似方法,也可以利用不确定集的特性将其等价为混合整数规划(Mixed Integer Linear Problem, MILP)问题进行紧缺求解。这转换过程依赖于一个重要的性质:如果U是多面体集,则U和π合二为一的最优解总是在其各自的可行集中取极值点,本文后续的实例中也会用到类似的转化方法。我们在此处直接将二阶段问题看作可以求解,则Benders对偶切平面算法的流程如下:

Benders-dual Cutting Plane Algorithm1. 设定目标值上界UB=+∞, 下界LB=-∞,当前迭代次数k=0。2. 求解以下主问题(Master Problem, MP):3. 求解以下子问题(SubProblem,SP):4. 如果UB-LB≤ε,其中ε为预先设定好的可以接受的偏差,则返回当前的目标值和最优解y,并退出循环。否则设定k=k+1,将以下约束添加到主问题MP1中:并返回第2步。

2. CCG算法

为了使得算法便于理解,我们首先考虑当不确定集μ为有限离散集合时的情况,即μ={u1,u2,...,ur},{x1,x2,..., xr}为每种情况下对应的二阶段决策变量。考虑到每种情况下的不确定性,则第一节中的两阶段鲁棒优化可表示如下:

在这种情况下,求解两阶段鲁棒优化可以看作求解一个大规模的混合整数规划(MILP)问题。当不确定集规模很大或者为多面体集时,通过上述这种考虑不确定集μ中所有可能的场景来求解并不现实。但是上式中的第2、3条约束,我们可以根据不确定集μ上的一个子集来为上述问题提供一个有效的松弛解,以及一个对应的目标值下界。因此,通过逐渐为原问题中添加特定场景来拓展问题,可以逐渐得到预期更强的下界。

基于以上的思想,提出了行列生成算法,通过识别到不确定集中重要的场景来拓展主问题的不确定集,即动态生成相应的决策量和约束2、3。

与Benders分解类似,行列生成算法也应用了主-子问题的框架,子问题如下:

以下是CCG的一般步骤:

初始阶段:开始时,主问题包含小部分列,子问题包含所有剩余的列。通常,主问题是一个松弛问题,允许不可行解。

求解主问题:求解主问题,找到一组列的部分解。这些列通常不是整数值,但可以通过约束条件得到整数值。

求解子问题:使用部分解生成一个子问题,它包含一些列,通常是从主问题的线性松弛解中选择的。子问题是一个优化问题,目标是找到最优的列,以便将它们加入主问题。

整数规划检查:检查子问题中的列是否可以舍入为整数值。如果可以,就将它们加入主问题,并重新开始主问题的求解。

终止条件:重复步骤2-4,直到主问题达到最优解,或者无法找到更多的整数解。

3.实例:

参考Zeng Bo老师2013年发表于《Operations Research Letters》上的文章《Solving two-stage robust optimization problems using a column-and-constraint generation method》和原文电子版全文。本文免费提供使用求解器求解的CCG代码,有需要的小伙伴可以关注文章结尾公众号,截图后台发给小编,我将程序发给您,谢谢~

问题描述:

不确定量描述:

使用求解器直接求解,得目标值为30536,y=[1,0,1],z=[220,0,480],x=[[0,0,220],[0,0,0],[206,274,0]]。

两阶段鲁棒模型

不确定量描述:

4.程序结果:

5.部分程序

clear all
clc
close all
MP =  MPParams();
SP = SPParams();
 [d,dconstrains] = UncertaintySet(); % 不确定性参数
theta = sdpvar(1);
[MPconstrains,MPFunc] =  MPconstrainsAndFunc(MP);
[SPconstrains,SPFunc] =SPConstrainsAndFunc(MP,SP,d);
constrains = [MPconstrains;
              theta >= SPFunc;
              SPconstrains;
              dconstrains];
 
opt = sdpsettings('verbose',1,'solver','cplex');
result = optimize(constrains,MPFunc + theta,opt); % 主问题求解
LB = value(MPFunc + theta)
%%
clear MP SP theta
MP =  MPParams();
SP = SPParams();
theta = sdpvar(1);
[MPconstrains,MPFunc] =  MPconstrainsAndFunc(MP);
[SPconstrains,SPFunc] =SPConstrainsAndFunc(MP,SP,value(d));
constrains = [MPconstrains;
              theta >= SPFunc;
              SPconstrains;
              ];
 
opt = sdpsettings('verbose',1,'solver','cplex');
result = optimize(constrains,MPFunc + theta,opt); % 主问题求解
LB = value(MPFunc + theta)

%% 子问题
KKT =  KKTParams();
% clear d
%  [d,dconstrains] = UncertaintySet(); % 不确定性参数
[SPconstrains,pi,SPFunc] =  SPKKT(MP,SP,KKT,d);
SPKKTconstrains = [SPconstrains;dconstrains];

result = optimize(SPKKTconstrains,-SPFunc,opt); % 主问题求解
UB = value(SPFunc) +value(MPFunc)



%%
cons = [];
while abs(UB-LB) >1e-5
     clear  SP 
%     MP =  MPParams();
      SP = SPParams();
%      theta = sdpvar(1);
    [MPconstrains,MPFunc] = MPconstrainsAndFunc(MP);
    [SPconstrains,SPFunc] = SPConstrainsAndFunc(MP,SP,value(d));
    value(d)
    cons = [cons; theta >= SPFunc; SPconstrains];
    constrains = [MPconstrains;cons];
    result = optimize(constrains,MPFunc + theta,opt); % 主问题求解
    LB = max(LB, value(MPFunc + theta))
    
    % 子问题
%     clear SP
%     SP = SPParams();
    [SPconstrains,pi,SPFunc] =  SPKKT(MP,SP,KKT,d);
    constrains = [SPconstrains;dconstrains];
    result = optimize(constrains,-SPFunc,opt); % 主问题求解
    UB = min(UB,value(SPFunc) +value(MPFunc))
    
end

参考文献:

Zeng, B., & Zhao, L. (2013). Solving two-stage robust optimization problems using a column-and-constraint generation method. Operations Research Letters, 41(5), 457-461

欢迎关注哦~小编将剩余代码发给您,谢谢!

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
电网是现代社会的重要基础设施之一,而鲁棒性优化ccg算法则是电网优化中的一种方法。这种算法通过优化电网的结构与参数,使其在面对外部扰动和内部变化时能够保持稳定运行。 电网的鲁棒性优化ccg算法一般分为阶段。第一个阶段是电网的结构优化。在这一阶段中,算法通过分析电网的拓扑结构,确定哪些电网节点之间的连接可以增强电网的鲁棒性。例如,选择一些关键节点进行增强,使得在这些节点发生故障时,电网仍能保持正常运行。此外,算法还会对电网进行容错处理,使得在某些节点存在故障时,电网能够自动切换到备用的节点继续供电。 第二个阶段是电网的参数优化。在这一阶段中,算法通过优化电网的参数配置,使得电网的鲁棒性得到进一步提升。参数优化的过程通常是一个迭代的过程,通过多次迭代,不断调整电网的参数,以使得电网在面对不同扰动和变化时的稳定性得到最大程度的提高。 电网的鲁棒性优化ccg算法可以提高电网的稳定性和可靠性,具有重要的现实意义。它可以有效应对电网运行过程中的各种异常情况,如设备故障、天气变化等。通过此算法的应用,电网可以更好地适应各种复杂环境和未知变化,提供高质量、稳定可靠的电力供应服务。因此,电网的鲁棒性优化ccg算法的研究与应用对于电力系统的安全稳定运行具有重要意义。在未来的发展中,我们还需要进一步完善和改进电网的鲁棒性优化ccg算法,以应对不断变化的电力需求和电网运营环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值