整数规划——第七章 分支定界算法
整数规划——第七章 分支定界算法
目前大部分整数规划商业软件如CPLEX,Gurobi和BARON等都是基于分枝定界算法框架的。
7.1 最优性条件和界
考虑下列一般线性整数规划问题:
(IP)mincTx,s.t. Ax≤b,x∈Z+n(7.1)
\text{(IP)}\quad\begin{aligned} &\min c^Tx,\\
&s.t.\ Ax\le b,\\
&\qquad x\in \Z_+^n
\end{aligned}\tag{7.1}
(IP)mincTx,s.t. Ax≤b,x∈Z+n(7.1)
其中 Z+n\Z_+^nZ+n 是 Rn\R^nRn 中的非负整数集合,给定(IP)的可行点 x∗x^*x∗ ,如何验证 x∗x^*x∗ 是(IP)的最优解?
设 f∗f^*f∗ 是(IP)的最优值,假设可以产生 f∗f^*f∗ 的下界序列满足:
f‾1≤f‾2≤⋯f‾k≤⋯≤f∗,
\underline{f}_1\le \underline{f}_2\le \cdots\underline{f}_k\le \cdots\le f^*,
f1≤f2≤⋯fk≤⋯≤f∗,
同时可以产生 f∗f^*f∗ 的上界序列满足
f‾1≥f‾2≥⋯≥f‾k≥⋯≥f∗
\overline{f}_1\ge \overline{f}_2\ge \cdots \ge\overline{f}_k\ge \cdots \ge f^*
f1≥f2≥⋯≥fk≥⋯≥f∗
若 f‾k−f‾k≤ε\overline f_k-\underline f_k\le \varepsilonfk−fk≤ε 对一个很小的 $\varepsilon \ge 0 $ 成立,则显然有
f∗−ε≤f‾k≤f∗
f^*-\varepsilon \le \underline{f}_k\le f^*
f∗−ε≤fk≤f∗
问题(IP)的任何可行解 xkx^kxk 都对应 f∗f^*f∗ 的一个上界 f(xk)=f‾kf(x^k)=\overline{f}_kf(xk)=fk,若 f‾k−f‾k≤ε>0\overline f_k-\underline f_k\le \varepsilon >0fk−fk≤ε>0,则 xkx^kxk 是一个 ε\varepsilonε 近似最优解,显然有如下定理:
定理7.1 设 {f‾k}\{\overline f_k\}{fk} 和 {f‾k}\{\underline f_k\}{fk} 是 f∗f^*f∗ 的上界序列和下界序列,若 f‾k−f‾k=0\overline f_k-\underline f_k=0fk−fk=0 且 xkx^kxk 是(IP)的可行解,f(xk)=f‾kf(x^k)=\overline f_kf(xk)=fk,则 xkx^kxk 是(IP)的最优解。
常用的求线性整数规划问题下界的方法有两种:线性规划松弛和对偶松弛。
定义7.1 线性规划
(LP)mincTx,s.t. Ax≤b,x∈R+n
\text{(LP)}\quad\begin{aligned} &\min c^Tx,\\
&s.t.\ Ax\le b,\\
&\qquad x\in \R_+^n
\end{aligned}
(LP)mincTx,s.t. Ax≤b,x∈R+n
成为整数规划(7.1)的线性规划松弛,也称为(LP)的连续松弛。
显然,(LP)的最优值总是(IP)的最优值的一个下界,易证下列性质:
定理7.2
- 若(LP)不可行,则(IP)也不可行;
- 设 x∗x^*x∗是(LP)的最优解且 x∗∈Znx^*∈\Z^nx∗∈Zn,则 x∗x^*x∗也是(IP)的最优解.
拉格朗日对偶松弛是另一种很有用的定界方法。考虑下面的整数规划问题:
(IP)mincTx,s.t. Ax≤b,x∈X(7.2)
\text{(IP)}\quad\begin{aligned} &\min c^Tx,\\
&s.t.\ Ax\le b,\\
&\qquad x\in X
\end{aligned}\tag{7.2}
(IP)mincTx,s.t. Ax≤b,x∈X(7.2)
此处 XXX 是一个整数集合,如 X={0,1}n,X={x∈Zn ∣ l≤x≤u}X=\{0,1\}^n,X=\{x\in \Z^n\ |\ l\le x\le u\}X={0,1}n,X={x∈Zn ∣ l≤x≤u}。设 λ∈R+m\lambda \in \R_+^mλ∈R+m,考虑朗格朗日松弛问题:
d(λ)=minx∈XcTx+λT(Ax−b)
d(\lambda)=\underset{x\in X}{\min}c^T x+\lambda^T(Ax-b)
d(λ)=x∈XmincTx+λT(Ax−b)
则对任意(7.2)的可行解 xxx 和 λ∈R+m\lambda \in \R_+^mλ∈R+m,有 d(λ)≤cTxd(\lambda) \le c^Txd(λ)≤cTx,故 d(λ)d(\lambda)d(λ) 是(IP)的一个下界,而最优的下界可以由下列对偶问题得到:
(D)maxλ∈R+m d(λ)
(D)\qquad \underset{\lambda\in \R_+^m}{\max}\ d(\lambda)
(D)λ∈R+mmax d(λ)
在许多情况下计算拉格朗日松弛界 d(λ)d(\lambda)d(λ) 往往很容易,如当 X={0,1}nX=\{0,1\}^nX={0,1}n 时 ,
d(λ)=−λTb+∑i=1nmin{0,ci+λTai}
d(\lambda) = -\lambda^Tb+\sum_{i=1}^n\min\{0,c^i+\lambda^Ta_i\}
d(λ)=−λTb+i=1∑nmin{0,ci+λTai}
其中 aia_iai 是 AAA 的第 iii 列。
7.2 分支定界方法:0-1背包问题
考虑以下0-1背包问题:
(0-1 KP)maxcTx,s.t. aTx≤b x∈{0,1}n
\text{(0-1 KP)}\qquad\begin{aligned}
&\max c^Tx, \\
& \text{s.t.}\ a^Tx\le b\\
&\quad\ \ \ x\in \{0,1\}^n
\end{aligned}
(0-1 KP)maxcTx,s.t. aTx≤b x∈{0,1}n
这里 ci>0,ai>0,i=1,...,nc_i>0,a_i>0,i=1,...,nci>0,ai>0,i=1,...,n,问题(0-1KP)的线性规划松弛为:
(CKP)maxcTx,s.t. aTx≤b x∈[0,1]n
\text{(CKP)}\qquad\begin{aligned}
&\max c^Tx, \\
& \text{s.t.}\ a^Tx\le b\\
&\quad\ \ \ x\in [0,1]^n
\end{aligned}
(CKP)maxcTx,s.t. aTx≤b x∈[0,1]n
使用贪心法来求解,将 {ciai}\{\cfrac{c_i}{a_i}\}{aici} 按降序排列,设:
c1a1≥c2a2≥⋯≥cnan(7.3)
\frac{c_1}{a_1} \ge \frac{c_2}{a_2}\ge \cdots\ge \frac{c_n}{a_n}\tag{7.3}
a1c1≥a2c2≥⋯≥ancn(7.3)
设 sss 是使下式成立的最大指标 kkk:
∑j=1kaj≤b(7.4)
\sum_{j=1}^ka_j\le b\tag{7.4}
j=1∑kaj≤b(7.4)
定理7.3 线性规划问题(CKP)的最优解为:
xj=1,j=1,...,sxj=0,j=s+2,...,nxs+1=(b−∑j=1saj)/as+1
\begin{aligned}
&x_j=1,\quad j=1,...,s\\
&x_j=0,\quad j=s+2,...,n\\
&x_{s+1}=(b-\sum_{j=1} ^sa_j)/a_{s+1}\\
\end{aligned}
xj=1,j=1,...,sxj=0,j=s+2,...,nxs+1=(b−j=1∑saj)/as+1
设 f∗f^*f∗ 是(0-1KP)的最优值,若 cjc_jcj 都是整数,则 f∗f^*f∗ 也是整数,故 f∗f^*f∗ 的一个上界为
z=∑j=1scj+⌊(b−∑j=1saj)cs+1/as+1⌋
z=\sum_{j=1} ^sc_j+\left\lfloor(b-\sum_{j=1}^s a_j)c_{s+1}/a_{s+1} \right\rfloor
z=j=1∑scj+⌊(b−j=1∑saj)cs+1/as+1⌋
例7.1 考虑下列0-1背包问题:
max8x1+11x2+6x3+4x4s.t. 5x1+7x2+5x3+3x4≤14x∈{0,1}4
\begin{aligned}
&\max 8x_1+11x_2+6x_3+4x_4\\
&\text{s.t.}\ 5x_1+7x_2+5x_3+3x_4\le 14\\
&\qquad x\in \{0,1\}^4
\end{aligned}
max8x1+11x2+6x3+4x4s.t. 5x1+7x2+5x3+3x4≤14x∈{0,1}4
应用定理7.3,该问题的线性规划松弛的最优解为 x=(1,1,12,0)Tx=(1,1,\cfrac{1}{2},0)^Tx=(1,1,21,0)T,对应的上界为 22。选择变量 x3x_3x3 进行分枝,固定 x3=0x_3=0x3=0 和 x3=1x_3=1x3=1,得到两个子问题:
(P1)max8x1+11x2+4x4s.t. 5x1+7x2+3x4≤14x1,x2,x3∈{0,1}
(P_1)\quad\begin{aligned}
&\max 8x_1+11x_2+4x_4\\
&\text{s.t.}\ 5x_1+7x_2+3x_4\le 14\\
&\qquad x_1,x_2,x_3\in \{0,1\}
\end{aligned}
(P1)max8x1+11x2+4x4s.t. 5x1+7x2+3x4≤14x1,x2,x3∈{0,1}
(P2)max6+8x1+11x2+4x4s.t. 5x1+7x2+3x4≤10x1,x2,x3∈{0,1} (P_2)\quad\begin{aligned} &\max 6+ 8x_1+11x_2+4x_4\\ &\text{s.t.}\ 5x_1+7x_2+3x_4\le 10\\ &\qquad x_1,x_2,x_3\in \{0,1\} \end{aligned} (P2)max6+8x1+11x2+4x4s.t. 5x1+7x2+3x4≤10x1,x2,x3∈{0,1}
子问题 (P1)(P_1)(P1) 的线性规划松弛的最优解为 (1,1,23)T(1,1,\cfrac{2}{3})^T(1,1,32)T,对应的上界为 z=21.67z=21.67z=21.67。子问题(P2)(P_2)(P2)的线性规划松驰的最优解为 (1,57,0)T(1,\cfrac{5}{7},0)^T(1,75,0)T,对应的上界为 z=21.86z=21.86z=21.86。分枝过程见图7.1.
选择子问题 (P2)(P_2)(P2),选择变量 x2x_2x2 进行分枝,固定 x2=0x_2=0x2=0 和 x2=1x_2=1x2=1 ,得到2个子问题:
(P3)max6+8x1+4x4s.t. 5x1+3x4≤10x1,x4∈{0,1}
(P_3)\quad\begin{aligned}
&\max 6+8x_1+4x_4\\
&\text{s.t.}\ 5x_1+3x_4\le 10\\
&\qquad x_1,x_4\in \{0,1\}
\end{aligned}
(P3)max6+8x1+4x4s.t. 5x1+3x4≤10x1,x4∈{0,1}
(P4)max17+8x1+4x4s.t. 5x1+3x4≤3x1,x4∈{0,1} (P_4)\quad\begin{aligned} &\max 17+8x_1+4x_4\\ &\text{s.t.}\ 5x_1+3x_4\le 3\\ &\qquad x_1,x_4\in \{0,1\} \end{aligned} (P4)max17+8x1+4x4s.t. 5x1+3x4≤3x1,x4∈{0,1}
子问题 (P3)(P_3)(P3) 的最优解为 (1,1)T(1,1)^T(1,1)T,对应原问题的一个可行解 x=(1,0,1,1)Tx=(1,0,1,1)^Tx=(1,0,1,1)T,目标函数值为 z=18z=18z=18。子问题 (P4)(P_4)(P4) 的线性规划松弛的最优解为 (1,35)T(1,\cfrac{3}{5})^T(1,53)T,对应的上界为 z=21.80z=21.80z=21.80,分支过程见图7.2。

