建模实战|第八期:Benders Decomposition求解设施选址问题(FLP):理论及python代码实战

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值