详解 Benders 分解与一个算例的 python 代码

58 篇文章 36 订阅
22 篇文章 40 订阅
本文详细介绍了Benders分解法的概念、线性规划模型及其对偶模型,以及如何应用于求解混合整数规划问题。通过一个具体的例子展示了Benders分解的迭代过程,包括求解主问题、子问题,添加可行性切平面和最优性切平面,以及在分支定界中的应用。最后给出了Python代码实现。
摘要由CSDN通过智能技术生成

听说过 benders 分解几年了,在生产管理、路径规划与选址问题中经常应用,一直没有细看,最近论文里面也见到,还是有必要了解一下它的基本思想与用法的。

1. 基本思想

benders 分解比较适合求解一些大规模的混合整数规划问题,它的基本思想是:将原问题的求解变量分为两部分,同时也将原问题分解成一个两阶段问题:主问题与子问题;随便初始化子问题的目标函数值,然后求解主问题得到第一部分变量的值(或者随便初始化第一部分变量的值),再将第一部分变量的值代入子问题求解第二部分变量的值;根据子问题是否可行解以及无界解的情况,更新约束添加到主问题中,主问题的上下界也会发生变化;反复迭代,直到主问题的上界与下界十分接近为止。

注:现在 benders 有很多变种了,上面是经典 Benders 的基本思路。

例如下面一个混合整数规划问题:

问题 P1
max ⁡ 4 x 1 + 7 x 2 + 2 y 1 − 3 y 2 + y 3 s . t . 2 x 1 + 4 x 2 + 4 y 1 − 2 y 2 + 3 y 3 ≤ 12 3 x 1 + 5 x 2 + 2 y 1 + 3 y 2 − y 3 ≤ 10 x 1 ≤ 2 , x 2 ≤ 2 y 1 ≥ 0 , y 2 ≥ 0 , y 3 ≥ 0 x 1 , x 2  为整数 \begin{aligned} &\max\quad &4x_1+7x_2+2y_1-3y_2+y_3\\ &s.t.&\\ &&2x_1+4x_2+4y_1-2y_2+3y_3\leq 12\\ && 3x_1+5x_2+2y_1+3y_2-y_3\leq 10\\ &&x_1\leq 2, x_2\leq 2\\ &&y_1\geq 0,y_2\geq 0, y_3\geq 0\\ && x_1, x_2 ~为整数 \end{aligned} maxs.t.4x1+7x2+2y13y2+y32x1+4x2+4y12y2+3y3123x1+5x2+2y1+3y2y310x12,x22y10,y20,y30x1,x2 为整数

在用 benders 求解这个问题之前,先了解一些数学概念。

2. 线性规划模型与对偶模型

一般的混合整数规划问题可以抽象为下面的表达:
min ⁡ c T x + d T y s . t . A x + B y ≥ b y ≥ 0 x ∈ X \begin{aligned} &\min\quad &\bf{c^\mathrm{T}x+d^\mathrm{T}y}\\ &s.t.\\ &&\bf{Ax+By\geq b}\\ && \bf{y\geq 0}\\ && \bf{x\in X} \end{aligned} mins.t.cTx+dTyAx+Byby0xX

其中, X \bf{X} X 为变量 x \bf{x} x 的定义域,例如 X \bf{X} X 可以为整数集 Z \mathbb{Z} Z。对于一个固定值 x ‾ \bf\overline{x} x,剩余问题(residual problem)可以表示为:
min ⁡ d T y + c T x ‾ s . t . B y ≥ b − A x ‾ y ≥ 0 \begin{aligned} &\min\quad &&\bf{d^\mathrm{T}y+c^\mathrm{T}\overline{x}}\\ &s.t.\\ &&&\bf{By\geq b-A\overline{x}}\\ &&& \bf{y\geq 0} \end{aligned} mins.t.dTy+cTxBybAxy0

剩余问题的对偶问题为:
max ⁡ ( b − A x ‾ ) u + c T x ‾ s . t . B T u ≤ d u ≥ 0 \begin{aligned} &\max\quad &&\bf{(b-A\overline{x})u+c^\mathrm{T}\overline{x}}\\ &s.t.\\ &&&\bf{B^\mathrm{T}u\leq d}\\ &&& \bf{u\geq 0} \end{aligned} maxs.t.(bAx)u+cTxBTudu0

3. 线性规划的几何意义

3.1 多面体

线性规划的定义域 { x ∣ A x ≥ b } \bf \{x|Ax\geq b\} {x∣Axb} 为一个多面体,例如下面的图形为多面体:

从图形中可以看出,多面体是一个凸集。

3.2 极点与极射线

  • 极点

多面体的顶点也被称为极点(extreme point),它的定义为:对于多面体 P \bf P P, 若在多面体内找不到任意两个不同于 x \bf x x 的点 y , z \bf y, z y,z 以及一个标量 λ ∈ [ 0 , 1 ] \lambda\in[0, 1] λ[0,1], 使得 x = λ y + ( 1 − λ ) z \bf{x}=\lambda \bf{y}+(1-\lambda)\bf{z} x=λy+(1λ)z,则 x \bf x x 为极点。(即 x \bf x x 不在多面体内任何两点的连线里)

极点可以通过求解这个线性规划,得出的最优解即为一个极点。因为线性规划的最优解总存在于极点上。或者令 n 个线性无关的约束条件取等号,解方程得出,其中 n 为多面体的维度。

  • 射线

多面体的射线定义为:对于一个向量 r \bf r r, 若对于多面体 P \bf P P 的任何一点 x \bf x x 以及任意非负标量 λ \lambda λ,都有 x + λ r ∈ P \bf x+\lambda r\in P x+λrP,则称 r \bf r r 为多面体 P \bf P P 的射线。

例如,下面这个多面体中的箭头,都是该多面体的射线。
在这里插入图片描述

  • 极射线