选择子问题 (P4)(P_4)(P4) 并对 x1x_1x1 进行分枝,固定 x1=0x_1=0x1=0 和 x1=1x_1=1x1=1得到2个子问题:
(P5)max17+4x4s.t. 3x4≤3x4∈{0,1}
(P_5)\quad\begin{aligned}
&\max 17+4x_4\\
&\text{s.t.}\ 3x_4\le 3\\
&\qquad x_4\in \{0,1\}
\end{aligned}
(P5)max17+4x4s.t. 3x4≤3x4∈{0,1}
(P6)max25+4x4s.t. 3x4≤−2x4∈{0,1} (P_6)\quad\begin{aligned} &\max 25+4x_4\\ &\text{s.t.}\ 3x_4\le -2\\ &\qquad x_4\in \{0,1\} \end{aligned} (P6)max25+4x4s.t. 3x4≤−2x4∈{0,1}
易见,子问题 (P5)(P_5)(P5) 的最优解为 x4=1x_4=1x4=1,对应原问题的一个可行解 x=(1,1,0,1)Tx=(1,1,0,1)^Tx=(1,1,0,1)T,其目标函数值为 z=21z=21z=21 。而子问题 (P6)(P_6)(P6) 不可行。分枝过程见图7.3。因为节点1对应的
子问题 (P1)(P_1)(P1) 的上界为21.67且原问题的最优值为整数,故子问题 (P1)(P_1)(P1) 不可能产生
比 x=(1,1,0,1)Tx=(1,1,0,1)^Tx=(1,1,0,1)T更好的可行解。从而推断出所有 {0,1}4\{0,1\}^4{0,1}4 中没有比 x=(1,1,0,1)Tx=(1,1,0,1)^Tx=(1,1,0,1)T
更好的可行解,故 x=(1,1,0,1)Tx=(1,1,0,1)^Tx=(1,1,0,1)T 是原问题的最优解。
由上述例子可以看出,分枝定界过程中产生的子问题之间的关系是一树状结构,以后称之为分枝定界树或搜索树。分枝定界求解0-1背包问题的基本思想可以总结如下:
算法7.1(0-1背包问题分枝定界算法)
初始步.求解原问题的线性规划松弛,若得到整数解则也是原问题的最优解,否则得到原问题的一个上界.
- 分枝:选择适当的变量 xix_ixi,分别固定 xi=0x_i=0xi=0 和 xi=1x_i=1xi=1 得到2个子问题。
- 定界:选择一个子问题,求解该子问题的线性规划松弛。
- 剪枝:若发生下列情况之一,则可停止对该子问题进行分枝(剪枝):
- 子问题的线性规划松弛的最优解是整数解;
- 子问题不可行;
- 子问题的上界等于或小于已知的可行解的目标函数值。
最优性.重复上述过程直到分枝定界树中没有需要考虑的节点(子问题),当前最好的可行解就是原问题的最优解。
7.3 分支定界方法:一般线性整数规划
本节讨论下列一般线性整数规划问题:
(IP)mincTx,s.t. Ax≤b,x∈Z+n
\text{(IP)}\quad\begin{aligned} &\min c^Tx,\\
&s.t.\ Ax\le b,\\
&\qquad x\in \Z_+^n
\end{aligned}
(IP)mincTx,s.t. Ax≤b,x∈Z+n
记 S={x∈Z+m∣Ax≤b}S=\{x\in \Z_+^m|Ax\le b\}S={x∈Z+m∣Ax≤b}。求解0-1背包问题的算法7.1可以推广到一般整数规划问题,只要使用适当方法把子问题的可行域剖分为若干个小的子集,一般是把可行域分成2个部分,从而可以产生类似于0-1背包问题的分枝定界树。设子问题的线性规划松弛解为x0=(x10,...,xn0)Tx^0=(x_1^0,...,x_n^0)^Tx0=(x10,...,xn0)T,其中至少有一个 xi0x_i^0xi0 是分数。假设选取变量进行分枝,一种自然的剖分方法是分别设
xi≤⌊xi0⌋,xi≥⌊xi0⌋+1
x_i\le \left\lfloor x_i^0 \right\rfloor ,x_i\ge \left\lfloor x_i^0 \right\rfloor+1
xi≤⌊xi0⌋,xi≥⌊xi0⌋+1
⌊⌋\left\lfloor \right\rfloor⌊⌋ 表示取下整。则得到2个新的节点(子问题),如图7.4所示。显然,上述对整数规划可行域的剖分并不会丢失任何整数可行点。

