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相关推荐

  1. Benders Decomposition初认识

    最近在阅读文献时,注意到一种求解混合整数规划问题(MIP)的方法--Benders Decomposition,先写下一点初步的学习理解. 为什么要Benders Decomposition? 顾名思 ...

  2. 计算广告——读书笔记(二)

    目录 一.计算广告技术概述 1. 个性化系统框架 2. 各类广告系统优化目标 3. 计算广告系统框架 3.1 广告投放引擎 3.2 数据公路高速 3.3 离线数据处理 3.4 在线数据处理 4. 计算 ...

  3. 【读书笔记 | 自动驾驶中的雷达信号处理(第7章 目标滤波与跟踪)】

    本文编辑:调皮哥的小助理 大家好,又和大家见面了,时间过得很快,到目前为止,如下面的目录所示,我们已经阅读过汽车雷达目标检测的一些基本的原理了,特别是距离.速度和角度.虽然这些表示瞬时目标状态的信息可 ...

  4. zz[读书笔记]《Interpretable Machine Learning》

    [读书笔记]<Interpretable Machine Learning> Jul 19, 2019 看到这本书,特意翻了下微博妖僧老冯_之前的一条微博,这样写道:"在机器学习 ...

  5. 【读书笔记】知易行难,多实践

    前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...

  6. 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)

    读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...

  7. 《编程匠艺》读书笔记

    <编程匠艺>读书笔记之一 <编程匠艺>读书笔记之二 <编程匠艺>读书笔记之三 <编程匠艺>读书笔记之四 <编程匠艺>读书笔记之五 <编 ...

  8. 《Java: The Complete Reference》等书读书笔记

    春节期间读了下<Java: The Complete Reference>发现这本书写的深入浅出,我想一个问题,书中很多内容我们也知道,但是为什么我们就写不出这样一本书,这么全面,这么系统 ...

  9. oracle直查和call哪个更快,让oracle跑的更快1读书笔记二

    当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net  网友分享于:2013-08-23  浏览:9次 <> ...

最新文章

  1. Ubuntu18.04运行ORB_SLAM2
  2. Python爬虫项目--爬取某宝男装信息 附带源码
  3. Easy Problem 7 求反数字字符串
  4. 都在说微服务,那么微服务的反模式和陷阱是什么(三)
  5. 1、spring的IOC
  6. Cordova实战培训
  7. OS / linux / 互斥锁实现原理(futex)
  8. 2021研发效能实践案例征集大赛
  9. php sslbug,PHP错误抑制符(@)导致引用传参失败Bug的分析
  10. cemtos7上mysql8两个实例_centos7上配置mysql8的双主互写
  11. Android 学习 笔记_03. SQLite的使用
  12. Java 映射(Map)和集合(Set) 用法总结
  13. HTML5-单、多选框,按钮
  14. 技术系统进化法则包括_八大技术系统进化法则主要包括哪些
  15. 在线小蝌蚪匿名聊天室源码 用于网站引流
  16. 【计网】2.2.4 Web缓存/代理服务器
  17. 计算机合并单元格怎么操作,excel怎么合并单元格,教您excel合并单元格的方法
  18. c 语言len函数,巧妙利用LEN、SUBSTITUTE函数,计算EXCEL单元格内某重复字符个数
  19. 视频里面的音频怎么提取成mp3?
  20. 图片尺寸px怎么转换成厘米?在线图片尺寸换算工具怎么用?

热门文章

  1. UCL 教授汪军:多智能体强化学习的两大挑战 | CCF-GAIR 2017
  2. 深受java开发者喜爱的顶级Java IDE
  3. 了解 Android N
  4. Spring的IOC(依赖注入和控制反转)
  5. 使用赛元单片机“sc92f742x”实现LED灯的呼吸效果
  6. 路径规划的最优控制Matlab代码分享
  7. 计算机考试打印测试页,通过电脑打印测试页(适用于 Win8/8.1/10)
  8. pyhton-miniblink
  9. 华为机试:拼接URL
  10. 6.复杂网络实验六:SIR病毒传播模型(matlab)