线性规划(整数规划)
文章目录
概述
数学规划中的变量(全部或部分)限制为整数时,称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。
数学模型
例1 合理下料问题
设用某型号的圆钢下零件 A 1 , A 2 , ⋯ , A m \text A_1,\text A_2,\cdots,\text A_\text m A1,A2,⋯,Am的毛坯。在一根圆钢上下料的方式有 B 1 , B 2 , ⋯ , B n \text B_1,\text B_2,\cdots,\text B_\text n B1,B2,⋯,Bn种,每种下料方式可以得到各种零件的毛坯数以及每种零件的需求量,如表所示。问怎样安排下料方式,使得既满足需要,所用的原材料又最少?
B 1 \text B_1 B1 | ⋯ \cdots ⋯ | B n \text B_\text n Bn | 零件毛坯数 | |
---|---|---|---|---|
A 1 \text A_1 A1 | a 11 a_{11} a11 | ⋯ \cdots ⋯ | a 1 n a_{1\ \text n} a1 n | b 1 \text b_1 b1 |
⋮ \vdots ⋮ | ⋮ \vdots ⋮ | ⋮ \vdots ⋮ | ⋮ \vdots ⋮ | |
A m \text A_\text m Am | a m 1 a_{\text m\ 1} am 1 | ⋯ \cdots ⋯ | a mn a_{\text m\text n} amn | b m \text b_\text m bm |
a ij a_{\text{ij}} aij表示用 B j \text B_\text j Bj种下料方式可以得到 A i \text A_\text i Ai零件的毛坯数。
设:
x
j
x_\text j
xj表示用
B
j
(
j
=
1
,
2
,
⋯
,
n
)
\text B_\text j(\text j=1,2,\cdots,\text n)
Bj(j=1,2,⋯,n)种方式下料根数。
min
z
=
∑
j
=
1
n
x
j
\min\quad z=\sum_{\text j=1}^\text nx_\text j
minz=j=1∑nxj
s.t. { ∑ j = 1 n a ij x j ≥ b i i = 1 , 2 , ⋯ , m x j ≥ 0 j = 1 , 2 , ⋯ , n x j ∈ Z j = 1 , 2 , ⋯ , n \text{s.t.}\quad \begin{cases} \sum\limits_{\text j=1}^\text na_{\text{ij}}x_\text j\ge \text b_\text i&\text i=1,2,\cdots,\text m\\ x_\text j\ge0&\text j=1,2,\cdots,\text n\\ x_\text j\in\Z&\text j=1,2,\cdots,\text n\\ \end{cases} s.t.⎩ ⎨ ⎧j=1∑naijxj≥bixj≥0xj∈Zi=1,2,⋯,mj=1,2,⋯,nj=1,2,⋯,n
例2 建厂问题
某公司计划在 m \text m m个地点建厂,可供选择的地点有 A 1 , A 2 , ⋯ , A m \text A_1,\text A_2,\cdots,\text A_\text m A1,A2,⋯,Am,他们的生产能力分别是 a 1 , a 2 , ⋯ , a m a_1,a_2,\cdots,a_\text m a1,a2,⋯,am(假设生产同一产品)。第 i \text i i个工厂的建设费用为 f i ( i = 1 , 2 , ⋯ , m ) \text f_\text i\ (\text i=1,2,\cdots,\text m) fi (i=1,2,⋯,m),又有 n \text n n个地点 B 1 , B 2 , ⋯ , B n \text B_1,\text B_2,\cdots,\text B_\text n B1,B2,⋯,Bn需要销售这种产品,其销量分别为 b i , b 2 , ⋯ , b n \text b_ i,\text b_2,\cdots,\text b_\text n bi,b2,⋯,bn。从工地运往销地的单位运费为 c ij \text c_\text {ij} cij。试决定应在哪些地方建厂,既满足各地需要,又使总建设费用和总运输费用最省?
B 1 \text B_\text 1 B1 | B 2 \text B_\text 2 B2 | ⋯ \cdots ⋯ | B n \text B_\text n Bn | 生产能力 | 建设费用 | |
---|---|---|---|---|---|---|
A 1 \text A_\text 1 A1 | c 11 \text c_\text {11} c11 | c 12 \text c_\text {12} c12 | ⋯ \cdots ⋯ | c 1 n \text c_\text {1\,n} c1n | a 1 a_1 a1 | f 1 \text f_\text 1 f1 |
A 2 \text A_\text 2 A2 | c 21 \text c_\text {21} c21 | c 22 \text c_\text {22} c22 | ⋯ \cdots ⋯ | c 2 n \text c_\text {2\,n} c2n | a 2 a_2 a2 | f 2 \text f_\text 2 f2 |
⋮ \vdots ⋮ | ⋮ \vdots ⋮ | ⋮ \vdots ⋮ | ⋱ \ddots ⋱ | ⋮ \vdots ⋮ | ⋮ \vdots ⋮ | ⋮ \vdots ⋮ |
A m \text A_\text m Am | c m 1 \text c_\text {m\,1} cm1 | c m2 \text c_\text {m2} cm2 | ⋯ \cdots ⋯ | c mn \text c_\text {mn} cmn | a m a_\text m am | f m \text f_\text m fm |
销量 | b 1 \text b_\text 1 b1 | b 2 \text b_\text 2 b2 | ⋯ \cdots ⋯ | b n \text b_\text n bn |
设:
x
ij
x_{\text{ij}}
xij表示从工厂
A
i
\text A_\text i
Ai运往销地
B
j
\text B_\text j
Bj的运量。
y
i
=
{
1
在
A
i
建厂
0
不在
A
i
建厂
y_\text i=\begin{cases}1&在\text A_\text i建厂\\0&不在\text A_\text i建厂\end{cases}
yi={10在Ai建厂不在Ai建厂。
min
z
=
∑
i
=
1
m
∑
j
=
1
n
c
ij
x
ij
+
∑
i
=
1
m
f
i
y
i
\min\quad z=\sum_{\text i=1}^m\sum_{\text j=1}^n\text c_{\text{ij}}x_{\text{ij}}+\sum_{\text i=1}^m\text f_\text iy_\text i
minz=i=1∑mj=1∑ncijxij+i=1∑mfiyi
s.t. { ∑ j = 1 n x ij ≤ a i y i i = 1 , 2 , ⋯ , m ∑ i = 1 m x ij ≥ b j j = 1 , 2 , ⋯ , n x ij ≥ 0 i = 1 , 2 , ⋯ , m、j = 1 , 2 , ⋯ , n y i = 0 或 1 i = 1 , 2 , ⋯ , m \text{s.t.}\quad \begin{cases} \sum\limits_{\text j=1}^\text nx_{\text{ij}}\le a_\text iy_\text i&\text i=1,2,\cdots,\text m\\ \sum\limits_{\text i=1}^\text mx_{\text{ij}}\ge \text b_\text j&\text j=1,2,\cdots,\text n\\ x_\text{ij}\ge0&\text i=1,2,\cdots,\text m、\text j=1,2,\cdots,\text n\\ y_\text i=0或1&\text i=1,2,\cdots,\text m \end{cases} s.t.⎩ ⎨ ⎧j=1∑nxij≤aiyii=1∑mxij≥bjxij≥0yi=0或1i=1,2,⋯,mj=1,2,⋯,ni=1,2,⋯,m、j=1,2,⋯,ni=1,2,⋯,m
整数规划的一般形式如下:
max
z
=
∑
j
=
1
n
c
j
x
j
\max\quad z=\sum_{\text j=1}^\text n\text c_\text jx_\text j
maxz=j=1∑ncjxj
s.t. { ∑ j = 1 n a ij x j = b i i = 1 , 2 , ⋯ , m x j ≥ 0 j = 1 , 2 , ⋯ , n x j ∈ Z j = 1 , 2 , ⋯ , n \text{s.t.}\quad \begin{cases} \sum\limits_{\text j=1}^\text na_{\text{ij}}x_\text j= \text b_\text i&\text i=1,2,\cdots,\text m\\ x_\text j\ge0&\text j=1,2,\cdots,\text n\\ x_\text j\in\Z&\text j=1,2,\cdots,\text n\\ \end{cases} s.t.⎩ ⎨ ⎧j=1∑naijxj=bixj≥0xj∈Zi=1,2,⋯,mj=1,2,⋯,nj=1,2,⋯,n
分类
依照决策变量取整要求的不同,整数规划可分为纯整数规划、全整数规划、混合整数规划、0-1整数规划。
- 纯整数规划:所有决策变量要求取非负整数,这时引进的松弛变量和剩余变量可以不要求取整数。
- 全整数规划:除了所有决策变量要求取非负整数外,系数 a ij a_{\text{ij}} aij和常数 b i \text b_\text i bi也要求取整数,这时引进的松弛变量和剩余变量也必须是整数。
- 混合整数规划:只有一部分的决策变量要求取非负整数,另一部分可以取非负实数。
- 0-1整数规划:所有决策变量只能取0或1两个整数。
这四个分类中都要求决策变量是非负整数,我觉得这是因为数学模型解决的是生活中的实际问题,而不是单纯的数学问题,所以这里对决策变量做了非负整数的规定。
松弛变量与剩余变量:为了使线性约束的不等式约束变为等式约束,我们通过引入额外的变量来达到这一目的,即松弛变量和剩余变量。
s.t.
x
1
+
x
2
≤
10
(1)
\text{s.t.}\quad x_1+x_2\le10\tag 1
s.t.x1+x2≤10(1)
s.t. { x 1 + x 2 + x 3 = 10 x 3 ≥ 0 (2) \text{s.t.}\quad\tag 2 \begin{cases} \begin{aligned} x_1+x_2+x_3=10\\ x_3\ge0 \end{aligned} \end{cases} s.t.{x1+x2+x3=10x3≥0(2)
通过引入
x
3
x_3
x3,可以把约束条件
(
1
)
(1)
(1)中的小于等于号
≤
\le
≤变为
=
=
=。约束条件
(
1
)
(1)
(1)与约束条件
(
2
)
(2)
(2)是等价的,区别就在于决策变量的个数不同。我们把
x
3
x_3
x3称为松弛变量。
s.t.
x
4
+
x
5
≥
10
(3)
\text{s.t.}\quad x_4+x_5\ge10\tag 3
s.t.x4+x5≥10(3)
s.t. { x 4 + x 5 − x 6 = 10 x 6 ≥ 0 (4) \text{s.t.}\quad\tag 4 \begin{cases} \begin{aligned} x_4+x_5-x_6=10\\ x_6\ge0 \end{aligned} \end{cases} s.t.{x4+x5−x6=10x6≥0(4)
通过引入 x 6 x_6 x6,可以把约束条件 ( 3 ) (3) (3)中的大于等于号 ≥ \ge ≥变为 = = =。约束条件 ( 3 ) (3) (3)与约束条件 ( 4 ) (4) (4)是等价的,区别就在于决策变量的个数不同。我们把 x 6 x_6 x6称为剩余变量。
与松弛线性规划的联系
- 整数规划可行解是松弛问题可行域中的整数格点。
- 松弛问题无可行解,则整数规划无可行解。
- 整数规划最优值要劣于松弛问题的最优值。
- 松弛问题最优解满足整数要求,则该最优解为整数规划最优解。
- 整数规划最优解不是松弛问题最优解简单的四舍五入,这样做不能保证解的最优性以及满足约束条件。
例3 设整数规划问题如下
max
z
=
x
1
+
x
2
\max\quad z=x_1+x_2
maxz=x1+x2
s.t. { 14 x 1 + 9 x 2 ≤ 51 − 6 x 1 + 3 x 2 ≤ 1 x 1 , x 2 ≥ 0 x 1 , x 2 ∈ Z \text{s.t.}\quad \begin{cases} \begin{aligned} 14x_1+9x_2\le51\\ -6x_1+3x_2\le1\\ x_1,x_2\ge0\\ x_1,x_2\in \Z \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧14x1+9x2≤51−6x1+3x2≤1x1,x2≥0x1,x2∈Z
首先不考虑整数约束,得到线性规划问题(也称为松弛问题或伴随问题)。
max
z
=
x
1
+
x
2
\max\quad z=x_1+x_2
maxz=x1+x2
s.t. { 14 x 1 + 9 x 2 ≤ 51 − 6 x 1 + 3 x 2 ≤ 1 x 1 , x 2 ≥ 0 \text{s.t.}\quad \begin{cases} \begin{aligned} 14x_1+9x_2\le51\\ -6x_1+3x_2\le1\\ x_1,x_2\ge0\\ \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧14x1+9x2≤51−6x1+3x2≤1x1,x2≥0
用图解法求出最优解 x 1 = 3 2 , x 2 = 10 3 , z = 29 6 x_1=\frac{3}{2},x_2=\frac{10}{3},z=\frac{29}{6} x1=23,x2=310,z=629。
现求整数解(最优解):如用“舍入取整法”可得到4个点即 ( 1 , 3 ) , ( 2 , 3 ) , ( 1 , 4 ) , ( 2 , 4 ) (1,3),(2,3),(1,4),(2,4) (1,3),(2,3),(1,4),(2,4)。显然它们都不可能是整数规划的最优解,因为它们都不在可行域内。
按整数规划约束条件,其可行解是线性规划问题的可行域内的整数格点。固整数规划问题的可行解是一个有限集。因此,可将集合内的整数点一一找出,其最大目标函数的值为最优解,此法为完全枚举法。
如上例:其中 ( 2 , 2 ) , ( 3 , 1 ) (2,2),(3,1) (2,2),(3,1)点目标函数取到最大值, z = 4 z=4 z=4。
模型求解方法
对于有较大可行域的整数规划问题,枚举法有点不太适用。目前,常用的求解整数规划的方法有:分枝定界法和割平面法;对于0-1规划问题采用隐枚举法和匈牙利法。
分枝定界法
求解步骤
- 不考虑整数限制先求出相应松弛问题的最优解。
- 若松弛问题无可行解,则整数规划无可行解。
- 若求得的松弛问题最优解符合整数要求,则是原整数规划的最优解。
- 若不满足整数条件,则任选一个不满足整数条件的变量 x i x_\text i xi来构造新的约束条件添加到松弛问题中形成两个子问题 x i ≤ [ x i ] ; x i ≥ [ x i ] + 1 x_\text i\le[x_\text i];x_\text i\ge[x_\text i]+1 xi≤[xi];xi≥[xi]+1。
- 依次在缩小的可行域中求解新构造的松弛规划的最优解,并重复上述过程,直到子问题无解或有整数最优解(被查清)。
求解细节
- 在分支的过程中,若当前已经得到满足整数要求的最优值为 z m z_\text m zm,则该 z m z_\text m zm就可作为一个过滤条件,对于最优值小于或等于 z m z_\text m zm的子问题无需再分支,则这样的子问题被称为被剪枝。未被剪枝的子问题需要继续分支。
- 分支定界法的最终子问题要么被查清要么被剪枝。
- 若两个子问题 P 1 , P 2 \text P_1,\text P_2 P1,P2的松弛规划的最优解分别为 z 1 , z 2 z_1,z_2 z1,z2,且 z 1 < z 2 z_1<z_2 z1<z2,则优先选取 P 2 \text P_2 P2进行分支(目标函数为求解最大值)。这是因为如果先对 P 2 \text P_2 P2进行分支,则 P 2 \text P_2 P2的子问题有可能存在最优值大于 P 1 \text P_1 P1的最优值 z 1 z_1 z1的整数解,此时 P 1 \text P_1 P1被剪枝,我们无需再对 P 1 \text P_1 P1及其子问题讨论了;但若是先对 P 1 \text P_1 P1进行分支,则 P 1 \text P_1 P1的所有子问题的最优值一定小于 P 2 \text P_2 P2的最优值(约束越多最优值越差),所以 P 2 \text P_2 P2一定不会被剪枝。
对分支定界法的理解
整数规划对应的松弛问题的最优解 x = [ a 1 , a 2 , ⋯ , a n ] x=[a_1,a_2,\cdots,a_\text n] x=[a1,a2,⋯,an],且该最优解不满足整数约束。我们假定该整数规划是存在最优解的,设整数规划的最优解为 x = [ b 1 , b 2 , ⋯ , b n ] x=[\text b_1,\text b_2,\cdots,\text b_\text n] x=[b1,b2,⋯,bn]。则 b i ≤ [ a i ] 或 b i ≥ [ a i ] + 1 i = 1 , 2 , ⋯ , n \text b_\text i\le[a_\text i]或\text b_\text i\ge[a_\text i]+1\quad \text i=1,2,\cdots,\text n bi≤[ai]或bi≥[ai]+1i=1,2,⋯,n,所以对于任意一个 x i = a i x_\text i=a_\text i xi=ai,我们可以根据排除法添加一个约束条件 x i ≤ [ x i ] 或 x i ≥ [ x i ] + 1 x_\text i\le[x_\text i]或x_\text i\ge[x_\text i]+1 xi≤[xi]或xi≥[xi]+1形成两个子问题,减小了可行域的范围。然后不断的对最优解不满足整数约束的子问题进行分支,直到子问题被查清或者被剪枝。
例4 用分枝定界法求解该整数规划问题:
max
z
=
x
1
+
x
2
\max\quad z=x_1+x_2
maxz=x1+x2
s.t. { x 1 + 9 14 x 2 ≤ 51 14 − 2 x 1 + x 2 ≤ 1 3 x 1 , x 2 ≥ 0 且 ∈ Z \text{s.t.}\quad \begin{cases} \begin{aligned} x_1+\frac{9}{14}x_2\le\frac{51}{14}\\ -2x_1+x_2\le\frac{1}{3}\\ x_1,x_2\ge0且\in\Z \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧x1+149x2≤1451−2x1+x2≤31x1,x2≥0且∈Z
首先对松弛问题 P 0 \text P_0 P0求解,最优解为 x 1 = 3 2 , x 2 = 10 3 x_1=\frac{3}{2},x_2=\frac{10}{3} x1=23,x2=310,最优值 z = 4 z=4 z=4。显然最优值不满足整数约束,所以要根据最优解的情况进行分枝。
我们先以 x 1 x_1 x1的取值划分子问题,也就是分别以 x 1 ≤ [ 3 2 ] x_1\le[\frac{3}{2}] x1≤[23]和 x 2 ≥ [ 3 2 ] + 1 x_2\ge[\frac{3}{2}]+1 x2≥[23]+1为约束条件添加到原松弛问题中形成两个子问题 P 1 , P 2 \text P_1,\text P_2 P1,P2(还是松弛问题)。并对 P 1 , P 2 \text P_1,\text P_2 P1,P2求解。 P 1 \text P_1 P1的最优解为 x 1 = 1 , x 2 = 7 3 x_1=1,x_2=\frac{7}{3} x1=1,x2=37,最优值 z = 10 3 z=\frac{10}{3} z=310; P 2 \text P_2 P2的最优解为 x 1 = 2 , x 2 = 23 9 x_1=2,x_2=\frac{23}{9} x1=2,x2=923,最优值 z = 41 9 z=\frac{41}{9} z=941。显然 P 1 , P 2 \text P_1,\text P_2 P1,P2的最优解都不满足整数约束,所以还要进行分支,但是 P 2 \text P_2 P2的最优值要优于 P 1 \text P_1 P1的最优值( z 2 ≥ z 1 z_2\ge z_1 z2≥z1),所以我们优先对 P 2 \text P_2 P2进行分枝。
然后就是计算各个分枝的解,直到所有分枝都被查清或者被剪枝。
割平面法
求解步骤
- 求解线性规划最优解
- 若线性规划无解,则整数规划无解
- 若求得的松弛问题最优解符合整数要求,则是原整数规划的最优解
- 引入松弛变量构造切割方程,约束条件中有几个不等式约束,就引入几个松弛变量。并对引入松弛变量的等式约束进行线性变换,使其变为一个决策变量 x i x_\text i xi和松弛变量线性组合 ∑ a ik x k \sum a_{\text{ik}}x_\text k ∑aikxk的叠加,如下式。
x i + ∑ a ik x k = b i i = 1 , 2 , ⋯ x_\text i+\sum a_{\text{ik}}x_\text k=\text b_\text i\quad \text i=1,2,\cdots xi+∑aikxk=bii=1,2,⋯
然后选取其中一个等式约束构造切割方程,我们将系数
a
ik
,
b
i
a_{\text{ik}},\text b_\text i
aik,bi分解为小数部分和整数部分,小数部分的范围是
[
0
,
1
)
[0,1)
[0,1)。整数部分可以是负数。
a
ik
=
[
a
ik
]
+
(
a
ik
−
[
a
ik
]
)
=
[
a
ik
]
+
f
ik
a_{\text{ik}}=[a_{\text{ik}}]+(a_{\text{ik}}-[a_{\text{ik}}])=[a_{\text{ik}}]+\text f_{\text{ik}}
aik=[aik]+(aik−[aik])=[aik]+fik
b i = [ b i ] + ( b i − [ b i ] ) = [ b i ] + f i \text b_\text i=[\text b_\text i]+(\text b_\text i-[\text b_\text i])=[\text b_\text i]+\text f_\text i bi=[bi]+(bi−[bi])=[bi]+fi
然后将所有的整数部分放在方程的左侧,小数部分放在右侧。
x
i
+
∑
[
a
ik
]
x
k
+
∑
f
ik
x
k
=
[
b
i
]
+
f
i
⇓
x
i
+
∑
[
a
ik
]
x
k
−
[
b
i
]
=
f
i
−
∑
f
ik
x
k
x_i+\sum[a_\text{ik}]x_\text k+\sum \text f_\text{ik}x_\text k=[\text b_\text i]+\text f_\text i\\ \Downarrow\\ x_i+\sum[a_\text{ik}]x_\text k-[\text b_\text i]=\text f_\text i-\sum \text f_\text{ik}x_\text k
xi+∑[aik]xk+∑fikxk=[bi]+fi⇓xi+∑[aik]xk−[bi]=fi−∑fikxk
方程左侧
x
i
+
∑
[
a
ik
]
x
k
−
[
b
i
]
x_i+\sum[a_\text{ik}]x_\text k-[\text b_\text i]
xi+∑[aik]xk−[bi]是整数的线性组合,所以结果也必然是整数;方程式右侧
f
i
\text f_\text i
fi是小数,且有
0
≤
f
i
<
1
0\le\text f_\text i<1
0≤fi<1,而
∑
f
ik
x
k
\sum \text f_\text{ik}x_\text k
∑fikxk一定是大于0的(松弛变量
x
k
≥
0
x_\text k\ge0
xk≥0),所以方程右侧满足
f
i
−
∑
f
ik
x
k
<
1
\text f_\text i-\sum \text f_\text{ik}x_\text k<1
fi−∑fikxk<1。考虑到方程式左侧是整数,则方程式右侧也必定是整数,固有
f
i
−
∑
f
ik
x
k
≤
0
\text f_\text i-\sum \text f_\text{ik}x_\text k\le0
fi−∑fikxk≤0。于是我们便多了一个约束条件。
- 然后将新的约束带入到松弛问题中求解,如果得到的最优解不满足整数约束,我们再选取另一个等式约束重新构造切割方程形成新的约束,再带入问题中求解,反复循环直到求出整数解或者所有切割方程均无整数解为止。
例6 求解下面的整数规划:
max
z
=
x
1
+
x
2
\max\quad z=x_1+x_2
maxz=x1+x2
s.t. { − x 1 + x 2 ≤ 1 3 x 1 + x 2 ≤ 4 x 1 , x 2 ≥ 0 x 1 , x 2 ∈ Z \text{s.t.}\quad \begin{cases} \begin{aligned} -x_1+x_2\le1\\ 3x_1+x_2\le4\\ x_1,x_2\ge0\\ x_1,x_2\in\Z \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧−x1+x2≤13x1+x2≤4x1,x2≥0x1,x2∈Z
LP : x 1 = 3 4 , x 2 = 7 4 , z = 5 2 ; IP : x 1 = 1 , x 2 = 1 , z = 2 \text{LP}:x_1=\frac{3}{4},x_2=\frac{7}{4},z=\frac{5}{2};\text{IP}:x_1=1,x_2=1,z=2 LP:x1=43,x2=47,z=25;IP:x1=1,x2=1,z=2, LP \text{LP} LP表示线性规划, IP \text{IP} IP表示整数规划。
约束条件中有两个不等式约束,所以我们引入两个松弛变量
x
3
,
x
4
x_3,x_4
x3,x4:
max
z
=
x
1
+
x
2
+
0
x
3
+
0
x
4
\max\quad z=x_1+x_2+0x_3+0x_4
maxz=x1+x2+0x3+0x4
s.t. { − x 1 + x 2 + x 3 = 1 3 x 1 + x 2 + x 4 = 4 x 1 , x 2 , x 3 , x 4 ≥ 0 x 1 , x 2 , x 3 , x 4 ∈ Z (5) \text{s.t.}\quad\tag 5 \begin{cases} \begin{aligned} -x_1+x_2+x_3=1\\ 3x_1+x_2+x_4=4\\ x_1,x_2,x_3,x_4\ge0\\ x_1,x_2,x_3,x_4\in\Z \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧−x1+x2+x3=13x1+x2+x4=4x1,x2,x3,x4≥0x1,x2,x3,x4∈Z(5)
然后我们对
(
5
)
(5)
(5)进行线性变换:
s.t.
{
x
1
−
1
4
x
3
+
1
4
x
4
=
3
4
x
2
+
3
4
x
3
+
1
4
x
4
=
7
4
x
1
,
x
2
,
x
3
,
x
4
≥
0
x
1
,
x
2
,
x
3
,
x
4
∈
Z
(6)
\text{s.t.}\quad\tag6 \begin{cases} \begin{aligned} \small{x_1-\frac{1}{4}x_3+\frac{1}{4}x_4=\frac{3}{4}}\\ \small{x_2+\frac{3}{4}x_3+\frac{1}{4}x_4=\frac{7}{4}}\\ x_1,x_2,x_3,x_4\ge0\\ x_1,x_2,x_3,x_4\in\Z \end{aligned} \end{cases}
s.t.⎩
⎨
⎧x1−41x3+41x4=43x2+43x3+41x4=47x1,x2,x3,x4≥0x1,x2,x3,x4∈Z(6)
然后可以构造两个切割方程:
x
1
−
x
3
=
3
4
−
(
3
4
x
3
+
1
4
x
4
)
x_1-x_3=\frac{3}{4}-(\frac{3}{4}x_3+\frac{1}{4}x_4)
x1−x3=43−(43x3+41x4)
x 2 − 1 = 3 4 − ( 3 4 x 3 + 1 4 x 4 ) x_2-1=\frac{3}{4}-(\frac{3}{4}x_3+\frac{1}{4}x_4) x2−1=43−(43x3+41x4)
形成两个新的约束条件。此例题中这两个切割方程得出的约束条件是相同的(这个我也不知道为啥是相同的,可能是因为
n
\text n
n个切割方程只能得到
n
2
\frac{\text n}{2}
2n个新的约束条件吧,这只是我的猜测)。
3
x
3
+
x
4
≤
3
3x_3+x_4\le3
3x3+x4≤3
最后将其带入到
(
5
)
(5)
(5)式中可以得到:
x
2
≤
1
x_2\le1
x2≤1
新的可行域如下:
用割平面法形象的解释就是 x 2 ∈ Z + x_2\in\Z_+ x2∈Z+,所以我们可以把 x 2 ∈ ( 1 , 7 4 ] x_2\in(1,\frac{7}{4}] x2∈(1,47]的可行域给割掉,割掉的部分不含整数解。
0-1变量的使用
非指派问题
例7 投资问题
有600万元投资5个项目,收益如表,求利润最大的方案?
项目 | 投资额 | 项目收益 |
---|---|---|
1 | 210 | 160 |
2 | 300 | 210 |
3 | 150 | 60 |
4 | 130 | 80 |
5 | 260 | 180 |
约束条件:项目1,2,3中选一项;项目3,4中选一项;项目5以项目1位先验条件(就是投资项目1才能投资项目5,当然也可以不投)。
设
x
j
=
{
1
选中第j个项目投资
0
不选第j个项目投资
设x_\text j= \begin{cases} 1&选中第\text j个项目投资\\ 0&不选第\text j个项目投资 \end{cases}
设xj={10选中第j个项目投资不选第j个项目投资
max z = 160 x 1 + 210 x 2 + 60 x 3 + 80 x 4 + 180 x 5 \max\quad z=160x_1+210x_2+60x_3+80x_4+180x_5 maxz=160x1+210x2+60x3+80x4+180x5
s.t. { 210 x 1 + 300 + x 2 + 150 x 3 + 130 x 4 + 260 x 5 ≤ 600 x 1 + x 2 + x 3 = 1 x 3 + x 4 = 1 x 5 ≤ x 1 x 1 , x 2 , x 3 , x 4 , x 5 = 0 或 1 \text{s.t.}\quad \begin{cases} \begin{aligned} 210x_1+300+x2+150x_3+130x_4+260x_5\le600\\ x_1+x_2+x_3=1\\ x_3+x_4=1\\ x_5\le x_1\\ x_1,x_2,x_3,x_4,x_5=0或1 \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧210x1+300+x2+150x3+130x4+260x5≤600x1+x2+x3=1x3+x4=1x5≤x1x1,x2,x3,x4,x5=0或1
例8 互斥类问题
例如某种工序的约束条件为:
4
x
1
+
5
x
2
≤
200
4x_1+5x_2\le200
4x1+5x2≤200,企业也可以考虑一种新的加工工序:
3
x
1
+
5
x
2
≤
180
3x_1+5x_2\le180
3x1+5x2≤180。这两个工序只能选其一,是互相排斥的。引入0-1变量
y
y
y,令:
y
=
{
1
采用原工序
0
采用新工序
y= \begin{cases} 1&采用原工序\\ 0&采用新工序 \end{cases}
y={10采用原工序采用新工序
互斥问题可由下述的条件来代替,其中
M
\text M
M是充分大的数。
s.t.
{
4
x
1
+
5
x
2
≤
200
+
(
1
−
y
)
M
3
x
1
+
5
x
2
≤
180
+
y
M
\text{s.t.}\quad \begin{cases} \begin{aligned} 4x_1+5x_2\le200+(1-y)\text M\\ 3x_1+5x_2\le180+y\text M \end{aligned} \end{cases}
s.t.{4x1+5x2≤200+(1−y)M3x1+5x2≤180+yM
假设采取原工序,则
y
=
1
y=1
y=1。第二个约束条件的右边
180
+
y
M
180+y\text M
180+yM可看做
∞
\infty
∞所以也就是
3
x
1
+
5
x
2
3x_1+5x_2
3x1+5x2可以取任意值,因为不管怎么取值都不会比
∞
\infty
∞更大。
互斥问题的推广
从下述
p
\text p
p个约束条件中恰好选择
q
\text q
q个约束条件:
∑
j
=
1
n
a
ij
x
j
≤
b
i
i
=
1
,
2
,
⋯
,
p
\sum_{\text j=1}^\text na_\text{ij}x_\text j\le\text b_\text i\quad \text i=1,2,\cdots,\text p
j=1∑naijxj≤bii=1,2,⋯,p
y i = { 0 选第i个约束条件 1 不选第i个约束条件 i = 1 , 2 , ⋯ , p y_\text i= \begin{cases} 0&选第\text i个约束条件\\ 1&不选第\text i个约束条件 \end{cases} \quad \text i=1,2,\cdots,\text p yi={01选第i个约束条件不选第i个约束条件i=1,2,⋯,p
新的约束如下:
s.t.
{
∑
j
=
1
n
a
ij
x
j
≤
b
i
+
M
y
i
∑
i
=
1
p
y
i
=
p
−
q
i
=
1
,
2
,
⋯
,
p
\text{s.t.}\quad \begin{cases} \begin{aligned} \sum_{\text j=1}^\text na_\text{ij}x_\text j\le\text b_\text i+\text My_\text i\\ \sum_{\text i=1}^\text py_i=\text p-\text q \end{aligned} \end{cases} \qquad \text i=1,2,\cdots,\text p
s.t.⎩
⎨
⎧j=1∑naijxj≤bi+Myii=1∑pyi=p−qi=1,2,⋯,p
例9 固定费用问题
服装公司租用生产线拟生产 T \text T T恤,衬衫和裤子。每年可用劳动力 8200 h 8200\text h 8200h,布料 8800 m 2 8800\text m^2 8800m2。
T \text T T恤 | 衬衫 | 裤子 | |
---|---|---|---|
劳动力 | 3 | 2 | 6 |
布料 | 0.8 | 1.1 | 1.5 |
售价 | 250 | 400 | 600 |
可变成本 | 100 | 180 | 300 |
生产租金(万) | 20 | 15 | 10 |
设 y i = { 1 要租用生产线j 0 不租用生产线j j = 1 , 2 , 3 ;第j种服装生产量 x j 设\,y_\text i= \begin{cases} 1&要租用生产线\text j\\ 0&不租用生产线\text j \end{cases} \quad \text j=1,2,3;第\text j种服装生产量x_\text j 设yi={10要租用生产线j不租用生产线jj=1,2,3;第j种服装生产量xj
max z = 150 x 1 + 220 x 2 + 300 x 3 − 200000 y 1 − 150000 y 2 − 100000 y 3 \max\quad z=150x_1+220x_2+300x_3-200000y_1-150000y_2-100000y_3 maxz=150x1+220x2+300x3−200000y1−150000y2−100000y3
s.t. { 3 x 1 + 2 x 2 + 6 x 3 ≤ 8200 0.8 x 1 + 1.1 x 2 + 1.5 x 3 ≤ 8800 x 1 , x 2 , x 3 ≥ 0 , 且 ∈ Z y 1 , y 2 , y 3 = 0 或 1 x 1 ≤ M y 1 x 2 ≤ M y 2 x 3 ≤ M y 3 \text{s.t.}\quad \begin{cases} \begin{aligned} 3x_1+2x_2+6x_3\le8200\\ 0.8x_1+1.1x_2+1.5x_3\le8800\\ x_1,x_2,x_3\ge0,且\in \Z\\ y_1,y_2,y_3=0或1\\ x_1\le \text My_1\\ x_2\le \text My_2\\ x_3\le \text My_3 \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧3x1+2x2+6x3≤82000.8x1+1.1x2+1.5x3≤8800x1,x2,x3≥0,且∈Zy1,y2,y3=0或1x1≤My1x2≤My2x3≤My3
M \text M M取充分大的数,当 y i = 1 y_\text i=1 yi=1时,则对应的 x i x_\text i xi可以任意取值;当 y i = 0 y_\text i=0 yi=0时,则对应的 x i x_\text i xi只能等于0;
指派问题
例10 指派问题
甲乙丙丁四个人, ABCD \text{ABCD} ABCD四项工作,要求每人只能做一项工作,每项工作只能由一人完成,问如何指派总时间最短?
A \text A A | B \text B B | C \text C C | D \text D D | |
---|---|---|---|---|
甲 | 3 | 5 | 8 | 4 |
乙 | 6 | 8 | 5 | 4 |
丙 | 2 | 5 | 8 | 5 |
丁 | 9 | 2 | 5 | 2 |
引入0-1变量
x
ij
x_\text {ij}
xij:
x
ij
=
{
1
第i人做第j项工作
0
第i人不做第j项工作
x_{\text{ij}}= \begin{cases} 1&第\text i人做第\text j项工作\\ 0&第\text i人不做第\text j项工作 \end{cases}
xij={10第i人做第j项工作第i人不做第j项工作
min z = 3 x 11 + 5 x 12 + 8 x 13 + 4 x 14 + 6 x 21 + 8 x 22 + 5 x 23 + 4 x 24 + 2 x 31 + 5 x 32 + 8 x 33 + 5 x 34 + 9 x 41 + 2 x 42 + 5 x 43 + 2 x 44 \min\quad z=3x_{11}+5x_{12}+8x_{13}+4x_{14}+6x_{21}+8x_{22}+5x_{23}+4x_{24}+2x_{31}+5x_{32}+8x_{33}+5x_{34}+9x_{41}+2x_{42}+5x_{43}+2x_{44} minz=3x11+5x12+8x13+4x14+6x21+8x22+5x23+4x24+2x31+5x32+8x33+5x34+9x41+2x42+5x43+2x44
一个工作只由一人完成
{
x
11
+
x
21
+
x
31
+
x
41
=
1
x
12
+
x
22
+
x
32
+
x
42
=
1
x
13
+
x
23
+
x
33
+
x
43
=
1
x
14
+
x
24
+
x
34
+
x
44
=
1
\begin{cases} x_{11}+x_{21}+x_{31}+x_{41}=1\\ x_{12}+x_{22}+x_{32}+x_{42}=1\\ x_{13}+x_{23}+x_{33}+x_{43}=1\\ x_{14}+x_{24}+x_{34}+x_{44}=1 \end{cases}
⎩
⎨
⎧x11+x21+x31+x41=1x12+x22+x32+x42=1x13+x23+x33+x43=1x14+x24+x34+x44=1
一个人只完成一项任务
{
x
11
+
x
12
+
x
13
+
x
14
=
1
x
21
+
x
22
+
x
23
+
x
24
=
1
x
31
+
x
32
+
x
33
+
x
34
=
1
x
41
+
x
42
+
x
43
+
x
44
=
1
\begin{cases} x_{11}+x_{12}+x_{13}+x_{14}=1\\ x_{21}+x_{22}+x_{23}+x_{24}=1\\ x_{31}+x_{32}+x_{33}+x_{34}=1\\ x_{41}+x_{42}+x_{43}+x_{44}=1 \end{cases}
⎩
⎨
⎧x11+x12+x13+x14=1x21+x22+x23+x24=1x31+x32+x33+x34=1x41+x42+x43+x44=1
指派问题的标准形式
有
n
\text n
n个人和
n
\text n
n项工作,已知第
i
\text i
i个人做第
j
\text j
j项工作的代价为
c
ij
(
i
,
j
=
1
,
2
,
⋯
,
n
)
\text c_{\text{ij}}(\text i,\text j=1,2,\cdots,\text n)
cij(i,j=1,2,⋯,n),要求每项工作只能交由其中一人完成,每个人只能完成其中一项工作,问如何分配可使总代价最少?
C
=
(
c
ij
)
n
×
n
=
(
c
11
c
12
⋯
c
1
n
c
21
c
22
⋯
c
2
n
⋮
⋮
⋱
⋮
c
n
1
c
n
2
⋯
c
nn
)
\bf C=(\text c_{\text{ij}})_{\text n\times\text n}= \begin{pmatrix} \text c_{11}&\text c_{12}&\cdots&\text c_{1\text n}\\ \text c_{21}&\text c_{22}&\cdots&\text c_{2\text n}\\ \vdots&\vdots&\ddots&\vdots\\ \text c_{\text n1}&\text c_{\text n2}&\cdots&\text c_{\text{nn}}\\ \end{pmatrix}
C=(cij)n×n=⎝
⎛c11c21⋮cn1c12c22⋮cn2⋯⋯⋱⋯c1nc2n⋮cnn⎠
⎞
C
\bf C
C是指派问题的系数矩阵,
i
\text i
i行元素表示第
i
\text i
i个人完成各项工作的代价;
j
\text j
j列元素表示各人完成第
j
\text j
j项工作的代价。
指派问题的数学模型
x ij = { 1 第i个人做第j项工作 0 第i个人不做第j项工作 i , j = 1 , 2 , ⋯ , n x_{\text{ij}}= \begin{cases} 1&第\text i个人做第\text j项工作\\ 0&第\text i个人不做第\text j项工作 \end{cases} \qquad \text i,\text j=1,2,\cdots,n xij={10第i个人做第j项工作第i个人不做第j项工作i,j=1,2,⋯,n
min z = ∑ i = 1 n ∑ j = 1 n c ij x ij \min\quad z=\sum_{\text i=1}^\text n\sum_{\text j=1}^\text n\text c_{\text{ij}}x_{\text{ij}} minz=i=1∑nj=1∑ncijxij
s.t. { ∑ j = 1 n x ij = 1 ∑ i = 1 n x ij = 1 x ij = 0 或 1 i , j = 1 , 2 , ⋯ , n \text{s.t.}\quad \begin{cases} \begin{aligned} \sum_{\text j=1}^\text nx_{\text {ij}}=1\\ \sum_{\text i=1}^\text nx_{\text {ij}}=1\\ x_{\text{ij}}=0或1 \end{aligned} \end{cases} \qquad \text i,\text j=1,2,\cdots,\text n s.t.⎩ ⎨ ⎧j=1∑nxij=1i=1∑nxij=1xij=0或1i,j=1,2,⋯,n
X = ( x ij ) n × n = ( x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋱ ⋮ x n 1 x n 2 ⋯ x nn ) \bf{X}=(x_{\text{ij}})_{\text n\times\text n}= \begin{pmatrix} x_{11}&x_{12}&\cdots&x_{1\text n}\\ x_{21}&x_{22}&\cdots&x_{2\text n}\\ \vdots&\vdots&\ddots&\vdots\\ x_{\text n1}&x_{\text n2}&\cdots&x_{\text{nn}}\\ \end{pmatrix} X=(xij)n×n=⎝ ⎛x11x21⋮xn1x12x22⋮xn2⋯⋯⋱⋯x1nx2n⋮xnn⎠ ⎞
指派问题可行解中,每行每列有且只有一个1。
非标准形式的指派问题
- 最大化指派问题
C = ( c ij ) n × n \bf C=(\text c_{\text{ij}})_{\text n\times\text n} C=(cij)n×n中最大元素为 m \text m m,令 B = ( b ij ) n × n = ( m − c ij ) n × n \bf B=(\text b_{\text{ij}})_{\text n\times\text n}=(\text m-\text c_{\text{ij}})_{\text n\times\text n} B=(bij)n×n=(m−cij)n×n(其实也就是加负号的变型而已,之所以每个元素都加 m \text m m,是为了保证每个元素都大于0)。
- 人数和工作数不等
- 人少工作多:添加虚拟的“人”,代价都为0
- 人多工作少:添加虚拟的“工作”,代价都为0
- 一个人可做多件工作
该人可以等价为几个相同的人。
- 某工作一定不能由某人做
该人做该工作的相应代价取足够大 M \text M M,只要该人做了这件工作,则肯定不是最优解。
非标准形式的指派问题转换为标准型的思想就是将最终的矩阵转变为方阵。
匈牙利法的一般步骤
- 变换指派问题的系数矩阵(也称效率矩阵)
(
c
ij
)
(\text c_\text{ij})
(cij)为
(
b
ij
)
(\text b_\text{ij})
(bij),使在
(
b
ij
)
(\text b_\text{ij})
(bij)的各行各列中都出现0元素。
- 从 ( c ij ) (\text c_\text{ij}) (cij)的每行元素都减去该行的最小元素;
- 再从所得新系数矩阵的每列元素中减去该列的最小元素。
- 进行试指派,以寻求最优解。在
(
b
ij
)
(\text b_\text{ij})
(bij)中找尽可能多的独立0元素,若能找出
n
\text n
n个独立0元素,就以这
n
\text n
n个独立0元素对应解矩阵
(
x
ij
)
(x_\text{ij})
(xij)中的元素为1,其余为0,这就得到最优解。找独立0元素常用的步骤为:
- 从只有一个0元素的行(列)开始,给这个0元素加圈,记作 ⨀ \bigodot ⨀。然后划去 ⨀ \bigodot ⨀所在列(行)的其他0元素,记作 ⨂ \bigotimes ⨂;这表示这列所代表的任务已指派完,不必再考虑别人了。
- 从只有一个0元素的列(行)开始,给这个0元素加圈,记作 ⨀ \bigodot ⨀。然后划去 ⨀ \bigodot ⨀所在行(列)的其他0元素,记作 ⨂ \bigotimes ⨂;这表示这行所代表的人已指派完,不必再考虑其他工作了。
- 反复进行上述两步,直到尽可能多的0元素都被圈出和划掉为止。
- 若仍有没有划圈的0元素,且同行(列)的0元素至少有两个,则从剩有0元素最少的行(列)开始,比较这行(列)各0元素所在列(行)中0元素的数目,选择0元素最少的那列(行)对应的0元素加圈(表示选择性多的要礼让选择性少的)。然后划掉同行同列的其他零元素。可反复进行,直到所有0元素都已圈出和划掉为止。
- 若 ⨀ \bigodot ⨀元素的数目 m \text m m等于矩阵的阶数 n \text n n,那么这指派问题的最优解已得到。若 m < n \text m<\text n m<n则转入下一步。
- 作最少的直线覆盖所有
⨀
\bigodot
⨀元素。
- 对没有 ⨀ \bigodot ⨀的行打√号;
- 对已打√号的行中所有含 ⨂ \bigotimes ⨂元素的列打√号;
- 再对打√号的列中含 ⨀ \bigodot ⨀元素的行打√号;
- 重复上述两步直到得不出新的打√号的行列为止;
- 对没有打√号的行画横线,有打√号的列画纵线,这就得到覆盖所有 ⨀ \bigodot ⨀元素最少的直线数 l l l。 l l l应该等于 m \text m m,若不相等,说明试指派过程有误,回到第二步的(4),另行试指派(也就是最初的那种可能不是最优解);若 l = m < n l=\text m<\text n l=m<n,需再变换当前的系数矩阵,以找到 n \text n n个独立的0元素,为此转第四步。
- 变换系数矩阵 ( b ij ) (\text b_\text{ij}) (bij)以增加0元素。在没有被直线覆盖的所有元素中找出最小元素,然后√号的各行(没有划线的行)都减去这个最小元素;打√号各列(划线的列)都加上这个最小元素(以保证系数矩阵中不出现负元素,个人觉得即使不这样做也不会出现负元素)。新系数矩阵的最优解和原问题仍相同。转回第二步。
对匈牙利解法的理解
- ⨀ \bigodot ⨀所在的行和列不会有第二个 ⨀ \bigodot ⨀,这是因为如果一个0元素被圈了,就说明这一列对应的工作和这一行对应的人都已经被指派了。所以就要划去这一行和这一列所有的0元素,避免发生指派冲突。
- 在作最少直线覆盖所有的 ⨀ \bigodot ⨀元素这一步中,之所以对没有 ⨀ \bigodot ⨀的行打√号,是因为在划横线时是对没有打√号的行划线,这样所有的 ⨀ \bigodot ⨀元素都会被横线覆盖。
- 对含有 ⨂ \bigotimes ⨂元素的列划√号是因为这一列大概率有 ⨀ \bigodot ⨀元素,而且打√号的列会划线,所以在划纵线时,这个 ⨀ \bigodot ⨀元素(假设存在 b i g o d o t \text bigodot bigodot元素)就会被覆盖,所以横线就没有必要划了,于是我们就在 ⨀ \bigodot ⨀所在的行打√号,这样穿过 ⨀ \bigodot ⨀元素只有纵线。
- 最后所有 ⨀ \bigodot ⨀元素与 ⨂ \bigotimes ⨂只会被横线或者纵线贯穿,不会同时被两者贯穿。
- 最后一步进行加减最小值时, ⨀ \bigodot ⨀元素和 ⨂ \bigotimes ⨂元素不变化,再重新指派时,这两种元素恢复为最初的0元素。并且所有元素只能进行加或者减操作,不能既加最小值,又减最小最小值。我们假设存在这样的元素,则这个元素一定是行√号和纵√号的交点,所以这个元素一定是 ⨀ \bigodot ⨀元素或者 ⨂ \bigotimes ⨂。
例11 有一份中文说明书,需译成英、日、德、俄四种文字,分别记作 A,B,C,D \text{A,B,C,D} A,B,C,D。现有甲、乙、丙、丁四人,他们将中文说明书译成不同语种的说明书所需时间如下表所示,问如何分派任务,可使总时间最少?
甲 | 乙 | 丙 | 丁 | |
---|---|---|---|---|
A \text A A | 6 | 7 | 11 | 2 |
B \text B B | 4 | 5 | 9 | 8 |
C \text C C | 3 | 1 | 10 | 4 |
C \text C C | 5 | 9 | 8 | 2 |
求解过程如下:
-
变换系数矩阵:
- 每行减去该行的最小元素
( 6 7 11 2 4 5 9 8 3 1 10 4 5 9 8 2 ) − ( 2 2 2 2 4 4 4 4 1 1 1 1 2 2 2 2 ) = ( 4 5 9 0 0 1 5 4 2 0 9 3 3 7 6 0 ) \begin{pmatrix} 6&7&11&2\\ 4&5&9&8\\ 3&1&10&4\\ 5&9&8&2\\ \end{pmatrix}- \begin{pmatrix} 2&2&2&2\\ 4&4&4&4\\ 1&1&1&1\\ 2&2&2&2\\ \end{pmatrix}= \begin{pmatrix} 4&5&9&0\\ 0&1&5&4\\ 2&0&9&3\\ 3&7&6&0\\ \end{pmatrix} ⎝ ⎛643575191191082842⎠ ⎞−⎝ ⎛2412241224122412⎠ ⎞=⎝ ⎛4023510795960430⎠ ⎞
- 每列减去该列的最小元素
( 4 5 9 0 0 1 5 4 2 0 9 3 3 7 6 0 ) − ( 0 0 5 0 0 0 5 0 0 0 5 0 0 0 5 0 ) = ( 4 5 4 0 0 1 0 4 2 0 4 3 3 7 1 0 ) \begin{pmatrix} 4&5&9&0\\ 0&1&5&4\\ 2&0&9&3\\ 3&7&6&0\\ \end{pmatrix}- \begin{pmatrix} 0&0&5&0\\ 0&0&5&0\\ 0&0&5&0\\ 0&0&5&0\\ \end{pmatrix}= \begin{pmatrix} 4&5&4&0\\ 0&1&0&4\\ 2&0&4&3\\ 3&7&1&0\\ \end{pmatrix} ⎝ ⎛4023510795960430⎠ ⎞−⎝ ⎛0000000055550000⎠ ⎞=⎝ ⎛4023510740410430⎠ ⎞
-
试指派:
( 4 5 4 0 0 1 0 4 2 0 4 3 3 7 1 0 ) ⟹ ( 4 5 4 ⨀ ⨀ 1 ⨂ 4 2 ⨀ 4 3 3 7 1 ⨂ ) \begin{pmatrix} 4&5&4&0\\ 0&1&0&4\\ 2&0&4&3\\ 3&7&1&0\\ \end{pmatrix} \Longrightarrow \begin{pmatrix} 4&5&4&\bigodot\\ \bigodot&1&\bigotimes&4\\ 2&\bigodot&4&3\\ 3&7&1&\bigotimes\\ \end{pmatrix} ⎝ ⎛4023510740410430⎠ ⎞⟹⎝ ⎛4⨀2351⨀74⨂41⨀43⨂⎠ ⎞
找到3个独立0元素,但 m = 3 < n \text m=3<\text n m=3<n。进行下一步
- 做最少直线覆盖所有 ⨀ \bigodot ⨀元素。
4.变换系数矩阵
(
b
ij
)
(\text b_\text{ij})
(bij)以增加0元素(最小元素为1):
(
4
5
4
⨀
⨀
1
⨂
4
2
⨀
4
3
3
7
1
⨂
)
−
(
1
1
1
1
0
0
0
−
1
0
0
0
−
1
1
1
1
1
)
=
(
3
4
3
⨀
⨀
1
⨂
5
2
⨀
4
4
2
6
0
⨂
)
\begin{pmatrix} 4&5&4&\bigodot\\ \bigodot&1&\bigotimes&4\\ 2&\bigodot&4&3\\ 3&7&1&\bigotimes\\ \end{pmatrix}- \begin{pmatrix} 1&1&1&1\\ 0&0&0&-1\\ 0&0&0&-1\\ 1&1&1&1\\ \end{pmatrix}= \begin{pmatrix} 3&4&3&\bigodot\\ \bigodot&1&\bigotimes&5\\ 2&\bigodot&4&4\\ 2&6&0&\bigotimes\\ \end{pmatrix}
⎝
⎛4⨀2351⨀74⨂41⨀43⨂⎠
⎞−⎝
⎛1001100110011−1−11⎠
⎞=⎝
⎛3⨀2241⨀63⨂40⨀54⨂⎠
⎞
- 转第二步进行试指派
( 3 4 3 ⨀ ⨀ 1 ⨂ 5 2 ⨀ 4 4 2 6 0 ⨂ ) ⟹ ( 3 4 3 0 0 1 0 5 2 0 4 4 2 6 0 0 ) ⟹ ( 3 4 3 ⨀ ⨀ 1 ⨂ 5 2 ⨀ 4 4 2 6 ⨀ ⨂ ) ⟹ ( 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 ) \begin{pmatrix} 3&4&3&\bigodot\\ \bigodot&1&\bigotimes&5\\ 2&\bigodot&4&4\\ 2&6&0&\bigotimes\\ \end{pmatrix} \Longrightarrow \begin{pmatrix} 3&4&3&0\\ 0&1&0&5\\ 2&0&4&4\\ 2&6&0&0\\ \end{pmatrix} \Longrightarrow \begin{pmatrix} 3&4&3&\bigodot\\ \bigodot&1&\bigotimes&5\\ 2&\bigodot&4&4\\ 2&6&\bigodot&\bigotimes\\ \end{pmatrix} \Longrightarrow \begin{pmatrix} 0&0&0&1\\ 1&0&0&0\\ 0&1&0&0\\ 0&0&1&0\\ \end{pmatrix} ⎝ ⎛3⨀2241⨀63⨂40⨀54⨂⎠ ⎞⟹⎝ ⎛3022410630400540⎠ ⎞⟹⎝ ⎛3⨀2241⨀63⨂4⨀⨀54⨂⎠ ⎞⟹⎝ ⎛0100001000011000⎠ ⎞
整数规划问题的求解可以使用 Lingo \text{Lingo} Lingo等专用软件。对于一般的整数规划问题,无法直接利用 MATLAB \text{MATLAB} MATLAB的函数求解,必须利用 MATLAB \text{MATLAB} MATLAB编程实现分枝定界法和割平面法。但对于指派问题等特殊的整数规划问题有时可以直接利用 MATLAB \text{MATLAB} MATLAB的函数 linporg \text {linporg} linporg。
例12 求解下列指派问题,已知指派矩阵为:
C
=
(
3
8
2
10
3
8
7
2
9
7
6
4
2
7
5
8
4
2
3
5
9
10
6
9
10
)
\bf C= \begin{pmatrix} 3&8&2&10&3\\ 8&7&2&9&7\\ 6&4&2&7&5\\ 8&4&2&3&5\\ 9&10&6&9&10 \end{pmatrix}
C=⎝
⎛3868987441022226109739375510⎠
⎞
MATLAB
\text{MATLAB}
MATLAB程序如下:
c=[3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10];
c=c(:);
a=zeros(10,25);
for i=1:5
a(i,(i-1)*5+1:5*i)=1;
a(5+i,i:5:25)=1;
end
b=ones(10,1);
[x,y]=linprog(c,[],[],a,b,zeros(25,1),ones(25,1));
X=reshape(x,5,5)
opt=y
解矩阵为:
X
=
(
0
0
0
0
1
0
0
1
0
0
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
)
\bf X= \begin{pmatrix} 0&0&0&0&1\\ 0&0&1&0&0\\ 0&1&0&0&0\\ 0&0&0&1&0\\ 1&0&0&0&0\\ \end{pmatrix}
X=⎝
⎛0000100100010000001010000⎠
⎞
最优值为21.