benders分解算法 逻辑思路整理(加星)

news2024/11/24 7:50:54

Benders decomposition

目录

1.benders的分类

2. 经典的benders分解

2.1 经典的benders分解注意点

2.2 benders分解的核心——子问题和对偶子问题的分析


benders分解本质是:
(1)将问题分解为松弛主问题和子问题
(2)子问题不断返回可行割和最优割,然后把这些割添加到松弛主问题中去。

1.benders的分类

benders目前有三种:
(1)经典的benders分解 Classical Benders 
1960年由benders提出;
主问题是只保留整数变量的松弛主问题,子问题是线性规划问题。


(2)基于整数的benders  Integer-based Benders
1993年由研究VRP的加拿大大佬提出;
子问题不再是线性规划了,因此不能再用对偶线性规划的性质了。
但是仍然可以根据套路(固定公式)添加可行割和最优割。


(3)基于逻辑的benders Logic-based Benders
是最新的,2019年提出的(我不是很确定)?
需要根据问题而定制,不再有固定的公式套用了。

总结一下,前两种是只要符合形式,就可以套用,是通用性框架;而第三种的基于逻辑的benders是定制化方案,不再是通用性框架了。

一般我们经常可以看到的是经典的benders,此处我也结合经典的benders梳理下思路。

2. 经典的benders分解

2.1 经典的benders分解注意点

假设是min问题,y是整数变量,x是实数变量。

再来回顾下benders的主要思路:
(1)将问题分解为master problem松弛主问题(只包含y)和sub problem子问题(只包含x)
(2)主问题给子问题一个的整数解y(此时子问题拿到y以后就变成了一个仅仅包含x的函数),然后子问题返回可行割或最优割,然后把这些割添加到松弛主问题中去。不断循环,直到上下界相等,问题求解结束。

注:

可行割是切除不可行的解;最优割是让解变得更好。

从主要思路里可以看到:

(1)benders是不断添加割的,割就是割平面,也就是不断加约束,也被叫做行生成。利用的原理是,最优解可能不需要全部的约束,可能只需要一部分就可以了。因此我们寻找这些起作用的即可,一个个添加,直到问题求解。

(2)主问题不断给子问题传输整数解y,给了若干次(部分的整数解)就可以求解结束,不必再用枚举的方式枚举所有的整数解。因此本质是部分枚举的方式。

(3)松弛主问题对应的是下界(因为只考虑了部分约束,因此可行域变大,解更好。)而子问题对应的是上界(因为接收的是整数解y,满足整数约束,因此得到的是MIP的可行解,是上界。)

在子问题求解后,更新上界;子问题把割传递给松弛主问题后更新下界(松弛主问题添加割后,即添加了约束,可行域变小,约束得更紧了因此解会变大,即会往上提下界,下界会变大)。

直到上下界相等,问题求解结束,输出最终结果。

2.2 benders分解的核心——子问题和对偶子问题的分析

 原MIP中含有整数变量y,和连续变量x。把整数变量y以及只包含y的相关约束放在松弛主问题里,松弛主问题是一个标准的MIP。子问题中包含连续变量x和常数y,因为y是常数,因此是只包含连续变量x的线性规划LP问题。由于常数y部分,每次松弛主问题给的是不同的常数y,子问题的可行域是不断变化的(Ax≥b-By,常数y是约束右端项是不断变化的)。因此分析子问题不太方便,那么转化为对偶子问题,可行域里没有常数y,跑到目标函数中了。

所以对偶子问题是关键,是benders的核心。

再来梳理下:

(1)子问题和松弛主问题和原问题是一条线;

子问题若无解,那么松弛主问题也无解,原问题也无解;无界也是一样的。

(2)子问题和对偶子问题是一条线。

可以利用对偶的性质。

综上,可以得到下面这张图:

原问题min松弛主问题min子问题min对偶子问题max
看成一条线
对偶问题的性质
无解无解无解无解
无界无界无界
有解有解有解最优解返回最优割(得到更好的解)
无解无解无解无界返回可行解(不让对偶子问题无界)

上面这张图是精髓了。一定要理解。

下面开始分析具体过程,来帮助我们理解上图最后一列上数学表达是怎样的:

(1)对偶子问题无界,那么一定存在极方向u_r,朝着u_r的方向,函数值达到无界。

因为对偶问题是max问题,也就是说函数值可以达到+无穷,换句话说极方向和梯度的夹角<90°,这样才能达到+无穷。

用数学式子表示是,极方向(u_r)与梯度(b-By)点乘>0,此时对偶子问题无界。

