运筹学读书笔记---Benders Decomposition
1、前言
最近在读这本厚厚的运筹学书籍,发现这本书写的真的好。大规模优化方法系列,有个叫benders分解的算法,之前只是听过名字,不懂具体原理。仔细啃了一下,还是很有意思的。
2、分解策略
如果y值固定,上述问题就变成一个线性规划问题。因此,在第l次迭代时。选取部分整数决策变量y(l)并固定相应的值,从而将整数规划转化为只包含连续决策变量的问题,如下所示:
由BP(l)的对偶问题得到第l次迭代的Benders的子问题。
当求解对偶子问题(BD(l))时,可能会出现两种情形:子问题的最优解对应一个极点v(i)或者子问题无界,最优解对应一个极方向v(j)。因此,在benders主问题求解变量y的整数规划模型如下形式:
当考虑所有的极点和极方向时,BM问题一定可以找到最优的y,但此时的模型可能包含指数级别的数量的极点和大量的极方向。和列生成算法类似,限制主问题只考虑当前迭代时生成的极点和极方向,每次迭代会逐步添加新的极点和极方向。
3、最优性原理
如果第次迭代
模型的值小于等于上一次迭代得到的限制主问题最优目标函数值小,即
因为的约束比
的约束少,所以
是
的上界,即
。随着迭代过程
中约束条件越来越多,
的值应该是增加的,所以
是
的下界,即
。所以每次迭代中会有
,一旦
,迭代达到终止条件。
4、整体流程
第0步:初始化。。
第1步:Benders子问题求解。若目标函数值有界限,得到极点,进入第2步。若目标函数无界,得到极方向,进入第3步。
第2步:算法终止判断。如果停止,得到,进而求解
。
第3步:限制主问题更新,将新得到的极点和极方向以约束条件的形式添加到zhong。
第4步:主问题求解。求解得到
和目标函数z。
,返回第1步。
5、基于Gurobi模型构建
import gurobipy as gp
from gurobipy import GRB
import numpy as npclass Benders_Example(object):def __init__(self,i_num,j_num):self.j_num = j_numself.i_num = i_numself.f = [400, 250, 300]self.d = [75, 90, 81, 26, 57]self.cost = [[4, 7, 3, 12, 15],[13, 11, 17, 9, 19],[8, 12, 10, 7, 5]]def build_model(self):model = gp.Model("Benders")x_ij = model.addVars(self.i_num,self.j_num,vtype=GRB.CONTINUOUS,obj=self.cost,lb=0,ub=GRB.INFINITY,name="x")y_i = model.addVars(self.i_num,vtype=GRB.BINARY,obj=self.f,name="y")model.modelSense=GRB.MINIMIZE#add constrmodel.addConstrs((x_ij.sum(i,"*") <= y_i[i] * sum(self.d) for i in range(self.i_num)),name='c1')model.addConstrs((x_ij.sum("*",j) == self.d[j] for j in range(self.j_num)),name='c2')model.write("benders.lp")model.optimize()print("model obj = ",model.objVal)for i in range(self.i_num):print("y(%d)=%lf" % (i,y_i[i].x))for j in range(self.j_num):print(x_ij[i,j].x)
6、基于Gurobi实现Benders算法
只是粗略的实现,直接建模型求解和用benders算法求解。代码框架还需要优化,后边有时间再打磨。
github:https://github.com/IELBHJY/OperationsResearch/tree/master/Benders
参考资料:本文资料是来自<<Optimization in Operations Research 2nd Edition>>
运筹学读书笔记---Benders Decomposition相关推荐
- Benders Decomposition初认识
最近在阅读文献时,注意到一种求解混合整数规划问题(MIP)的方法--Benders Decomposition,先写下一点初步的学习理解. 为什么要Benders Decomposition? 顾名思 ...
- 计算广告——读书笔记(二)
目录 一.计算广告技术概述 1. 个性化系统框架 2. 各类广告系统优化目标 3. 计算广告系统框架 3.1 广告投放引擎 3.2 数据公路高速 3.3 离线数据处理 3.4 在线数据处理 4. 计算 ...
- 【读书笔记 | 自动驾驶中的雷达信号处理(第7章 目标滤波与跟踪)】
本文编辑:调皮哥的小助理 大家好,又和大家见面了,时间过得很快,到目前为止,如下面的目录所示,我们已经阅读过汽车雷达目标检测的一些基本的原理了,特别是距离.速度和角度.虽然这些表示瞬时目标状态的信息可 ...
- zz[读书笔记]《Interpretable Machine Learning》
[读书笔记]<Interpretable Machine Learning> Jul 19, 2019 看到这本书,特意翻了下微博妖僧老冯_之前的一条微博,这样写道:"在机器学习 ...
- 【读书笔记】知易行难,多实践
前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...
- 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)
读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...
- 《编程匠艺》读书笔记
<编程匠艺>读书笔记之一 <编程匠艺>读书笔记之二 <编程匠艺>读书笔记之三 <编程匠艺>读书笔记之四 <编程匠艺>读书笔记之五 <编 ...
- 《Java: The Complete Reference》等书读书笔记
春节期间读了下<Java: The Complete Reference>发现这本书写的深入浅出,我想一个问题,书中很多内容我们也知道,但是为什么我们就写不出这样一本书,这么全面,这么系统 ...
- oracle直查和call哪个更快,让oracle跑的更快1读书笔记二
当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net 网友分享于:2013-08-23 浏览:9次 <> ...
最新文章
- Ubuntu18.04运行ORB_SLAM2
- Python爬虫项目--爬取某宝男装信息 附带源码
- Easy Problem 7 求反数字字符串
- 都在说微服务,那么微服务的反模式和陷阱是什么(三)
- 1、spring的IOC
- Cordova实战培训
- OS / linux / 互斥锁实现原理(futex)
- 2021研发效能实践案例征集大赛
- php sslbug,PHP错误抑制符(@)导致引用传参失败Bug的分析
- cemtos7上mysql8两个实例_centos7上配置mysql8的双主互写
- Android 学习 笔记_03. SQLite的使用
- Java 映射(Map)和集合(Set) 用法总结
- HTML5-单、多选框,按钮
- 技术系统进化法则包括_八大技术系统进化法则主要包括哪些
- 在线小蝌蚪匿名聊天室源码 用于网站引流
- 【计网】2.2.4 Web缓存/代理服务器
- 计算机合并单元格怎么操作,excel怎么合并单元格,教您excel合并单元格的方法
- c 语言len函数,巧妙利用LEN、SUBSTITUTE函数,计算EXCEL单元格内某重复字符个数
- 视频里面的音频怎么提取成mp3?
- 图片尺寸px怎么转换成厘米?在线图片尺寸换算工具怎么用?