选择分枝变量的基本策略是使分枝后的2个子问题的线性规划松弛界与当前问题的界之间的差别尽可能大,这样就有可能尽早进行剪枝。常用的方法是选取
i=argmax{min(xj0−⌊xj0⌋,⌈xj0⌉−xj0) ∣ xj0为分数}
i=\arg \max\{\min(x_j^0-\lfloor x_j^0 \rfloor ,\lceil x_j^0 \rceil -x_j^0)\ |\ x_j^0为分数\}
i=argmax{min(xj0−⌊xj0⌋,⌈xj0⌉−xj0) ∣ xj0为分数}
在分枝定界过程中,在剪枝后如何从搜索树中剩下的节点(子问题)中选择一个节点继续进行分枝也将影响整个分枝定界的收敛速度。常用的策略有
- 下界优先:总是选择下界最小的节点进行分枝,这里的下界可以是线性规划松弛界,或者是指该节点继承其父节点的下界
- 深度优先:把分枝定界树的层数(已分枝变量的个数)定义为节点的深度,深度优先策略是选择具有最大深度的节点进行分枝,从而能比较快地找到可行解。
例7.2 考虑下列线性整数规划问题:

该问题的线性规划松弛的最优单纯形表见表7.1,故线性规划松弛的最优解为 x=(207,3)Tx=\left(\cfrac{20}{7},3\right)^Tx=(720,3)T,问题的下界为 z=−597z=-\cfrac{59}{7}z=−759。选择 x1x_1x1 进行分枝,分别加入约束 x1≤2x_1\le2x1≤2和 x1≥3x_1\ge 3x1≥3 得到两个子问题,如图7.5。选择节点1,其对应的线性规划是节点0的线性规划加上约束 x1≤2x_1\le 2x1≤2,其可以表示为 x1+s=2,s≥0x_1+s=2,s\ge0x1+s=2,s≥0,在表7.1中, x1x_1x1 是基变量,可以用非基变量 x3x_3x3 和 x4x_4x4 表示,所以约束 x1≤2x_1\le 2x1≤2 可以表示为:
−17x3−27x4+s=−67
-\frac{1}{7}x_3-\frac{2}{7}x_4+s=-\frac{6}{7}
−71x3−72x4+s=−76