我们想让对偶子问题有界,那么需要反其道而行(逆否命题),也就是要求极方向(u_r)与梯度(b-By)点乘≤0,即u_r*(b-By)≤0。该式即为可行割,几何上上讲就是割去不可行的部分。

(2)对偶子问题有界,有解,那么就能达到唯一最优解u*。

注意,这是在松弛主问题给了一个定值y的情况下达到的最优解u*,是原问题的一个子集。那么对于不同的y,对于对偶子问题max问题而言,可以找到更好的q,也就是q≥(b-By)u*+f*y,也就是找到更好的解。

每次主问题给对偶子问题一个y,对偶子问题进行求解,若无界,则返回可行割;若有界返回最优割,更新上界。将割返回给主问题,求解主问题,得到一个新的y,以及更新下界。不断循环,直到上界=下界时停止。

从约束的角度看,因为不断添加可行割,因此被称为行生成。

从变量的角度看,因为是枚举了一部分y,并非把所有的y传递给x,因此核心是部分枚举的思路。

从主问题和子问题的角度来看,原问题是n1+n2维(y为n1维,x是n2维)的问题;而松弛主问题是n1+1(y为n1维,q为1维)维,子问题及其对偶子问题是n2维的问题。也就是说问题的维度得到降低,求解变得容易了。降维思维的应用。


相关资料:
LBBD
• The Benders decomposition algorithm: A literature review, 2017, Ragheb Rahmaniani,
etc., EJOR
• Logic-Based Benders Decomposition for Large-Scale Optimization, 2019, John N.
Hooker, book chapter.
IBBD
• The integer L-shaped method for stochastic integer programs with complete recourse,
1993, Gibert Laporate and Francois V. Louveaux, Operations Research Letters
• Improving the Integer L-Shaped Method, 2016, Gustavo Angulo, etc., INFORMS Journal
on Computing

运筹优化课程 012-Benders Decomposition

Benders decompositon学习笔记记录_可行割与最优割_云湖在成长的博客-CSDN博客

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

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

相关文章

支付宝SDK接口调试- cpolar内网穿透工具实现公网地址调试(1)

文章目录 1.测试环境2.本地配置3. 内网穿透3.1 下载安装cpolar内网穿透3.2 创建隧道 4. 测试公网访问5. 配置固定二级子域名5.1 保留一个二级子域名5.2 配置二级子域名 6. 使用固定二级子域名进行访问 转发自cpolar内网穿透的文章&#xff1a;Java支付宝沙箱环境支付&#xff0…

Cisco Identity Services Engine (ISE) 3.2 Patch2 发布 - 思科身份服务引擎

Cisco Identity Services Engine (ISE) 3.2 Patch2 发布 - 思科身份服务引擎 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-ise-3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 工作场所零信任安全的核心所在 …

FL Studio水果软件好用吗?对电脑硬件环境有哪些需求

如果你打算将来朝着艺术和音乐方向发展&#xff0c;那么学习音乐理论和音乐制作就是一门基础课了。 实践才是检验学习效果途径&#xff0c;在我们日常的练习中&#xff0c;一款功能强大且易学的音乐制作工具是少不了的。在没有实际体验过各个音乐制作工具的功能前&#xff0c;…

SpringCloud概论

目录 1.实现微服务需要解决的问题 2.解决这些问题需要的技术栈 3.spring cloud 4.Netflix和Alibaba 5.springCloud和doubbo 6.版本适配 7.停更 1.实现微服务需要解决的问题 马丁福勒于2014年在一篇文章中提出微服务架构&#xff0c;原文地址如下&#xff1a; Microser…

C++STL— stack和queue的介绍及使用

stack stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其只能从容器的一端进行元素的插入与提取操作。 stack的定义方式 方式一&#xff1a; 使用默认的适配器定义栈。 stack<int> st1; 方式二&#xff1a; 使用特定的适配器定义…

病毒分析丨plubx

作者丨黑蛋 一、基本信息 文件名称 00fbfaf36114d3ff9e2c43885341f1c02fade82b49d1cf451bc756d992c84b06 文件格式 RAR 文件类型(Magic) RAR archive data, v5 文件大小 157.74KB SHA256 00fbfaf36114d3ff9e2c43885341f1c02fade82b49d1cf451bc756d992c84b06 SHA1 1c251974b2e…

CTF 2023 三道pwn题

作者丨selph appointment_book 程序信息 程序保护信息&#xff1a; ➜ HeroCTF checksec appointment_book [*] /home/selph/ctf/HeroCTF/appointment_book Arch: amd64-64-little RELRO: No RELRO Stack: Canary found NX: NX enabled …

报名仅剩十天!又一开发者公布高分方案源代码,助力软件杯选手高效解题

