两阶段鲁棒优化及列与约束生成算法(CCG)的基本原理(超详细讲解,附matlab代码)

news2024/12/25 9:53:16

        本文的主要参考文献:
Zeng B , Zhao L . Solving Two-stage Robust Optimization Problems by A Constraint-and-Column Generation Method[J]. Operations Research Letters, 2013, 41(5):457-461.

1.两阶段鲁棒优化问题的引入

        鲁棒优化是应对数据不确定性的一种优化方法,但单阶段鲁棒优化过于保守。为了解决这一问题,引入了两阶段鲁棒优化(Two-stage Robust Optimization)以及更一般的多阶段鲁棒优化,其核心思想是将决策问题分为两个阶段。第一阶段是进行初步决策,第二阶段是根据第一阶段的决策结果制定更好的决策策略,应对数据不确定性的影响。这种方法可以降低保守性,提高鲁棒性。

        假设一阶段和二阶段决策问题都是线性规划,并且不确定性集合U是一个有限的离散集合或者多面体集。使用y表示第一阶段决策变量,x表示第二阶段决策变量,表示不确定矢量。在此假设下的两阶段鲁棒优化的一般形式为:

1d6363b719fa4d598a9234f6874282f6.png

其中:

ce39e4319e764fceb30fbe6c4bf53de4.png

        向量c,b,d,h和矩阵A , G , E , M都是确定性的数值,不确定性体现在向量u上。注意到第二阶段优化的约束条件F(y,u)是关于不确定性u的线性函数。

        原文献中提供了以运输问题作为算例,具体如下:

8c2885d2e5c44711b39dd8de41bc4e89.png

其中,yi为0-1变量,表示是否在i地建设仓库,zi表示仓库i储存的商品数量,xij表示从i仓库到j客户运送的商品数量,fi表示建设仓库i的固定成本,ai表示仓库i存储商品的单位成本,cij表示从i仓库到j客户运送单位商品的成本,ki表示仓库i的最大容量,dj表示客户j的需求。

        不确定变量为客户的需求,表达方式如下:

8fcfa7006e894e0bb1dfda86dfbce241.png

        具体算例参数:

afef57b843014c028500faf2ab70ffbf.png

        根据上面的公式,我们可以写出各个参数矩阵以及变量的表达式:

4a02d9e458c44f31bb1e5cbc2bf56e2e.png

        用matlab代码表示:

%% 参数矩阵

f = [400; 414; 326];

a = [18; 25; 20];

k = 800;

C = [22, 33, 24;

     33, 23, 30;

     20, 25, 27];

d_ = [206; 274; 220];

d_wave = 40;

gamma = [1.8,1.2];

P = [1 1;1 1;1 0];



%% 决策变量

y = binvar(3,1);

z = sdpvar(3,1);

x = sdpvar(3,3,’full’);

d = sdpvar(3,1);

g = sdpvar(3,1);

        可以尝试求解一下这个确定性优化问题,和后面的两阶段鲁棒优化进行对比:

%% 目标函数

objective = f'*y + a'*z + sum(sum(C.*x));



%% 约束条件

Constraints = [];

Constraints = [Constraints , z >= 0 , x >= 0 , g >= 0 , g <= 1];

Constraints = [Constraints , z <= k*y];

