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

相关文章

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[

MySql 1264 - Out of range value for column 异常

前段时间操作数据库,本是一个很简单的修改语句,却报了  1264 - Out of range value for column字段类型官网  当时一看懵逼了,网上很多都说是配置的问题,需要修改my.ini文件,这个方式我没有试过,我想肯定还有其它方法,经过慢慢排 查发现表里的字段为 decimal(10,3) ,这说明小数点前只有7位,保留了3位小数点,而值在小数点前却有8位,这就导致了错误

Apache Kylin VS Apache Doris全方位对比

1 系统架构 1.1 What is Kylin1.2 What is Doris2 数据模型 2.1 Kylin的聚合模型2.2 Doris的聚合模型2.3 Kylin Cuboid VS Doris RollUp2.4 Doris的明细模型3 存储引擎4 数据导入5 查询6 精确去重7 元数据8 高性能9 高可用10 可维护性 10.1 部署10.2 运维10.3 客服11 易用性 11.1

vs环境下C++dll生成和使用

动态库和静态库: 动态库:全名动态链接库,用于将你的函数封装,让别人只能调用,不能看你的实现代码。由引入库和dll组成:引入库包含导出的函数和变量名,dll包含实际的函数和数据,运行时加载访问dll文件。  Windows API中的所有函数都封装在dll里面,最重要的三个: Kernel32.dll:包含管理内存、进程和线程的各个函数。User32.dll:包含用于执行用户界面任务,如窗口和

VS Code与SVN关联

VS Code是一款轻量级的集成开发环境,可通过安装插件与SVN进行关联。以下是将VS Code与SVN关联的步骤: 安装SVN插件:在VS Code中打开Extensions(快捷键:Ctrl+Shift+X),搜索并安装"svn"插件。 安装SVN命令行工具:在计算机上安装SVN命令行工具,确保在命令行中可以运行svn命令。 配置SVN路径:在VS Code中打开用户设置(快捷键:Ct