多面体的极射线定义为:对于多面体 P \bf P P 中任何两个线性无关的射线 r 1 \bf r_1 r1 r 2 \bf r_2 r2,若射线 r \bf r r 不能表示为 r = λ 1 r 1 + λ 2 r 2 \bf{r}= \lambda_1\bf{r_1}+\lambda_2\bf{r_2} r=λ1r1+λ2r2,其中 λ 1 , λ 2 \lambda_1, \lambda_2 λ1,λ2 为大于零的标量,则 r \bf r r 为多面体的极射线。

几何意义:多面体边界上的射线是极射线。

要求出极射线,要用到它的另一个定义:对于一个多面体 { x ∣ A x ≥ b } \bf\{x|Ax\geq b\} {x∣Axb},它的多面锥(又称退化锥,因为是从多面体退化的)为 { x ∣ A x ≥ 0 } \bf\{x|Ax\geq 0\} {x∣Ax0},假设 x \bf x x n n n 个维度,则 n-1 个线性无关的约束条件取等号,同时满足剩下的那个条件,则可以求出一个极射线。

注:极射线是一个向量,因此极射线可以有多个解,可以通过求解一个带辅助变量的线性规划问题得出(辅助变量为一个0-1变量,目标函数为这个辅助变量值最大,约束条件中:随便选取 n-1 个约束取等号放进去,剩下那个约束也放进去,随便让其中一个变量等于 1)。

根据 《Introduction to linear optimization》一书 179 页,存在无界解时,单纯形表中,判断无界解的那一列的向量取负号,即 d = − c B B − A j d=-c_BB^-A_j d=cBBAj,即为一个极射线。

3.3 极射线、有界性、可行解的一些性质

一些定理或推论在理解 benders 添加 cuts 时会用到:

  • 弱对偶性:若原问题无界,则对偶问题无可行解;若对偶问题无界,则原问题无可行解;若原问题无可行解,则对偶问题无界或无可行解。

  • 一个多面体若存在极射线,则该多面体无界。

  • 对于一个线性规划问题: min ⁡ { c T x ∣ A x ≥ b } \bf\min\{c^\mathrm{T}x| Ax\geq b\} min{cTx∣Axb},假设可行域至少存在一个极点,若该线性规划问题无界,则等同于存在一个极射线 d \bf d d,使得 c T d ≤ 0 \bf c^Td\leq 0 cTd0

  • 同理,对于一个最大化的线性规划问题: max ⁡ { c T x ∣ A x ≤ b } \bf\max\{c^\mathrm{T}x| Ax\leq b\} max{cTx∣Axb},假设可行域至少存在一个极点,若该线性规划问题无界,则等同于存在一个极射线 d \bf d d,使得 c T d ≥ 0 \bf c^\mathrm{T}d\geq 0 cTd0

  • 对于一个线性规划问题: min ⁡ { c T x ∣ A x ≥ b } \bf\min\{c^\mathrm{T}x| Ax\geq b\} min{cTx∣Axb},它有界时,存在可行解的充要条件是:它对偶问题的多面体 { u ∣ A T u ≤ c } \bf\{u| A^\mathrm{T}u\leq c\} {u∣ATuc}所有的极射线 r t \bf r_t rt r t T b ≤ 0 ,    t = 1 , 2 , … , T \mathbf{r^\mathrm{T}_tb\leq 0}, ~~ t=1,2,\dots, T rtTb0,  t=1,2,,T。(假设有 T T T 个极射线,若对偶问题是无界的,就要找到它的一个极射线,加上这个 cut 约束。)

(结论似乎来自于 Farkas’ Lemma,见课本 Laurence A. Wolsey - Integer programming (2021),236页,但其他资料里没有看到 Farkas’ Lemma 的这个结论)

  • 对于一个线性规划问题: min ⁡ { c T x ∣ A x ≥ b } \bf\min\{c^\mathrm{T}x| Ax\geq b\} min{cTx∣Axb},若它的对偶问题存在可行解,它对偶问题的多面体 { u ∣ A T u ≤ c } \bf\{u| A^\mathrm{T}u\leq c\} {u∣ATuc} S S S 个极点为 u s T ,    t = 1 , 2 , … , S \mathbf{u_s^T}, ~~ t=1,2,\dots, S usT,  t=1,2,,S,设原问题最优值为 η \eta η,则满足:
    η = max ⁡ s = 1 , 2 , … , S u s T b \eta=\max_{s=1,2,\dots, S}\mathbf{u_s^\mathrm{T}}b η=s=1,2,,SmaxusTb

上面的式子等价于下面的线性规划:
max ⁡ η u s T b ≤ η s = 1 , 2 , … , S \begin{aligned} \max\quad &\eta\\ &\mathbf{u_s^\mathrm{T}}b\leq \eta\quad s=1,2,\dots, S \end{aligned} maxηusTbηs=1,2,,S

这是由于原问题的目标函数值大于等于对偶问题的最优值,而对偶问题的最优值在它其中一个极点上达到。

3.4 Minkowski 定理

与上面两个性质相关的,还有一个 Minkowski 定理,又称作 Resolution 或 Fication 定理:

任何一个多面体 { x ∣ A x ≥ b } \bf\{x| Ax\geq b\} {x∣Axb},假设它有 S S S 个极点 x s \bf x_s xs T T T 个极射线 r t \bf r_t rt,则该多面体也等价于下面的表达式:

{ x ∣ x = ∑ s = 1 S λ s x s + ∑ t = 1 T v t r t , ∑ s = 1 S λ s = 1 , λ s ≥ 0 , v t ≥ 0 , ∀ s , ∀ t } \{\mathbf{x| x}=\sum_{s=1}^S \lambda_s\mathbf{x}_s+\sum_{t=1}^T v_t\mathbf{r}_t, \quad\sum_{s=1}^S \lambda_s=1,\quad \lambda_s\geq 0, v_t\geq 0, \forall s, \forall t\} {x∣x=s=1Sλsxs+t=1Tvtrt,s=1Sλs=1,λs0,vt0,s,t}