将上述约束加入表7.1,可得单纯形表7.2。易见,以 (x1,x2,x5,s)(x_1,x_2,x_5,s)(x1,x2,x5,s) 为基变量的解对偶可行。经过 2 次对偶单纯形迭代,可得到最优单纯形表7.3。故节点1对应的线性规划最优解为 x=(2,12)x=\left(2,\cfrac{1}{2}\right)x=(2,21) ,最优值为 z=−152z=-\cfrac{15}{2}z=−215 。选择分数变量 x2x_2x2 进行分枝,加入约束 x2≤0x_2≤0x2≤0 和 x2≥1x_2≥1x2≥1 得到2个子问题,见图7.6。应用深度优先选择节点3,其对应的线性规划的最优解为 x=(32,0)Tx=(\cfrac{3}{2},0)^Tx=(23,0)T,最优值为 z=−6z=-6z=−6 ,继续选择节点4其对应的线性规划具有整数最优解x=(2,1)Tx=(2,1)^Tx=(2,1)T ,最优值为 −7-7−7。


故节点3和4可以去除(剪枝),只剩下节点2需要考虑。把约束 x1≥3x_1≥3x1≥3 写为 x1−t=3,t≥0x_1-t=3,t≥0x1−t=3,t≥0。类似地,可以把这个约束用表7.1中的非基变量 x3x_3x3 和 x4x_4x4 表示:
17x3+27x4+t=−17
\frac{1}{7}x_3+\frac{2}{7}x_4+t=-\frac{1}{7}
71x3+72x4+t=−71
把该约束加入单纯形表7.1得表7.4。容易看出,该线性规划不可行.故分枝定界树里已经没有节点需要考虑,当前最好的可行解 x=(2,1)Tx=(2,1)^Tx=(2,1)T 就是原问题的最优解,见图7.7.


