1. 什么是Benders Decompositions
Benders Decompositions是一种用来解决有特殊结构问题的数学编程技术。它经常被用来解决大规模混合整数规划(mixed integer programming, MIP)问题。其主要思想是,将较复杂的模型分解成为2部分,分别求解2部分都较为容易,通过两部分之间的交互迭代,最终算法得到收敛,得到最优解。
一般的想法是利用其块结构特性将原始MIP问题划分(分解)为:
- Master Problem主问题 - usually harder, MIP problem,一般是关于整数变量y的,是复杂变量的问题
- Subproblem(s)子问题 - easier, LP problem(s),一般是关于连续变量x的,是简单变量的问题
但是,分别求解模型MP和SP并不能等同于求解了原MIP。要想达到等价地求解原MIP的目的,还需要MP和SP之间的交互。MP和SP之间的交互的方式是:通过求解 SP ,获得一些信息,这些信息反映了x 对 y 的影响,我们通过某种方式,将 x 对 y 的影响加回到 MP 中,进行补救。补救措施,是以两种cutting plane的形式加回到Master Problem主问题中,分别为[1]:
- Benders optimality cut
- Benders feasibility cut
更详细的原理参考这篇:
运小筹:优化算法 | Benders Decomposition: 一份让你满意的【入门-编程实战-深入理解】的学习笔记
2. 利用Benders Decompositions进行选址问题建模和具体步骤
2.1问题描述

2.2选址问题的原始MIP模型

2.3将原始MIP模型进行分解


(3)更新MP问题
根据Benders算法流程,我们向MP问题中添加Benders optimality cut和Benders feasibility cut,Benders主问题可以写为:

其中,K是子问题的对偶问题Dual SP的极点(extreme point,其实就是最优解)的集合
L是子问题的对偶问题Dual SP的极射线(extreme ray,其实就是无界射线)的集合
3.python调用gurobi实现Benders Decomposition求解FLP(Facility Location Problem)
核心代码:
import numpy as np
from gurobipy import *
from principle.input_data import InputData
class Subproblem:
def __init__(self, data, Q, E):
self.data = data
self.sub_problem = Model("sub_problem")
self.sub_problem.setParam('InfUnbdInfo', 1)
self.alpha = self.sub_problem.addVars([i for i in range(self.data['w_size'])],lb= -np.inf,ub= 0, name="alpha") # 资源约束的对偶变量
self.beta = self.sub_problem.addVars([j for j in range(self.data['r_size'])],lb= 0,ub= np.inf, name="beta") # 需求约束的对偶变量
self.Q = Q
self.E = E
self.subCon = [['' for _ in range(self.data['r_size'])] for _ in range(self.data['w_size'])]
def add_constrs(self):
# 子问题对偶问题添加约束
for i in range(self.data['w_size']):
for j in range(self.da


1万+

被折叠的 条评论
为什么被折叠?



