数学规划中的变量(全部或部分)限制为整数时,称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。
例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整数规划。
这四个分类中都要求决策变量是非负整数,我觉得这是因为数学模型解决的是生活中的实际问题,而不是单纯的数学问题,所以这里对决策变量做了非负整数的规定。
松弛变量与剩余变量:为了使线性约束的不等式约束变为等式约束,我们通过引入额外的变量来达到这一目的,即松弛变量和剩余变量。
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 = [ 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 + ∑ 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]的可行域给割掉,割掉的部分不含整数解。
例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)。
该人可以等价为几个相同的人。
该人做该工作的相应代价取足够大 M \text M M,只要该人做了这件工作,则肯定不是最优解。
非标准形式的指派问题转换为标准型的思想就是将最终的矩阵转变为方阵。
例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。进行下一步
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.