4 Bender’s 分解中的各种 problem

现在再回到第二部分的线性规划模型中,
原问题:
min ⁡ c T x + d T y s . t . A x + B y ≥ b y ≥ 0 x ∈ X \begin{aligned} &\min\quad &\bf{c^\mathrm{T}x+d^\mathrm{T}y}\\ &s.t.\\ &&\bf{Ax+By\geq b}\\ && \bf{y\geq 0}\\ && \bf{x\in X} \end{aligned} mins.t.cTx+dTyAx+Byby0xX

改写为两阶段问题,
第一阶段问题:
min ⁡ c T x + ϕ ( x ) s . t . x ∈ X \begin{aligned} &\min\quad &\bf{c^\mathrm{T}x+\phi(x)}\\ &s.t.\\ && \bf{x\in X} \end{aligned} mins.t.cTx+ϕ(x)xX

第二阶段问题 ϕ ( x ) \bf\phi(x) ϕ(x):
min ⁡ ϕ ( x ) = d T y s . t . B y ≥ b − A x ‾ y ≥ 0 \begin{aligned} &\min\quad &&\bf\phi(x)=\bf{d^\mathrm{T}y}\\ &s.t.\\ &&&\bf{By\geq b-A\overline{x}}\\ &&& \bf{y\geq 0} \end{aligned} mins.t.ϕ(x)=dTyBybAxy0

它的对偶问题:
max ⁡ ( b − A x ‾ ) T u s . t . B T u ≤ d u ≥ 0 \begin{aligned} &\max\quad &&\bf{(b-A\overline{x})^\mathrm{T}u}\\ &s.t.\\ &&&\bf{B^\mathrm{T}u\leq d}\\ &&& \bf{u\geq 0} \end{aligned} maxs.t.(bAx)TuBTudu0

设第二阶段问题 ϕ ( x ) \bf\phi(x) ϕ(x) 的最优值为 η \eta η,对偶问题的极射线为 r t T \mathbf{r}^T_t rtT,极点为 u s T \mathbf{u}^T_s usT.

根据第三部分的性质,原线性规划问题等价于 Bender’s master problem:
(主要源于 Minkowski 定理,查阅的相关资料没有怎么细讲这个结论怎么来的)

min ⁡ Z = c T x + η r t T ( b − A x ) ≤ 0 t = 1 , 2 , … T ( b − A x ) T u s ≤ η s = 1 , 2 , … S x ∈ X (BMP) \begin{aligned} \min\quad&Z=\mathbf{c^\mathrm{T}x+\eta}\\ &\mathbf{r_\mathrm{t}^\mathrm{T}(b-Ax)\leq 0}\quad t=1,2,\dots T\\ &\mathbf{(b-Ax)^\mathrm{T}u_\mathrm{s}\leq \eta}\quad s=1,2,\dots S\\ &\bf x\in X\tag{BMP} \end{aligned} minZ=cTx+ηrtT(bAx)0t=1,2,T(bAx)Tusηs=1,2,SxX(BMP)

由于对偶问题的极点或极射线可以有很多,全 master problem 的约束条件也非常多。在实际求解中,这两个约束条件是逐步添加进去的。

feasibility cut:
r t T ( b − A x ) ≤ 0 t = 1 , 2 , … T (1) \mathbf{r_t^\mathrm{T}(b-Ax)}\leq 0\quad t=1,2,\dots T \tag{1} rtT(bAx)0t=1,2,T(1)
这个约束条件保证 BMP 问题可行。

optimality cut:
( b − A x ) T u s ≤ η s = 1 , 2 , … S (2) \mathbf{(b-Ax)^\mathrm{T}u_s\leq \eta}\quad s=1,2,\dots S \tag{2} (bAx)Tusηs=1,2,S(2)
这个约束条件意味着第二阶段的最优值一定大于等于对偶问题所有极点的目标函数值。

5. 迭代过程中的 subproblem 与 master problem

第一阶段问题结合第二阶段问题的对偶问题,可以写成一个 subproblem,命名为 DSP:
max ⁡ u ( b − A x ‾ ) T u + c T x ‾ s . t . B T u ≤ d u ≥ 0 (DSP) \begin{aligned} &\max_\mathbf{u}\quad &&\bf{(b-A\overline{x})^\mathrm{T}u+c^\mathrm{T}\overline{x}}\\ &s.t.\\ &&&\bf{B^\mathrm{T}u\leq d}\\\tag{DSP} &&& \bf{u\geq 0} \end{aligned} umaxs.t.(bAx)Tu+cTxBTudu0(DSP)

若代入DSP问题的 x ‾ \bf\overline{x} x 值为原问题的可行解,则DSP问题的目标函数值为原问题的一个上界 Z u b Z^{ub} Zub

而 Benders 分解在迭代时求解的主问题 master peroblem 的松弛问题如下,命名为 BR:

min ⁡ x Z l b = c T x + η cuts x ∈ P X (BR) \begin{aligned} \min_\mathbf{x}\quad&Z^{lb}=\mathbf{c^\mathrm{T}x+\eta}\\ \tag{BR} &\text{cuts}\\ &\bf x\in P_X \end{aligned} xminZlb=cTx+ηcutsxPX(BR)

其中的 cuts 是逐步放进去的, P X \bf P_X PX x \bf x x 的松弛定义域,例如整数定义域可以松弛为实数。由于约束条件并不完整,所以它求解的目标函数值比原函数更小,为原问题的下界 Z l b Z^{lb} Zlb

由于原问题一般为混合整数规划问题,一般 Benders 分解要结合分支定界来求解。

6. 迭代步骤

Benders 分解更具体的原理是:反复求解问题 BR 与问题 DSP,更新原问题的上下界,直到上下界很小为止;其中,求解 DSP 问题后,根据问题 DSP 解的情形,添加不同的 cuts 进入到问题 BR 中。

  • 将原问题转化为标准形式,不然影响到对偶问题解的符号。

  • 若 DSP 问题无界,添加 feasibility cut 到 BR 中。

  • 若 DSP 问题有可行解,添加 optimality cut 到 BR 中。

  • 若 DSP 问题无可行解,也表明原问题无可行解(原问题也可能无界,但无界就没必要求了,分支定界时终止这个分支)