Constraints=[Constraints , sum(x) <= z'];

Constraints=[Constraints ,sum(x,2) >= d];

Constraints=[Constraints ,d == d_ + g*d_wave];

Constraints=[Constraints ,g'*P <= gamma];



%% 设置求解器

ops=sdpsettings('verbose', 3, 'solver', 'gurobi');

sol=optimize(Constraints,objective,ops);

        优化结果为:

4bbd9049d5eb4fc5899642facbd6a8bb.png

         进一步把算例写成两阶段鲁棒优化的形式:

2756e85f1d564b598e5d53c6a169e595.png

         针对这个两阶段鲁棒优化问题,可以分别采用Benders对偶割平面法和C&CG算法进行求解。

2.Benders对偶割平面法

2.1基本原理

        Benders对偶割平面法可以用于解决两阶段鲁棒优化问题,首先将两阶段鲁棒优化问题分解为两部分:主问题(Master Problem,MP)和子问题(Subproblem,SP)。主问题包含第一阶段的决策变量y以及仅与y有关的约束和子问题返回的割,还包括辅助变量η,用于评估第二阶段目标函数的取值。子问题包含第二阶段的决策变量x和不确定变量u,旨在给出第二阶段目标函数值的一个界限值。针对式(1)中描述的两阶段鲁棒优化问题,其主问题MP可以写成:

29a0e85154e448f7b5c3ec915624b018.png

        主问题是一个线性规划问题。子问题SP则为:

dd7855c30cfe4ea8bde869e002ffd964.png

        而子问题是一个双层线性规划问题(如果不知道双层规划的概念,可以去看看我之前的几篇博客双层优化入门-CSDN博客),其中上层优化的决策变量是u,下层优化的决策变量是x,而且在下层优化中,变量y和u的值都是确定的,可以视为参数。

        对于双层优化形式的子问题的求解,主要有以下几种方式:

        1.通过对偶变换将双层优化问题转为单层优化问题,再进行求解,可以使用智能优化算法、等价线性化、二次规划求解器(例如gurobi)等方式进行求解;

        2.采用智能优化算法进行求解(可参考博客双层优化入门(3)—基于智能优化算法的求解方法);

        3.采用KKT条件进行求解(可参考博客双层优化基本原理与求解方法、基于yalmip的双层优化求解)。

        在这里我们使用KKT条件来求解子问题,可以将双层优化的子问题转换为下列单层优化的形式:

4a4347ddf1f24b3791157143092356ae.png

         上面的约束存在非线性形式,可以使用大M法引入二进制中间变量进行线性化,将其转换为混合整数规划的形式:

8260b5673ca04c74bb852b823e9623c6.png

         对于一般形式的两阶段鲁棒优化问题(如式(1)),Benders对偶切平面算法求解的流程如下:

        步骤1:设定目标函数上界UB=+∞, 下界LB=-∞,迭代次数k=0。

步骤2:求解主问题MP

6ed4d2650ac64246919c6a29e40a8ed0.png

 求出最优解(yk+1*,ηk+1*),并更新LB=max{LB,c T yk+1*+ηk+1*};

步骤3:求解子问题SP:

ac4e316b0d334db3a2b1ff0a7e844c16.png

         求出子问题的最优目标函数值Qk+1*以及最优解(uk+1*,xk+1*),并更新UB=min{UB,cT yk *+Q(yk*)}。

        步骤4:如果UB-LB ≤ ε(事先设定的运行偏差),则输出优化结果,并退出循环。否则令k=k+1,将约束6c73f755451947299a3a949fcdfc3275.png添加到主问题MP中并返回步骤2。

从上述步骤中可以看到,算法迭代的过程会不断向主问题添加约束条件6c73f755451947299a3a949fcdfc3275.png,也就是割平面,因此被称为Benders对偶割平面法。

2.2 算例分析

        采用文献中给出的运输问题作为算例,使用matlab+yalmip工具箱+gurobi求解器进行求解。

151094cb6ab74e8c8d70da00431dd425.png

         为了求解这个两阶段鲁棒优化问题,我们首先需要把这个优化问题分解成主问题和子问题。而且为了方便理解,重写成符合标准两阶段鲁棒优化问题的形式,其中重写后的优化问题部分变量或系数矩阵和原优化问题中重复,我都加了上标一撇(‘)以示区别,具体步骤如下:

主问题MP_BD

b3d1cc82fa974cfca8c22c92a19a26b1.png

子问题SP_BD

8c5f695c3bec4048824052dc71f3f32a.png

        步骤1:设定目标函数上界UB=+∞, 下界LB=-∞,迭代次数k=0。

        步骤2:求解主问题MP_BD,得到最优解(,),并更新LB=max{LB,};

        步骤3:求解子问题SP_BD,得到子问题的最优目标函数值Qk*以及最优解(uk*,xk*),并更新UB=min{UB,83ad75789a1347dcaedd5c30c9b5a663.png}。

        步骤4:如果UB-LB ≤ ε(事先设定的允许偏差),则输出优化结果,并退出循环。否则令k=k+1,将约束8edacc06710b42d7b258900663e62db6.png添加到主问题MP中并返回步骤2。

        采用matlab编程进行求解,结果如下:

8db76cced9354b058ae5d7c0cb5922c2.png86e83352b2c643039fc8d38b487a4f6b.png253fcd100d2d47b5a738f7641dd44338.png

          与确定性优化的结果对比如下:

变量

确定性优化

两阶段鲁棒优化

最优目标函数值

30566

33680

y

[1 1 0]

[1 0 1]

z

[426 274 0]

[255.2 0 516.8]

x

g

[0 0 0]

[0 1 0.8]

d

[206 274 220]

[206 314 252]

3.列与约束生成算法(C&CG)

3.1 基本原理

        Benders对偶割平面法通过将两阶段鲁棒优化分解为主问题和子问题,不断交替求解,并将子问题的求解结果作为主问题增加的约束条件,以此达到迭代收敛的目的。C&CG算法和Benders对偶割平面法原理有一些相似,但也存在明显的差异,其基本原理如下:

        在C&CG算法的求解过程中,主问题中首先将不考虑不确定变量的影响,作为一个确定性优化进行求解。但不确定变量的最恶劣场景肯定会对主问题的决策产生影响,所以C&CG算法的本质思想就是在确定性优化求解的基础上,不断添加相对恶劣的场景以及对应的子问题决策变量和约束条件,从而使目标函数上界和下界不断得到改进,直到算法收敛,这种思想也被称为“追索权(recourse)”决策:在主问题不考虑不确定性的基础上,不断根据子问题决策带来的不确定性进行修正决策,来保证最终解的鲁棒性。

        根据C&CG算法的基本原理,我们可以想到,如果不确定集是一个离散的有限集,那么也可以通过枚举法来求解两阶段鲁棒优化问题。但实际情况肯定不会这么简单,还是需要通过C&CG算法交替迭代求解,具体步骤如下:

主问题MP_CCG

71e7eca16ded453780a6de82eb0fa8fd.png

其中,xl是第l次迭代添加的决策变量,2b90752237e44087ab16455f15390217.png是第l次迭代子问题的最恶劣场景,因为第l次迭代时子问题中已经求解了2b90752237e44087ab16455f15390217.png的值,所以在主问题中就可以看作已知的参数。

子问题SP_CCG

9e67395329f14aba97be42e47dc56c49.png

         步骤1:设定目标函数上界UB=+∞, 下界LB=-∞,迭代次数k=0。

        步骤2:求解主问题MP_CCG,得到最优解9021aef67e764e3f9929f2cf27b53bb3.png,并更新LB=max{LB,184820b7ccaf4af1971e0f8f2f5d96e8.png};

        步骤3:求解子问题SP_CCG,得到子问题的最优目标函数值Qk*以及最优解(uk*,xk*),并更新UB=min{UB,59b8c175ae6444a888f634e1c920f897.png}。

        步骤4:如果UB-LB ≤ ε(事先设定的允许偏差),则输出优化结果,并退出循环。否则转到步骤5.

        步骤5:判断子问题是否存在最优解。

        若Q(yk+1*)<+∞,即子问题存在最优解,则创建变量xk+1并给主问题MP_CCG添加以下约束:

eb5cb031bc444eb3af389fc2ca64d88a.png

其中uk+1*是第k次迭代时子问题求解出来的最恶劣场景。

随后更新k= k+1,并转到步骤2。

        若Q(yk+1*)=+∞,即子问题不存在最优解,则创建变量xk+1并给主问题MP_CCG添加以下约束:

fbce73f6355246c99dfc6312e01dab34.png

 随后更新k= k+1,并转到步骤2。

        从C&CG算法的步骤可以看到,在迭代的过程中在不断地向主问题添加决策变量以及约束条件,也就是优化问题的行和列都在增加,因此才被称为column-and-constraint generation (C&CG) 算法。

        原文献中解释了C&CG算法和Benders对偶割平面算法的区别,具体如下:

(1) 在主问题中,C&CG算法通过在每次迭代中引入一组新变量来增加解空间的维数,而Benders对偶割平面算法则使用相同的变量集合。

(2) 在处理可行性问题方面,C&CG算法提供了一种通用的方法,而Benders对偶割平面算法是针对特定问题的。

(3) 在计算复杂度方面,与Benders对偶割平面算法相比,C&CG算法在求解主问题时使用更多变量和约束条件。然而,若第二阶段的决策问题为LP问题,根据原文中的命题1和2,Benders对偶割平面算法的复杂度为O(pq),C&CG算法的复杂度将为O(p)(p是不确定集U的极值点数,q为满足GTπ≤b和π≥0的集合{π}中的极值点数量,具体见原文献中的描述)。因此C&CG算法的收敛速度要更快。

(4) 在求解问题的能力方面,Benders-dual对偶割平面算法需要将第二阶段的问题转换为线性规划问题,而C&CG算法不关心第二阶段的变量类型。如果第二阶段是混合整数规划,可以采用嵌套C&CG算法进行求解。

2.2 算例分析

        同样采用文献中给出的运输问题作为算例,使用matlab+yalmip工具箱+gurobi求解器进行求解。

5a88e29763804dd3a671fbf922bd989a.png

        和Benders-dual对偶割平面算法一样,我们首先需要把这个优化问题分解成主问题和子问题,并将优化问题重写成符合标准两阶段鲁棒优化问题的形式,具体步骤如下:

主问题MP_CCG

a592c70729fb41f2bf9835871f3d1aed.png

子问题SP_BD

 6abb1665a9634cee85b2198458eab7b6.png

        步骤1:设定目标函数上界UB=+∞, 下界LB=-∞,迭代次数k=0。

        步骤2:求解主问题MP_CCG,得到最优解c0006214ed1740bbbf3ba5ec49eb50dc.png,并更新LB=max{LB,c83559d883fa4a708b2d3d05a1410db0.png};

        步骤3:求解子问题SP_CCG,得到子问题的最优目标函数值Qk*以及最优解(uk*,xk*),并更新UB=min{UB,8e9bdee2a277423d9e2aef636b5a79e7.png}。

        步骤4:如果UB-LB ≤ ε(事先设定的允许偏差),则输出优化结果,并退出循环。否则转到步骤5.

        步骤5:判断子问题是否存在最优解。

        若Q(yk+1*)<+∞,即子问题存在最优解,则创建变量xk+1并给主问题MP_CCG添加以下约束:

bcdc79cde0ca43a6bbcc39cf8f3797ce.png

 其中uk+1*是第k次迭代时子问题求解出来的最恶劣场景。随后更新k= k+1,并转到步骤2。

        若Q(yk+1*)=+∞,即子问题不存在最优解,则创建变量xk+1并给主问题MP_CCG添加以下约束:

2df6c75c072b4385a10435127ff73d33.png

随后更新k= k+1,并转到步骤2。

运行结果如下,和Benders对偶割平面方法一样,但收敛速度更快:

dc6bf08586ba42a8a85d56e252b888ce.png

70b07236984e44a1bc0779f2f2ebfc86.png

52322b88b07e4c638abc15efc96f59e3.png 4.完整代码获取链接

        想获取完整代码,可以戳下面这个链接:

两阶段鲁棒优化以及列与约束生成算法(C&CG)的matlab代码实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/562432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索【Stable-Diffusion WEBUI】的图片超分辨插件:StableSR

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;图片放大&#xff08;二&#xff09;图片超分辨率放大脚本插件&#xff08;StableSR&#xff09;&#xff08;2.1&#xff09;下载组件&#xff08;2.2&#xff09;使用&#xff08;2.3&#xff09;实例对比…

bat脚本语法与实战

一、什么是bat脚本 bat脚本就是将一系列DOS命令按照一定顺序排列而形成的集合&#xff0c;运行在windows命令行环境上。通过本文的学习&#xff0c;基本可以实现一些简单的脚本。 二、为什么学习bat脚本&#xff1f; 使用bat可以提高办公效率&#xff0c;可以直接使用Notepad编…

JavaEE(系列12) -- 常见锁策略

目录 1. 乐观锁和悲观锁 2. 轻量级锁与重量级锁 3. 自旋锁和挂起等待锁 4. 互斥锁和读写锁 5. 可重入锁与不可重入锁 6. 死锁 6.1 死锁的必要条件 6.2 如何避免死锁 7. 公平锁和非公平锁 8. Synchronized原理及加锁过程 8.1 Synchronized 小结 8.2 加锁工作过程 8.2.1 偏向锁…

MySQL保证主备一致,如何解决循环复制?

备库只读&#xff0c;是如何和主库同步数据的&#xff1f; 你可能会问&#xff0c;我把备库设置成只读了&#xff0c;还怎么跟主库保持同步更新呢&#xff1f; 这个问题&#xff0c;你不用担心。因为 readonly 设置对超级 (super) 权限用户是无效的&#xff0c;而用于同步更新…

用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。

Vue3 的父子组件传值、绑定表单数据、UI库的二次封装、防抖等&#xff0c;想来大家都很熟悉了&#xff0c;本篇介绍一种使用 Typescript 的方式进行统一的封装的方法。 基础使用方法 Vue3对于表单的绑定提供了一种简单的方式&#xff1a;v-model。对于使用者来说非常方便&…

【011】C++选择控制语句 if 和 switch 详解

C控制语句之if和switch语句 引言一、选择控制语句if1.1、if 语句的形式1.2、if...else...语句的形式1.3、if...else if... else...语句 二、选择控制语句switch2.1、switch语句形式 三、switch和if...else if...else...比较四、注意事项总结 引言 &#x1f4a1; 作者简介&#…

企业工程行业管理系统源码-专业的工程管理软件-提供一站式服务

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

Doo Prime 德璞资本:期货开户条件全解析!让你不再困惑!

期货市场是金融市场中一个非常重要的部分&#xff0c;对于许多投资者来说&#xff0c;期货市场是一个非常有吸引力的投资选择。然而&#xff0c;要进行期货交易&#xff0c;必须首先开设期货账户&#xff0c;这就需要满足一些期货开户条件&#xff0c;因此本文将介绍期货开户条…

认识SpringCloud(一) 注册中心Eureka

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。在传统的rpc远程调用框架中&#xff0c;管理每个服务与服务之间依赖关系比较复杂&#xff0c;管理比较复杂&#xff0c;所以需要使用服务治理&#xff0c;管理服务于服务之间依赖关系&#xff0c;可以实现服…

(原创)getX+Dio实现Flutter悬浮置顶的页面效果

前言 Flutter的开发相对已经比较成熟了&#xff0c;现在市面上不少商业应用也在使用这个技术 老实说&#xff0c;Flutter去实现一些基础的ui界面&#xff0c;效率还是很高的 当然前提是你对它要有一定的了解。 今天就演示一下&#xff0c;如何去实现一个基础悬浮置顶的页面效果…

OSTrack 中的边界框回归策略

目录 一、裁剪和标签的设置 二、模型的预测输出的边界框回归 一、裁剪和标签的设置 1、添加偏移量&#xff0c;得到偏移后的边界框 jittered_anno [self._get_jittered_box(a, s) for a in data[s _anno]] 2、以偏移后的边界框为中心&#xff0c;进行裁剪 首先以偏移边界…

Apache Pulsar入门指南

1.概述 Apache Pulsar 是灵活的发布-订阅消息系统&#xff08;Flexible Pub/Sub messaging&#xff09;&#xff0c;采用计算与存储分离的架构。雅虎在 2013 年开始开发 Pulsar &#xff0c;于 2016 年首次开源&#xff0c;目前是 Apache 软件基金会的顶级项目。Pulsar 具有支…

面试官:写一个单例模式

1. 什么是单例模式 了解单例模式之前&#xff0c;我们需要先了解什么是设计模式。 设计模式是一种抽象的编程思想&#xff0c;不局限于编程语言&#xff0c;简单来说&#xff0c;就是一些大佬程序猿针对一些典型的场景&#xff0c;给出一些典型的解决方案&#xff0c;只要按照这…

04-CSS3-渐变色、2D转换、3D转换

一、渐变色 CSS渐变色&#xff08;Gradient&#xff09;是指在元素背景中使用两种或多种不同的颜色进行过渡&#xff0c;超过两个颜色可以形成更为细腻的渐变效果。常见的CSS渐变色有线性渐变和径向渐变。 1. 线性渐变&#xff1a;Linear Gradients 向下/向上/向左/向右/对角…

SVN 修改URL路径-使用重新定位(relocate)命令和找不到问题解决

当svn服务器url发生变更,又不想在本地重新进行checkout操作,这时候可以使用svn relocate命令进行url的重新定位; 在windows下以TortoiseSVN为例,在仓库文件夹上右键,TortoiseSVN-(重新定位)relocate, 1、Windows TortoiseSVN客户端: 在工作复本的根目录上右键->TortoiseSV…

DOUBLETROUBLE: 1

文章目录 DOUBLETROUBLE: 1实战演练一、前期准备1、相关信息 二、信息收集1、nmap探测目标靶机端口2、扫描目标网址目录3、访问网站&#xff0c;发现secret下有个图片4、将图片下载5、查看图片所含内容6、破解密码并查看7、登陆邮箱8、创建反弹shell9、上传反弹shell10、监听11…

Jeecg-Boot 未授权SQL注入漏洞(CVE-2023-1454)

本文转载于&#xff1a;https://blog.csdn.net/qq_27536045/article/details/129944987 环境搭建 JDK: 1.8 (小于11) Maven: 3.5 MySql: 5.7 Redis: 3.2 Node Js: 10.0 Npm: 5.6.0 Yarn: 1.21.1 下载源码 后端源码 https://github.com/jeecgboot/jeecg-boot/tree/v…

MongoDB安装教程—Ubuntu

为啥用MongoDB&#xff0c;问就是客户要求。 为啥用Ubuntu&#xff0c;问就是客户只有Ubuntu的机器。 0. 环境 操作系统&#xff1a; Ubuntu 22.04.1 LTS (GNU/Linux 5.19.0-41-generic x86_64) 不同版本系统差异不同&#xff0c;其他版本系统未测试。 1. 安装 1.1 包管理公…

深入探索SDL游戏开发

前言 欢迎来到小K的SDL专栏第二小节&#xff0c;本节将为大家带来基本窗口构成、渲染器、基本图形绘制、贴图、事件处理等的详细讲解&#xff0c;看完后希望对你有收获 文章目录 前言一、简单窗口二、渲染器三、基本图形绘制1、点2、线3、矩形4、圆和椭圆 四、贴图五、事件处理…

XR交互技术趋势:6DoF追踪、手势识别、眼动跟踪……

XR交互技术提供了用户与虚拟环境进行交互的方式和手段&#xff0c;而实时云渲染则提供了真三维、可交互、高沉浸的图形渲染和计算能力。结合这两者&#xff0c;用户可以通过XR设备获得更真实、更沉浸的虚拟体验&#xff0c;同时享受到优质的图形效果和流畅的交互响应。本篇文章…