听说过 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+2y1−3y2+y32x1+4x2+4y1−2y2+3y3≤123x1+5x2+2y1+3y2−y3≤10x1≤2,x2≤2y1≥0,y2≥0,y3≥0x1,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+By≥by≥0x∈X
其中,
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+cTxBy≥b−Axy≥0
剩余问题的对偶问题为:
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.(b−Ax)u+cTxBTu≤du≥0
3. 线性规划的几何意义
3.1 多面体
线性规划的定义域 { x ∣ A x ≥ b } \bf \{x|Ax\geq b\} {x∣Ax≥b} 为一个多面体,例如下面的图形为多面体:

从图形中可以看出,多面体是一个凸集。
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+λr∈P,则称 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∣Ax≥b},它的多面锥(又称退化锥,因为是从多面体退化的)为 { x ∣ A x ≥ 0 } \bf\{x|Ax\geq 0\} {x∣Ax≥0},假设 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=−cBB−Aj,即为一个极射线。
3.3 极射线、有界性、可行解的一些性质
一些定理或推论在理解 benders 添加 cuts 时会用到:
-
弱对偶性:若原问题无界,则对偶问题无可行解;若对偶问题无界,则原问题无可行解;若原问题无可行解,则对偶问题无界或无可行解。
-
一个多面体若存在极射线,则该多面体无界。
-
对于一个线性规划问题: min { c T x ∣ A x ≥ b } \bf\min\{c^\mathrm{T}x| Ax\geq b\} min{cTx∣Ax≥b},假设可行域至少存在一个极点,若该线性规划问题无界,则等同于存在一个极射线 d \bf d d,使得 c T d ≤ 0 \bf c^Td\leq 0 cTd≤0。
-
同理,对于一个最大化的线性规划问题: max { c T x ∣ A x ≤ b } \bf\max\{c^\mathrm{T}x| Ax\leq b\} max{cTx∣Ax≤b},假设可行域至少存在一个极点,若该线性规划问题无界,则等同于存在一个极射线 d \bf d d,使得 c T d ≥ 0 \bf c^\mathrm{T}d\geq 0 cTd≥0。
-
对于一个线性规划问题: min { c T x ∣ A x ≥ b } \bf\min\{c^\mathrm{T}x| Ax\geq b\} min{cTx∣Ax≥b},它有界时,存在可行解的充要条件是:它对偶问题的多面体 { u ∣ A T u ≤ c } \bf\{u| A^\mathrm{T}u\leq c\} {u∣ATu≤c} 中所有的极射线 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 rtTb≤0, 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∣Ax≥b},若它的对偶问题存在可行解,它对偶问题的多面体
{
u
∣
A
T
u
≤
c
}
\bf\{u| A^\mathrm{T}u\leq c\}
{u∣ATu≤c} 中
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∣Ax≥b},假设它有 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=1∑Sλsxs+t=1∑Tvtrt,s=1∑Sλs=1,λs≥0,vt≥0,∀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+By≥by≥0x∈X
改写为两阶段问题,
第一阶段问题:
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)x∈X
第二阶段问题
ϕ
(
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)=dTyBy≥b−Axy≥0
它的对偶问题:
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.(b−Ax)TuBTu≤du≥0
设第二阶段问题 ϕ ( 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(b−Ax)≤0t=1,2,…T(b−Ax)Tus≤ηs=1,2,…Sx∈X(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(b−Ax)≤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}
(b−Ax)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.(b−Ax)Tu+cTxBTu≤du≥0(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+ηcutsx∈PX(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)=(b−Ax)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+2y1−3y2+y32x1+4x2+4y1−2y2+3y3≤123x1+5x2+2y1+3y2−y3≤10x1≤2,x2≤2y1≥0,y2≥0,y3≥0x1,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.−4x1−7x2−2y1+3y2−y3−2x1−4x2−4y1+2y2−3y3≥−12−3x1−5x2−2y1−3y2+y3≥−10y1≥0,y2≥0,y3≥0x1,x2 为整数且−x1≥−2,−x2≥−2
迭代时主要用到 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=[−12−10]A=[−2 −3 −4−5]B=[−4−22−3−31]c=[−4−7]d= −23−1
它的第二阶段问题
ϕ
(
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)=(b−Ax)TuBTu≤du≥0
注意:我们假设它的最优值为 η \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+ηcutsx∈PX(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=−4x1−7x2+ηη≥−2000≤x1≤2,0≤x2≤2(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.(b−Ax)Tu+cTxBTu≤du≥0(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+6u2−22−4u1−2u2≤−22u1−3u2≤3−3u1+u2≤−1u1≥0,u2≥0(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(b−Ax)≤0
即:
11
x
1
+
19
x
2
≤
42
11x_1+19x_2\leq 42
11x1+19x2≤42
添加到 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=−4x1−7x2+ηη≥−20011x1+19x2≤420≤x1≤2,0≤x2≤2(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.09u2−15.45−4u1−2u2≤−22u1−3u2≤3−3u1+u2≤−1u1≥0,u2≥0(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}
(b−Ax)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+513x2−534≤η
添加到 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=−4x1−7x2+ηη≥−20011x1+19x2≤4257x1+513x2−534≤η0≤x1≤2,0≤x2≤2(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.26u2−15.37−4u1−2u2≤−22u1−3u2≤3−3u1+u2≤−1u1≥0,u2≥0(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
x2≤1 添加到 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=−4x1−7x2+ηη≥−20011x1+19x2≤4257x1+513x2−534≤η0≤x1≤2,0≤x2≤2x2≤1(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+u2−15−4u1−2u2≤−22u1−3u2≤3−3u1+u2≤−1u1≥0,u2≥0(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 x2≥2 添加到 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=−4x1−7x2+ηη≥−20011x1+19x2≤4257x1+513x2−534≤η0≤x1≤2,0≤x2≤2x2≥2(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.08u2−15.44−4u1−2u2≤−22u1−3u2≤3−3u1+u2≤−1u1≥0,u2≥0(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
x1≤0 添加到 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=−4x1−7x2+ηη≥−20011x1+19x2≤4257x1+513x2−534≤η0≤x1≤2,0≤x2≤2x2≥2x1≤0(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+0u2−14−4u1−2u2≤−22u1−3u2≤3−3u1+u2≤−1u1≥0,u2≥0(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 x1≥1 添加到 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=−4x1−7x2+ηη≥−20011x1+19x2≤4257x1+513x2−534≤η0≤x1≤2,0≤x2≤2x2≥2x1≥1(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')