实际在求解过程中,还可能结合分支定界对整数变量不断分支求解。

  • 对于分支定界时,要检查 DSP 中的 ϕ ( x ) = ( b − A x ‾ ) T u \phi(\bf x)=\bf{(b-A\overline{x})^{\mathrm{T}}u} ϕ(x)=(bAx)Tu 是否等于 BR 中求得的 η \eta η 值,若相等,表明 DSP 问题对于给定的 x ‾ \overline{x} x 值是最优的:此时要检查 x ‾ \overline{x} x 是否为整数解,若不是,则开始分支,若是,则存储解并更新问题的上界;若 ϕ ( x ) < η \phi(\bf x)<\eta ϕ(x)<η,则添加 feasibility cut 到 BR 中继续迭代。

7. 具体例子求解

对于本文最初的问题 P1,应用 Bender’s 分解的详细步骤为:

原问题:

max ⁡ 4 x 1 + 7 x 2 + 2 y 1 − 3 y 2 + y 3 s . t . 2 x 1 + 4 x 2 + 4 y 1 − 2 y 2 + 3 y 3 ≤ 12 3 x 1 + 5 x 2 + 2 y 1 + 3 y 2 − y 3 ≤ 10 x 1 ≤ 2 , x 2 ≤ 2 y 1 ≥ 0 , y 2 ≥ 0 , y 3 ≥ 0 x 1 , x 2  为整数 \begin{aligned} &\max\quad &4x_1+7x_2+2y_1-3y_2+y_3\\ &s.t.&\\ &&2x_1+4x_2+4y_1-2y_2+3y_3\leq 12\\ && 3x_1+5x_2+2y_1+3y_2-y_3\leq 10\\ &&x_1\leq 2, x_2\leq 2\\ &&y_1\geq 0,y_2\geq 0, y_3\geq 0\\ && x_1, x_2 ~为整数 \end{aligned} maxs.t.4x1+7x2+2y13y2+y32x1+4x2+4y12y2+3y3123x1+5x2+2y1+3y2y310x12,x22y10,y20,y30x1,x2 为整数

为了方便,改成最小化问题:

min ⁡ − 4 x 1 − 7 x 2 − 2 y 1 + 3 y 2 − y 3 s . t . − 2 x 1 − 4 x 2 − 4 y 1 + 2 y 2 − 3 y 3 ≥ − 12 − 3 x 1 − 5 x 2 − 2 y 1 − 3 y 2 + y 3 ≥ − 10 y 1 ≥ 0 , y 2 ≥ 0 , y 3 ≥ 0 x 1 , x 2  为整数且 − x 1 ≥ − 2 , − x 2 ≥ − 2 \begin{aligned} &\min\quad &-4x_1-7x_2-2y_1+3y_2-y_3\\ &s.t.&\\ &&-2x_1-4x_2-4y_1+2y_2-3y_3\geq -12\\ && -3x_1-5x_2-2y_1-3y_2+y_3\geq -10\\ &&y_1\geq 0,y_2\geq 0, y_3\geq 0\\ && x_1, x_2 ~为整数且 -x_1\geq -2, -x_2\geq -2 \end{aligned} mins.t.4x17x22y1+3y2y32x14x24y1+2y23y3123x15x22y13y2+y310y10,y20,y30x1,x2 为整数且x12,x22

迭代时主要用到 b , A , B , c , d \bf b,A, B, c, d b,A,B,c,d,几个矩阵的取值分别为:

b = [ − 12 − 10 ] A = [ − 2    − 4 − 3    − 5 ] B = [ − 4 2 − 3 − 2 − 3 1 ] c = [ − 4 − 7 ] d = [ − 2 3 − 1 ] b=\left[ \begin{aligned} -12\\ -10 \end{aligned} \right] A=\left[ \begin{aligned} -2 ~~&-4\\ -3~~&-5 \end{aligned} \right] B=\left[ \begin{aligned} &-4 &2 &&-3\\ &-2 &-3 &&1 \end{aligned} \right] c=\left[ \begin{aligned} -4\\ -7 \end{aligned} \right] d=\left[ \begin{aligned} -2\\ 3\\ -1 \end{aligned} \right] b=[1210]A=[2  3  45]B=[422331]c=[47]d= 231

它的第二阶段问题 ϕ ( x ) \phi(\bf x) ϕ(x)为:
max ⁡ u ϕ ( x ) = ( b − A x ‾ ) T u s . t . B T u ≤ d u ≥ 0 \begin{aligned} &\max_\mathbf{u}\quad &&\bf{\phi(x)=(b-A\overline{x})^\mathrm{T}u}\\ &s.t.\\ &&&\bf{B^\mathrm{T}u\leq d}\\ &&& \bf{u\geq 0} \end{aligned} umaxs.t.ϕ(x)=(bAx)TuBTudu0

注意:我们假设它的最优值为 η \eta η,即 η = ϕ ( x ∗ ) \eta=\phi(\mathbf{x^\ast}) η=ϕ(x).

  • 第一步

初始化原问题目标函数值的上界 Z u b Z^{ub} Zub 为正无穷,下界 Z l b Z^{lb} Zlb 为负无穷。

由于 master problem 里需要用到 η \eta η (第二阶段问题 ϕ ( x ) \bf\phi(x) ϕ(x) 的最优值为 η \eta η),我们随机猜测一个界值。由于第二阶段问题为最大化,随机猜测它的下界为 -200.

master problem BR:
min ⁡ x Z l b = c T x + η cuts x ∈ P X (BR) \begin{aligned} \min_\mathbf{x}\quad&Z^{lb}=\mathbf{c^Tx+\eta}\\ \tag{BR} &\text{cuts}\\ &\bf x\in P_X \end{aligned} xminZlb=cTx+ηcutsxPX(BR)