7.4 一般分支定界方法
考虑如下非线性整数规划问题:
(P)minf(x),s.t. gi(x)≤bi,i=1,...,m,hk(x)=ck,k,...,l,x∈X
\text{(P)}\qquad\begin{aligned} &\min f(x),\\
& \text{s.t.} \ g_i(x)\le b_i,\quad i=1,...,m,\\
& \qquad h_k(x)=c_k
,\quad k,...,l,\\
&\qquad x\in X
\end{aligned}
(P)minf(x),s.t. gi(x)≤bi,i=1,...,m,hk(x)=ck,k,...,l,x∈X
其中 fff,gig_igi 和 hkh_khk 是 Rn\R^nRn 中的实值函数,X∈ZnX\in \Z^nX∈Zn 是一个整数集合。
为了应用分枝定界的基本框架,需要
- 对§的子问题定界的方法,如凸整数规划问题的连续松弛、线性下逼近方法可分离整数规划的拉格朗日松弛和二次0-1规划的半定规划(SDP)松弛;
- 求可行解的启发式方法,如贪婪法和根据问题的特殊结构设计的求可行解程序。
以下记 (P(Xi))(P(X_i))(P(Xi)) 为§的一个子问题,其中 XiX_iXi 是 XXX 剖分后的子集,用 LLL 记分枝定界树中存储的节点(子问题)集合。一般分枝定界的基本框架可以描述如下:
- 步0(初始步):令 L=P(X)L={P(X)}L=P(X) ,利用启发式算法求得问题的一个初始可行点x∗,v∗=f(x∗)x^*,v^*=f(x^*)x∗,v∗=f(x∗)。若无初始可行解则令 v∗=+∞v^*=+∞v∗=+∞.
- 步1(选择节点):若 L=∅L=\emptyL=∅,停止,x∗x^*x∗ 是原问题的最优解。否则,从L中选择一个或多个节点,记为 Ls={P(X1),⋯,P(Xk)}L^s=\{P(X_1),\cdots,P(X_k)\}Ls={P(X1),⋯,P(Xk)}。令 i=1i=1i=1。
- 步2(定界):计算子问题 (P(Xi))(P(X_i))(P(Xi)) 的下界 LBiLB_iLBi 。如果 (P(Xi))(P(X_i))(P(Xi)) 不可行,则记LBi=+∞LB_i=+∞LBi=+∞。若 LBi≥v∗LB_i\ge v^*LBi≥v∗,转步5。若 (P(Xi))(P(X_i))(P(Xi)) 的松弛问题的最优解 x~\tilde{x}x~ 是整数解,若 x~\tilde{x}x~ 是比当前最好的可行解 x∗x^*x∗ 更好的解,更新 x∗x^*x∗,转步5。否则转步3。
- 步3(可行解):利用启发式算法寻找可行解,若有则更新当前最好的可行解 x∗x^*x∗
和上界 v∗v^*v∗。若 i<ki<ki<k ,令 i:=i+1i:=i+1i:=i+1,回到步2,否则转步4。 - 步4(分枝):如果 Ls=∅L^s=\emptyLs=∅,转步1,否则,从 LsL^sLs 选择节点 (P(Xi))(P(X_i))(P(Xi)) 。剖分 XiX_iXi
为若干子集 Lis={Xi1,⋯ ,Xip}L_i^s=\{X_i^1,\cdots,X_i^p\}Lis={Xi1,⋯,Xip} 并在 LsL^sLs 中用 LisL^s_iLis 对应的子问题替换 (P(Xi))(P(X_i))(P(Xi))。令
L:=L∪LsL:=L\cup L^sL:=L∪Ls。转步1。 - 步5(剪枝):从 LsL^sLs 中删除 (P(Xi))(P(X_i))(P(Xi)) 。若 i<ki<ki<k ,令 i:=i+1i:=i+1i:=i+1,回到步2,否则转步4。

上述分枝定界算法是概念性的,其算法效率取决于子问题的下界 LBiLB_iLBi 的质量和下界计算方法的效率。另一方面,算法的收敛速度与是否可以快速产生可行解也密切相关。在后面的章节中将介绍一些非线性整数规划的定界方法,如连续松弛和拉格朗日松弛等。
参考文献
- 整数规划 孙小玲,李瑞 北京,科学出版社 2010
更多推荐

所有评论(0)