‍‍ 本文作者&#xff1a;艾宏峰 算法工程师 M6 Global赛道总排名4th KDD Cup 2022风电功率预测飞桨赛道5th “中国软件杯”大学生软件设计大赛——龙源风电赛道&#xff0c;5月31日预选赛截止&#xff0c;80%选手将晋级区域赛&#xff0c;欢迎大家抓紧报名&#xff01; 赛题背…

如何编写快速高效的SQL查询(二)——为什么查询速度会慢与优化数据访问样例

为什么查询速度会慢&#xff1f; 我们现在已经知道MySQL优化器帮我们做了什么了&#xff0c;在尝试编写快速的查询之前&#xff0c;需要清楚一点&#xff0c;真正重要的是响应时间。如果把查询看作一个任务&#xff0c;那么它由一系列子任务组成&#xff0c;每个子任务都会消耗…

Django+mysql+bootstrap学习

python与mysql 创建表结构 create databse unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci; use unicom; create table admin(id int not null auto_increment primary key,username varchar(16) not null,password varchar(64) not null,mobile char(11) not null )…

Cesium源码分享--量算

Cesium量算插件 在线体验 gitee&#xff1a;https://gitee.com/caozl1132/CesiumExp-measure github&#xff1a;https://github.com/gitgitczl/CesiumExp-measure ps&#xff1a;如果可以的话&#xff0c;希望大家能给我个star&#xff0c;好让我有更新下去的动力&#xff1…

基于SSM的果蔬经营平台系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 前言…

Axure教程—动态多散点图(中继器)

本文将教大家如何用AXURE制作动态多散点图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://w8j93u.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87817783 二、功能介绍 简单填写中继器内容即可生成动态多散点图样式…

ChatGpt国内免费网站大全+个人体会

目录 ChatGpt ChatGpt迭代历史 部分ChatGpt个人体会 ChatGpt合集 ChatGpt2步制作流程图与思维导图&#xff0c;你确定不来看一下吗? 当然&#xff0c;你可以自行注册使用ChatGpt&#xff08;亲测有效&#xff09; ChatGpt ChatGPT是由OpenAI开发的一种大型语言模型&#…

《The Element of Style》阅读笔记 —— 章节 II Elementary Principles of Composition

前言&#xff1a;本篇为书籍《The Element of Style》第二章的阅读笔记。 本书电子版链接&#xff1a;http://www.jlakes.org/ch/web/The-elements-of-style.pdf 章节 I Elementary Rules of Usage 阅读笔记&#xff1a;链接 Content II Elementary Principles of Composition…

这些脑洞大开的论文标题,也太有创意了O(∩_∩)O

microRNAs啊microRNAs&#xff0c;谁是世界上最致命的髓母细胞瘤microRNAs&#xff1f; 这个标题很容易让人联想到白雪公主后妈说的那句话&#xff1a;Mirror mirror on the wall, who is the fairest of them all? 02 一氧化碳&#xff1a;勇踏NO未至之境 NO 指 nitric oxide…

Spring Boot中使用Spring Batch处理批量任务

Spring Boot中使用Spring Batch处理批量任务 Spring Batch是Spring框架的一个模块&#xff0c;它提供了一组API和工具&#xff0c;用于处理批量任务。在本文中&#xff0c;我们将会介绍如何在Spring Boot中使用Spring Batch来处理批量任务。我们将会使用一个简单的示例来说明如…

在现有iOS项目中,接入新的Flutter项目或现有的Flutter项目

文章参考自Flutter官网&#xff1a;进入Flutter官网 目录 一、背景 二、在现有iOS项目中&#xff0c;接入新的Flutter工程 1、创建新的Flutter工程 2、将iOS工程与Flutter工程进行关联 三、在现有iOS项目中&#xff0c;接入现有的Flutter工程 1、修改Flutter工程中的pub…

如何提高程序员的代码质量?

作为一名程序员&#xff0c;我们需要不断学习、探索新的技术&#xff0c;以便编写出高质量、可维护、安全且高效的代码。但是&#xff0c;即使是经验丰富的程序员也容易遇到一些技术陷阱&#xff0c;这些陷阱可能会导致运行时错误、性能问题或安全漏洞。下面是一些程序员绝对不…

DSOL:一种快速的直接稀疏里程计方案

文章&#xff1a;DSOL: A Fast Direct Sparse Odometry Scheme 作者&#xff1a;Chao Qu, Shreyas S. Shivakumar, Ian D. Miller and Camillo J. Taylor 编辑&#xff1a;点云PCL 代码&#xff1a;https://github.com/versatran01/dsol.git 来源&#xff1a;arXiv2022 欢迎各位…