对于这个数例,将 x \bf x x 的整数约束松弛掉,加入 η \eta η 的下界,则 BR 为:

min ⁡ x Z l b = − 4 x 1 − 7 x 2 + η η ≥ − 200 0 ≤ x 1 ≤ 2 , 0 ≤ x 2 ≤ 2 (BR) \begin{aligned} \min_\mathbf{x}\quad&Z^{lb}=-4x_1-7x_2+\eta\\ \tag{BR} &\eta\geq -200\\ &0\leq x_1\leq 2, 0\leq x_2\leq 2 \end{aligned} xminZlb=4x17x2+ηη2000x12,0x22(BR)
此时还没有 cuts 约束。求解上面的线性规划问题,得到: x 1 = 2 , x 2 = 2 , η = − 200 , Z l b = − 222 x_1=2, x_2=2,\eta=-200, Z^{lb}=-222 x1=2,x2=2,η=200,Zlb=222.

(其实也可以随机初始化一组 x \bf x x 值,代入 DSP 问题中求解得到一个初始的 η \eta η 下界)

  • 第二步
    求解 subproblem DSP:
    max ⁡ u ( b − A x ‾ ) T u + c T x ‾ s . t . B T u ≤ d u ≥ 0 (DSP) \begin{aligned} &\max_\mathbf{u}\quad &&\bf{(b-A\overline{x})^\mathrm{T}u+c^\mathrm{T}\overline{x}}\\ &s.t.\\ &&&\bf{B^\mathrm{T}u\leq d}\\\tag{DSP} &&& \bf{u\geq 0} \end{aligned} umaxs.t.(bAx)Tu+cTxBTudu0(DSP)

对于此数例,此时 x ‾ = ( 2 , 2 ) T \overline{\mathbf{x}}=(2, 2)^\mathrm{T} x=(2,2)T,DSP 模型具体为:
max ⁡ u 0 u 1 + 6 u 2 − 22 s . t . − 4 u 1 − 2 u 2 ≤ − 2 2 u 1 − 3 u 2 ≤ 3 − 3 u 1 + u 2 ≤ − 1 u 1 ≥ 0 , u 2 ≥ 0 (DSP) \begin{aligned} &\max_\mathbf{u}\quad &&0 u_1+6u_2-22\\ &s.t.\\ &&&-4u_1-2u_2\leq -2\\\tag{DSP} &&&2u_1-3u_2\leq 3\\ &&&-3u_1+u_2\leq -1\\ &&& u_1\geq 0, u_2\geq0 \end{aligned} umaxs.t.0u1+6u2224u12u222u13u233u1+u21u10,u20(DSP)

该 DSP 问题无界,它的一个极射线为 v = ( 1 , 3 ) T v=(1, 3)^T v=(1,3)T,就是其中一个约束条件的方向向量。

添加 feasibility cut:
v t T ( b − A x ) ≤ 0 \mathbf{v_t^\mathrm{T}(b-Ax)}\leq 0 vtT(bAx)0

即:
11 x 1 + 19 x 2 ≤ 42 11x_1+19x_2\leq 42 11x1+19x242

添加到 BR 问题中,得到:

min ⁡ x Z l b = − 4 x 1 − 7 x 2 + η η ≥ − 200 11 x 1 + 19 x 2 ≤ 42 0 ≤ x 1 ≤ 2 , 0 ≤ x 2 ≤ 2 (BR) \begin{aligned} \min_\mathbf{x}\quad&Z^{lb}=-4x_1-7x_2+\eta\\ \tag{BR} &\eta\geq -200\\ &11x_1+19x_2\leq 42\\ &0\leq x_1\leq 2, 0\leq x_2\leq 2 \end{aligned} xminZlb=4x17x2+ηη20011x1+19x2420x12,0x22(BR)
求解该 BR 问题得到: x = ( 0.36 , 2 ) T , η = − 200 \mathbf{x}=(0.36, 2)^\mathrm{T}, \eta=-200 x=(0.36,2)T,η=200,更新下界为 Z l b = − 214.45 Z^{lb}=-214.45 Zlb=214.45.

x \mathbf{x} x 值代入到 DSP 问题中,
max ⁡ u − 3.27 u 1 + 1.09 u 2 − 15.45 s . t . − 4 u 1 − 2 u 2 ≤ − 2 2 u 1 − 3 u 2 ≤ 3 − 3 u 1 + u 2 ≤ − 1 u 1 ≥ 0 , u 2 ≥ 0 (DSP) \begin{aligned} &\max_\mathbf{u}\quad && -3.27 u_1+1.09u_2-15.45\\ &s.t.\\ &&&-4u_1-2u_2\leq -2\\\tag{DSP} &&&2u_1-3u_2\leq 3\\ &&&-3u_1+u_2\leq -1\\ &&& u_1\geq 0, u_2\geq0 \end{aligned} umaxs.t.3.27u1+1.09u215.454u12u222u13u233u1+u21u10,u20(DSP)

求解得到 u = ( 0.4 , 0.2 ) T \mathbf{u}=(0.4, 0.2)^{\mathrm{T}} u=(0.4,0.2)T, 此时 ϕ ( x ) = − 3.27 u 1 + 1.09 u 2 = 1.09 > η = − 200 \phi(\mathbf{x})= -3.27 u_1+1.09u_2=1.09>\eta=-200 ϕ(x)=3.27u1+1.09u2=1.09>η=200, 需要添加 cut 返回 BR。

添加 optimality cut:
( b − A x ) T u s ≤ η \mathbf{(b-Ax)^\mathrm{T}u_s\leq \eta} (bAx)Tusη

也可以令第一个和第三个约束条件取等号得到极点,optimality cut 具体为:
7 5 x 1 + 13 5 x 2 − 34 5 ≤ η \frac{7}{5}x_1+\frac{13}{5}x_2-\frac{34}{5}\leq \eta 57x1+513x2534η

