Column-and-constraint generation VS Benders‘ decomposition

2023-11-07 13:38

本文主要是介绍Column-and-constraint generation VS Benders‘ decomposition,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论文地址:Solving two-stage robust optimization problems using a column-and-constraint generation method

之前介绍过一个column-and-row generation方法,这次介绍一个更加常用的Column-and-constraint generation(C&CG)。

从论文题目就可以看出,这个方法主要用于two-stage robust optimization (RO) ,也就是robust adjustable or adaptable optimization,也就是说,第二阶段的问题是在第一阶段的决策做出后,对决策进行建模,并根据其不确定性来进行进一步的优化。

但是,这种问题一般很难求解,因为在很多时候,第一阶段的问题甚至都是NP-hard的。有两种思路可以在计算量不大的情况下求解此类问题。

  1. 第一种是优化的方法。这种思路假设第二阶段的决策只是一个单纯的函数关系,如仿射函数。
  2. 第二种是Benders’ decomposition方法。在第二阶段利用对偶方法基于第一阶段的问题构造一个价值函数value function。所以,这种思路也叫Benders-dual cutting plane algorithms。

而C&CG的思路大致是,在一个确定场景的原始空间动态地生成对于recourse decision variables的约束(dynamically generates constraints with recourse decision variables in the primal space for an identified scenario)。

recourse(追索?不是很确定这个术语是不是这样翻)是RO问题里的一个概念。如果只有一个阶段的RO,自然谈不上追索,也就是problems without recourse。recourse variables可以简单理解为是adjustable decision variables,就是第二阶段里根据不确定性需要去优化和调整的变量。

Two-stage RO问题定义与Benders-dual cutting plane method

考虑第一阶段与第二阶段都是线性优化的情况,同时不确定性是一个有限离散集(finite discrete set)或一个多面体(polyhedron)。

以下是两阶段RO的定义:

其中,y是第一个阶段的决策变量,x是第二个阶段的决策变量,\mathcal{U}是不确定集。是由Bender分解定义的cutting plane。

如果代表第二阶段的线性规划问题LP是对任意给定的y和u都可行的,也就是relatively complete recourse的。(这里解释一下这个概念,它是指第二个阶段的问题,对任何第一阶段的决策和不确定集中的任意参数都是可行的。)

那么可以得到它的对偶问题:

这个问题是一个双优化问题(bilinear optimization problem)。可以通过启发式方法或者根据不同特定结构的不确定集解决。

一个切割平面可以直接产生:

将其纳入主问题:

结合SP1我们可以看出,当迭代地引入切割平面和计算MP1时,上界与下界将会不断收敛,最终得到原问题的最优解。

算法的收敛性:

A column-and-constraint generation algorithm

\mathcal{U}x^r都当作是recourse decision variables,原问题可以建模为:

这样,原two-stage RO问题就简化为一个混合整数规划( mixed-integer program)问题。

基于这样的formulation,很多情况下枚举所有可能的场景是不实际的,比如不确定集特别大的情况。

但是,可以采用部分枚举(partial enumeration)的方法。一是在formulation里看起来比较直接,二是通过添加某些特殊场景的枚举,可以让下界更强。

所以,在C&CG算法中,最重要的一点是去确认和纳入一些重要的场景并产生对应的recourse decision variables。

C&CG的算法流程如下图:

其中,第3步的SP2如下所示:

第4步中的(a)情况对应的是optimality cut,(b)情况对应的是feasibility cut。

算法的收敛性:

与Benders-dual method的对比

  1. 主问题中的决策变量个数。C&CG算法通过在每次迭代中引入一组新的变量来增加解空间的维数,而Benders-dual算法一直使用同一组变量。
  2. Feasibility cut。C&CG算法提供了处理可行性问题的一般方法,而当前的Benders-dual算法的方法是针对具体问题的。
  3. 计算复杂度。与Benders-dual算法相比,C&CG算法求解的主程序变量和约束数量更大。然而,由于在第二阶段极值点的数量相对于变量和约束的数量是指数级的,计算量的减少是非常显著的。仿真结果也可以证明这一点。
  4. 解决能力。与Benders-dual算法要求第二阶段问题为LP问题不同,C&CG算法对第二阶段的变量类型没有要求。
  5. cut的强度。在相对完整的追索假设下,MP1(来自Benders-dual算法)的最优值是对MP2(来自C&CG算法)最优值的低估。 

拓展

文中还拓展了当不确定集是一般多面体(general polyhedral uncertainty sets)的情况,用到了KKT条件,还有一节是对robust location-transportation问题的case study,感兴趣的话可以找来看看。

另一篇文章Decomposition for adjustable robust linear optimization subject to uncertainty polytope 对此算法做了一定的改进,主要是在松弛其中的relatively complete recourse假设上。

方法评价

  • C&CG算法像是一个分解问题的框架,它主张将问题分为主问题MP和子问题SP来解决。而子问题一般是可以用现成的优化工具来解决的。
  • 文中对为什么叫column-and-constraint generation没有过多解释,column究竟指的是什么没有特别明确。但是可以猜测应该是指recourse decision variables,而constraint应该是指第4步中生成的与其相关的constraint。
  • 文中提到C&CG算法可以轻易地拓展到非线性优化问题中,但未进行进一步解释。
  • 文中用到的链接部分已经失效,难以追溯。
  • 论文被引用了700+,有一些已经应用此算法解决问题的方案可以参考。

这篇关于Column-and-constraint generation VS Benders‘ decomposition的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/363964

相关文章

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

LLVM入门2:如何基于自己的代码生成IR-LLVM IR code generation实例介绍

概述 本节将通过一个简单的例子来介绍如何生成llvm IR,以Kaleidoscope IR中的例子为例,我们基于LLVM接口构建一个简单的编译器,实现简单的语句解析并转化为LLVM IR,生成对应的LLVM IR部分,代码如下,文件名为toy.cpp,先给出代码,后面会详细介绍每一步分代码: #include "llvm/ADT/APFloat.h"#include "llvm/ADT/S

Python安装llama库出错“metadata-generation-failed”

Python安装llama库出错“metadata-generation-failed” 1. 安装llama库时出错2. 定位问题1. 去官网下载llama包 2.修改配置文件2.1 解压文件2.2 修改配置文件 3. 本地安装文件 1. 安装llama库时出错 2. 定位问题 根据查到的资料,发现时llama包中的execfile函数已经被下线了,需要我们手动修改代码后

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,

解决服务器VS Code中Jupyter突然崩溃的问题

问题 本来在服务器Anaconda的Python环境里装其他的包,装完了想在Jupyter里写代码验证一下有没有装好,一运行发现Jupyter崩溃了!?报错如下所示 Failed to start the Kernel. ImportError: /home/hujh/anaconda3/envs/mia/lib/python3.12/lib-dynload/_sqlite3.cpython-

VSC++: 括号对称比较

括号的使用规则:大括号,中括号,小括号{[()]};中括号,小括号[()];小括号();大括号、中括号、小括号、中括号、小括号、大括号{[()][()]};大括号,中括号,小括号,小括号{[(())]};大括号,中括号,小括号,小括号{[()()]};小括号不能嵌套,小括号可连续使用。 {[]}、{()}、([])、({})、[{}]、{}、[]、{[}]、[(])都属非法。 char aa[