添加到 BR 中:
min ⁡ x Z l b = − 4 x 1 − 7 x 2 + η η ≥ − 200 11 x 1 + 19 x 2 ≤ 42 7 5 x 1 + 13 5 x 2 − 34 5 ≤ η 0 ≤ x 1 ≤ 2 , 0 ≤ x 2 ≤ 2 (BR) \begin{aligned} \min_\mathbf{x}\quad&Z^{lb}=-4x_1-7x_2+\eta\\ \tag{BR} &\eta\geq -200\\ &11x_1+19x_2\leq 42\\ & \frac{7}{5}x_1+\frac{13}{5}x_2-\frac{34}{5}\leq \eta\\ &0\leq x_1\leq 2, 0\leq x_2\leq 2\\ \end{aligned} xminZlb=4x17x2+ηη20011x1+19x24257x1+513x2534η0x12,0x22(BR)

得到解 x = ( 2 , 1.0526 ) T \mathbf{x} = (2, 1.0526)^{\mathrm{T}} x=(2,1.0526)T, η = − 1.26 \eta=-1.26 η=1.26,更新下界 Z l b = − 16.4 Z^{lb}=-16.4 Zlb=16.4.

代入到DSP 问题中,
max ⁡ u − 3.79 u 1 + 1.26 u 2 − 15.37 s . t . − 4 u 1 − 2 u 2 ≤ − 2 2 u 1 − 3 u 2 ≤ 3 − 3 u 1 + u 2 ≤ − 1 u 1 ≥ 0 , u 2 ≥ 0 (DSP) \begin{aligned} &\max_\mathbf{u}\quad && -3.79 u_1+1.26u_2-15.37\\ &s.t.\\ &&&-4u_1-2u_2\leq -2\\\tag{DSP} &&&2u_1-3u_2\leq 3\\ &&&-3u_1+u_2\leq -1\\ &&& u_1\geq 0, u_2\geq0 \end{aligned} umaxs.t.3.79u1+1.26u215.374u12u222u13u233u1+u21u10,u20(DSP)

得到 u = ( 0.4 , 0.2 ) T \mathbf{u}=(0.4, 0.2)^{\mathrm{T}} u=(0.4,0.2)T,并且 ϕ ( x ) = − 3.79 u 1 + 1.26 u 2 = 1.26 = η \phi(\mathbf{x})= -3.79 u_1+1.26u_2=1.26=\eta ϕ(x)=3.79u1+1.26u2=1.26=η

  • 第三步

由于 x \bf x x 不为整数值,并且 ϕ ( x ) = η \phi(\mathbf{x})=\eta ϕ(x)=η,对 x 2 x_2 x2 进行分支,

分支 x 2 ≤ 1 x_2\leq 1 x21 添加到 BR 中,
min ⁡ x Z l b = − 4 x 1 − 7 x 2 + η η ≥ − 200 11 x 1 + 19 x 2 ≤ 42 7 5 x 1 + 13 5 x 2 − 34 5 ≤ η 0 ≤ x 1 ≤ 2 , 0 ≤ x 2 ≤ 2 x 2 ≤ 1 (BR) \begin{aligned} \min_\mathbf{x}\quad&Z^{lb}=-4x_1-7x_2+\eta\\ \tag{BR} &\eta\geq -200\\ &11x_1+19x_2\leq 42\\ & \frac{7}{5}x_1+\frac{13}{5}x_2-\frac{34}{5}\leq \eta\\ &0\leq x_1\leq 2, 0\leq x_2\leq 2\\ &x_2\leq 1 \end{aligned} xminZlb=4x17x2+ηη20011x1+19x24257x1+513x2534η0x12,0x22x21(BR)
得到 x = ( 2 , 1 ) T \mathbf{x} = (2, 1)^{\mathrm{T}} x=(2,1)T η = − 1.4 \eta=-1.4 η=1.4

代入到 DSP 问题中,
max ⁡ u − 4 u 1 + u 2 − 15 s . t . − 4 u 1 − 2 u 2 ≤ − 2 2 u 1 − 3 u 2 ≤ 3 − 3 u 1 + u 2 ≤ − 1 u 1 ≥ 0 , u 2 ≥ 0 (DSP) \begin{aligned} &\max_\mathbf{u}\quad && -4 u_1+u_2-15\\ &s.t.\\ &&&-4u_1-2u_2\leq -2\\\tag{DSP} &&&2u_1-3u_2\leq 3\\ &&&-3u_1+u_2\leq -1\\ &&& u_1\geq 0, u_2\geq0 \end{aligned} umaxs.t.4u1+u2154u12u222u13u233u1+u21u10,u20(DSP)

得到 u = ( 0.4 , 0.2 ) T \mathbf{u}=(0.4, 0.2)^{\mathrm{T}} u=(0.4,0.2)T,并且 ϕ ( x ) = − 4 u 1 + u 2 = − 1.4 = η \phi(\mathbf{x})= -4 u_1+u_2=-1.4=\eta ϕ(x)=4u1+u2=1.4=η 。由于 x \bf x x 值可行,可以更新问题的上界,为 DSP 问题的目标函数值,即 Z u b = − 16.4 Z^{ub}=-16.4 Zub=16.4。发现它与下界 Z l b Z^{lb} Zlb 一样,这个分支终止,并存储该解。

(感觉由于上下界已经一样,下面的步骤可以不要了)

  • 第四步
    分支 x 2 ≥ 2 x_2\geq 2 x22 添加到 BR 中,
    min ⁡ x Z l b = − 4 x 1 − 7 x 2 + η η ≥ − 200 11 x 1 + 19 x 2 ≤ 42 7 5 x 1 + 13 5 x 2 − 34 5 ≤ η 0 ≤ x 1 ≤ 2 , 0 ≤ x 2 ≤ 2 x 2 ≥ 2 (BR) \begin{aligned} \min_\mathbf{x}\quad&Z^{lb}=-4x_1-7x_2+\eta\\ \tag{BR} &\eta\geq -200\\ &11x_1+19x_2\leq 42\\ & \frac{7}{5}x_1+\frac{13}{5}x_2-\frac{34}{5}\leq \eta\\ &0\leq x_1\leq 2, 0\leq x_2\leq 2\\ &x_2\geq 2 \end{aligned} xminZlb=4x17x2+ηη20011x1+19x24257x1+513x2534η0x12,0x22x22(BR)
    得到 x = ( 0.36 , 2 ) T \mathbf{x} = (0.36, 2)^{\mathrm{T}} x=(0.36,2)T η = − 1.09 \eta=-1.09 η=1.09 Z l b = − 16.54 Z^{lb}=-16.54 Zlb=16.54。还没有之前的下界好,这个下界不存储。

代入到 DSP 问题中:
max ⁡ u − 3.28 u 1 + 1.08 u 2 − 15.44 s . t . − 4 u 1 − 2 u 2 ≤ − 2 2 u 1 − 3 u 2 ≤ 3 − 3 u 1 + u 2 ≤ − 1 u 1 ≥ 0 , u 2 ≥ 0 (DSP) \begin{aligned} &\max_\mathbf{u}\quad && -3.28 u_1+1.08u_2-15.44\\ &s.t.\\ &&&-4u_1-2u_2\leq -2\\\tag{DSP} &&&2u_1-3u_2\leq 3\\ &&&-3u_1+u_2\leq -1\\ &&& u_1\geq 0, u_2\geq0 \end{aligned} umaxs.t.3.28u1+1.08u215.444u12u222u13u233u1+u21u10,u20(DSP)

得到极点 u = ( 0.4 , 0.2 ) T \mathbf{u}=(0.4, 0.2)^{\mathrm{T}} u=(0.4,0.2)T,并且 ϕ ( x ) = − 3.27 u 1 + 1.09 u 2 = − 1.09 = η \phi(\mathbf{x})= -3.27 u_1+1.09u_2=-1.09=\eta ϕ(x)=3.27u1+1.09u2=1.09=η,但是 x \bf x x 不是整数解,需要继续分支。

  • 第五步

分支 x 1 ≤ 0 x_1\leq 0 x10 添加到 BR 中,
min ⁡ x Z l b = − 4 x 1 − 7 x 2 + η η ≥ − 200 11 x 1 + 19 x 2 ≤ 42 7 5 x 1 + 13 5 x 2 − 34 5 ≤ η 0 ≤ x 1 ≤ 2 , 0 ≤ x 2 ≤ 2 x 2 ≥ 2 x 1 ≤ 0 (BR) \begin{aligned} \min_\mathbf{x}\quad&Z^{lb}=-4x_1-7x_2+\eta\\ \tag{BR} &\eta\geq -200\\ &11x_1+19x_2\leq 42\\ & \frac{7}{5}x_1+\frac{13}{5}x_2-\frac{34}{5}\leq \eta\\ &0\leq x_1\leq 2, 0\leq x_2\leq 2\\ &x_2\geq 2\\ &x_1\leq 0 \end{aligned} xminZlb=4x17x2+ηη20011x1+19x24257x1+513x2534η0x12,0x22x22x10(BR)
得到 x = ( 0 , 2 ) T \mathbf{x} = (0, 2)^{\mathrm{T}} x=(0,2)T η = − 1.6 \eta=-1.6 η=1.6 Z l b = − 15.6 Z^{lb}=-15.6 Zlb=15.6

代入到 DSP 问题中:
max ⁡ u − 4 u 1 + 0 u 2 − 14 s . t . − 4 u 1 − 2 u 2 ≤ − 2 2 u 1 − 3 u 2 ≤ 3 − 3 u 1 + u 2 ≤ − 1 u 1 ≥ 0 , u 2 ≥ 0 (DSP) \begin{aligned} &\max_\mathbf{u}\quad && -4 u_1+0u_2-14\\ &s.t.\\ &&&-4u_1-2u_2\leq -2\\\tag{DSP} &&&2u_1-3u_2\leq 3\\ &&&-3u_1+u_2\leq -1\\ &&& u_1\geq 0, u_2\geq0 \end{aligned} umaxs.t.4u1+0u2144u12u222u13u233u1+u21u10,u20(DSP)

得到极点 u = ( 0.4 , 0.2 ) T \mathbf{u}=(0.4, 0.2)^{\mathrm{T}} u=(0.4,0.2)T,并且 ϕ ( x ) = − 1.6 = η \phi(\mathbf{x})= -1.6=\eta ϕ(x)=1.6=η。存储该解,得到的上界为 -15.6,但是这个上界没有之前的好。

  • 第六步
    分支 x 1 ≥ 1 x_1\geq 1 x11 添加到 BR 中,
    min ⁡ x Z l b = − 4 x 1 − 7 x 2 + η η ≥ − 200 11 x 1 + 19 x 2 ≤ 42 7 5 x 1 + 13 5 x 2 − 34 5 ≤ η 0 ≤ x 1 ≤ 2 , 0 ≤ x 2 ≤ 2 x 2 ≥ 2 x 1 ≥ 1 (BR) \begin{aligned} \min_\mathbf{x}\quad&Z^{lb}=-4x_1-7x_2+\eta\\ \tag{BR} &\eta\geq -200\\ &11x_1+19x_2\leq 42\\ & \frac{7}{5}x_1+\frac{13}{5}x_2-\frac{34}{5}\leq \eta\\ &0\leq x_1\leq 2, 0\leq x_2\leq 2\\ &x_2\geq 2\\ &x_1\geq 1 \end{aligned} xminZlb=4x17x2+ηη20011x1+19x24257x1+513x2534η0x12,0x22x22x11(BR)

得不到可行解,终止。

综上,最优解为 x ∗ = ( 2 , 1 ) T \mathbf{x}^\ast = (2, 1)^{\mathrm{T}} x=(2,1)T,还可以求出 y ∗ = ( 0.1 , 0 , 1.2 ) T \mathbf{y}^\ast = (0.1, 0, 1.2)^{\mathrm{T}} y=(0.1,0,1.2)T,最优值 -16.4.

分支定界过程:

在这里插入图片描述
上面图片里的目标函数值改为负号。

8. python 代码

上述算例的 python 代码为:

该代码不完善,分支定界没有完全实现,以后再补充。

# -*- coding: utf-8 -*-
"""
Created on Sat Dec 18 20:47:40 2021

@author: zhen chen
@Email: chen.zhen5526@gmail.com

MIT Licence.

Python version: 3.8


Description: use benders method for a numerical example:
    
  max  4x_1+7x_2+2y_1-3y_2+y_3
s.t.
       2x_1+4x_2+4y_1-2y_2+3y_3 <= 12
       3x_1+5x_2+2y_1+3y_2-y_3 <= 10
       x_1 <= 2, x_2 <= 2 
       y_1 >= 0, y_2 >= 0, y_3 >= 0
       x_1, x_2 为整数
    
"""

from gurobipy import *
import numpy as np
import math


# \dsp(x) of the second stage problem, where x is given 
def DSP(x):
    global b 
    global A
    global B
    global c
    global d
    
    n = len(b) # the number of decision varibales in the second stage
    
    try:
        m2 = Model("second-stage")
        u = m2.addMVar(n, vtype=GRB.CONTINUOUS) # gurobi currently support only for 1-D MVar objects, not 2-D
        
        # Set objective
        coe = b - A@x
        
        m2.setObjective(coe @ u, GRB.MAXIMIZE)
        m2.addConstr(B.T @ u <= d)
        
        m2.update()
        #m2.setParam('DualReductions', 0)
        m2.Params.InfUnbdInfo = 1  # or m2.setParam('InfUnbdInfo', 1), Determines whether simplex (and crossover) will compute additional information when a model
                                   # is determined to be infeasible or unbounded
        m2.optimize()
        
        if m2.Status == 5: # model is unbounded
            v = m2.unbdray
            return m2.Status, v # 若无界返回求解状态与基射线
        if m2.Status == 2: # model is optimal
            nita = m2.objVal
            u_value = [u.X[i] for i in range(n)]
            return m2.Status, u_value, nita  # 若有可行解,返回求解状态与可行值
            
        # if m2.Status == 3:
        #     print("Model is infeasible")
        #     m2.computeIIS()
        #     m2.write("model.ilp")
    except GurobiError as e:
        print('Error code ' + str(e.errno) + ": " + str(e))




b = np.array([-12, -10])
A = np.array([[-2, -4], [-3, -5]])
B = np.array([[-4, 2, -3], [-2, -3, 1]])
c = np.array([-4, -7])
d = np.array([-2, 3, -1])
DSP([1, 1])
    
try:     
    z_ub = GRB.INFINITY
    z_lb = -GRB.INFINITY
    
    # initialize a lower bound for second stage problem
    nita_lb = -200 
    
    n = len(c) # the number of decision varibales in the first stage
    m1 = Model("first-stage")
    x = m1.addMVar(n, ub = 2, vtype=GRB.CONTINUOUS) # gurobi currently support only for 1-D MVar objects, not 2-D
    nita = m1.addMVar(1, lb = -GRB.INFINITY, vtype=GRB.CONTINUOUS)
    
    m1.addConstr(nita >= nita_lb)
    m1.setObjective(c @ x + nita, GRB.MINIMIZE)
    m1.optimize()
    
    x_value = [x.X[i] for i in range(n)]
    z_lb = m1.objVal
    
    last_nita_value = -GRB.INFINITY # nita 的一个初始值,若迭代时 nita 的值不发生变化,则开始分支定界
    all_integer = [False for i in range(n)] # 判断决策变量是不是整数型
    while abs(z_ub - z_lb) > 1e-6:
        result = DSP(x_value)
        if result[0] == 5: # 无界
            ray = result[1]
            m1.addConstr(ray@b - ray@A@x <= 0) # 添加 feasibility cut
            
            m1.update()
            m1.optimize()
            x_value = [x.X[i] for i in range(n)]
            z_lb = m1.objVal           
            print()
        if result[0] == 2: # 可行解
            u_value = result[1]
            nita_value = result[2]
            if abs(last_nita_value - nita_value) < 1e-6: # 开始分支定界
                for i in range(n):
                    if abs(x_value[i] - math.floor(x_value[i])) < 1e-6:
                        all_integer[i] = True
                    else:        
                        # 这里面的分支定界目前是不完善的,编程实现分支定界要用到递归,
                        # 即模型不断调用自己
                        m1.addConstr(x[i] <= math.floor(x_value[i]))
                        break
                if sum(all_integer) == n:
                    z_ub = c @ x_value + nita_value
                    if abs(z_ub - z_lb) < 1e-6:
                        print('Obj: %g' % m1.objVal)
                        print('x = ')
                        print(x_value)
                        break
                               
            m1.addConstr(b@u_value - u_value@A@x <= nita) # 添加 optimality cut

            m1.update()            
            m1.optimize()
            x_value = [x.X[i] for i in range(n)]
            z_lb = m1.objVal
            last_nita_value = nita.X[0]  
    
    
except GurobiError as e:
    print('Error code ' + str(e.errno) + ": " + str(e))

except AttributeError:
    print('Encountered an attribute error')



参考文献12 3


  1. Laurence A. Wolsey - Integer programming, (2021), Second Edition ↩︎

  2. https://bookdown.org/edxu96/matrixoptim/benders-for-standard-milp.html ↩︎

  3. Bertsimas, Dimitris, and John N. Tsitsiklis. Introduction to linear optimization. Vol. 6. Belmont, MA: Athena Scientific, 1997. ↩︎

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心态与习惯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值