第四章 整数规划
Integer Programming
特点-解法-应用
主要内容
整数规划的性质
整数规划的解法
分支定界法
割平面法
匈牙利法(指派问题)
整数规划的引出
例1、某公司拟用集装箱托运甲、乙两种货物,这两种货物每件的体积、 重量,可获利润以及托运所受限制如表所示。
14(百斤)
24(立方米)
托运
限制
20
10
2
5
5
4
甲
乙
每件利润(百元)
每件重量
(百斤)
每件体积
(立方米)
货物
问两种货物各装运多少箱,可使获得利润最大?
设甲、乙两种货物装运箱数分别为x1和x2。显然,x1、x2都要求为整数,于是可建立整数规划模型如下:
max z=20x1+10x2 (1)
5x1+4x2≤24 (2)
2x1+5x2≤13 (3)
x1, x2≥0 (4)
x1, x2为整数 (5)
它和线性规划问题的区别在于条件(5)。
14(百斤)
24(立方米)
托运
限制
20
10
2
5
5
4
甲
乙
每件利润(百元)
每件重量
(百斤)
每件体积
(立方米)
货物
整数规划的特点与分类
(1)在很多实际问题中,全部或部分变量的取值必须是整数,如人或机器设备等不可分割。
(2)此外还有一些问题,如要不要在某地建设工厂或指派某人去做某事,可选用一个逻辑变量x,令x=1表示在该地建厂或指派某人做事,x=0表示不在该地建厂或不指派某人做事,逻辑变量也是只允许取整数值的一类变量。
整数规划的分类
(3)纯整数线性规划(IP):
在一个线性规划中要求全部变量取整数值,或简称纯整数规划。
(4)混合整数(线性)规划(MIP):
在一个线性规划中只要求一部分变量取整数值。
整数规划的解法—“凑整法”?
直觉认为,对整数规划问题的求解可以先不考虑对变量的整数约束,作为一般线性规划问题来求解,当解为非整数时可用四舍五入或凑整方法寻找最优解。
是否合适?
是否可行?
例1、
求下述整数规划问题的最优解
(3,3)
(3,2)
(4,3)
(4,2)
(4,1),Z=14
(,)
2x1+3x2=14
x1+=
3x1+2x2=0
如果不考虑x1、x2取整数的约束,用图解法求得最优解为(,)。由于x1、x2必须取整数值,实际上问题的可行解集只是图中可行域内的那些整数点。用凑整法来解时需要比较四种组合,但(4,3)、(4,2)、(3,3)都不是可行解,(3,2)虽属可行解,但代入目标函数得z=13,并非最优。实际上问题的最优解应该是(4,1),z*=14。
注意:(4,1)不是可行域的顶点,因此直接用图解法或单纯形法都无法找出整数规划问题的最优解来。
这就要求研究解整数规划问题的特殊方法。
收 获
整数规划的可行域包含在其对应的一般线性规划可行域之内;
整数规划的最优解可能不是其对应的一般线性规划的顶点;
整数规划需要专门的求解方法。
整数规划与对应的线性规划解的关系
1、任何求max的纯整数规划或混合整数规划的最大目标函数值小于或等于相应的线性规划的最大目标函数值;(对应线性规划最优解为其上界)
2、任何求min的纯整数规划或混合整数规划的最小目标函数值大于或等于相应的线性规划的最小目标函数。(对应线性规划最优解为其下界)
3、整数规划之相应线性规划的最优解经四舍五入不能得到其最优解
整数规划的最优解不会优于其对应的线性规划的最优解。
既然不能通过凑整来求解,可以逐步将对应线性规划可行域中的非整数部分舍去。
整数规划的解法
分支定界法
割平面法
匈牙利法
整数规划解法
——分枝定界法
步骤:
1、寻找替代问题并求解
2、分枝与定界
3、剪枝
1、基本思路:整数规划的最优解不会优于相应的线性规划的最优解。对于极大值问题,相应线性规划的最大值成为整数规划目标函数的上界。
maxZ=CX
AX=b
X0
(A)
max Z=CX
AX=b
X0
X为整数
(B)
(B)为(A)的松弛问题。
(1)替代问题的确定
(2)替代问题的求解
max Z=CX
AX=b
X0
(B)
采用相应的方法(如图解法)求解出替代问题的最优解,观察其是否满足整数解的要求。如其最优解就为整数,则结束;如含有分数,则需要进行分支定界操作。
(3)分支与定界—增加约束
如替代问题的解不符合整数条件,则需要对原问题进行分支。
分支方法:假设替代问题的解为[i,i+1]之间的一个数,则分成两支:一支增加约束xj≤i,另一支增加约束xj ≥ i+1;
对上述两个问题进行求解:不考虑整数问题时,求解对应的线性规划问题,观察其最优解是否是整数,如不是,则继续分支定界,直到得到全部整数解为止。
X*
Xj*
i+1
i
(C)
(D)
(B)
Xj i+1
(B)
Xj i
max Z=40X1 + 90X2
9X1+7X2 56
7X1+20X2 70
X1 , X2 0
X1 , X2为整数
例:
解:先解该整数规划对应的松弛问题
X* =
Z* =, 上界Z*
选X1分枝
问题(2)
(1)
X1 4
问题(3)
(1)
X1 5
将[4,5]之间的非整数部分舍去
选(2)继续分枝
问题(4)
(2)
X2 2
问题(5)
(2)
X2 3
解为
X1 =4
X2 =
Z=
解为
X1 =5
X2 =
Z=
问题2
问题3
(1)
(2)
4
(3)
5
(4)
4
2
340
(5)
3
340
(6)
1
340
(7)
无解
X1 4
X1 5
X2 2
X2 1
X2 2
X2 3
分支定界过程
整数规划解法2——割平面法
割平面法的基本思想:
在整数规划问题的松弛问题中依次引进线性约束条件(称Gomory约束,高莫雷约束或割平面),使问题的可行域逐步缩小。但每次切割时,只割去问题的部分非整数解,而不切割任何整数的可行解,直到使问题的目标函数值达到最优的整数点成为缩小后可行域的一个顶点,这样就可以用求解线性规划问题的方法找出这个最优解。
整数规划的解法——匈牙利法
应用于分配问题或指派问题
分配问题也称指派问题,是一种特殊的整数规划问题。
假定有m项任务分配给m个人去完成,并指定每人完成其中一项,每项只交给其中一个人去完成,应如何分配使总的效率为最高。
1、指派问题一般模型的引出
例:有一份说明书,要分别译成英、日、德、俄四种文字,交甲、乙、丙、丁四个人去完成。因各人专长不同,他们完成翻译不同文字所需的时间(h)如表所示。问:如何分配任务使效率最高(所需总时间最短)?
9
13
15
4
译成俄文
11
16
14
13
译成德文
8
14
4
15
译成日文
7
9
10
2
译成英文
丁
丙
乙
甲
人
工作
从人的角度看
从任务角度看
指派问题的一般模型
假设:
[aij]表示指派问题的效率矩阵
xij表示决策变量,决策变量的取值:
指派问题的一般模型
指派问题的一般数学模型
2、指派问题的求解方法
单纯形法
表上作业法
匈牙利法
(1)指派问题的求解—匈牙利法
核心思路:基于这样一个事实:如果效率矩阵的所有元素aij≥0,而其中存在一组位于不同行、不同列的零元素,则只要令对应于这些零元素的xij=1(分配任务),其余的xij =0,则目标函数z必然会取得最小(0)。
0
14
12
5
8
3
0
20
23
0
20
9
3
9
14
0
只需令:x11=1,x23=1,x32=1,x44=1,即第一项各种分配给甲,二工作→丙,三→乙,四→丁。总工作时间最少。
效率矩阵
问 题
要求:效率矩阵中存在零元素,同时存在不在同一行、同一列的零元素。
实际的效率矩阵中,是不可能存在0元素的,那么如何获得这种特殊的效率矩阵?
如何让效率矩阵中产生零元素;
如何让产生的零元素位于不同行和不同列。
(2)零元素的产生方法:
匈牙利法的基本定理1
如果从分配问题效率矩阵[aij]的每一行元素中分别减去(或加上)一个常数ui (被称为该行的位势),从每一列分别减去(或加上)一个常数vj (称为该列的位势),得到一个新的效率矩阵[bij],若其中
则[bij]的最优解等价于[aij]的最优解(说明,经过变换后,有零的新效率矩阵取得最优解时,原效率矩阵也同时取得最优解)
(3)独立零元素的判断方法:
匈牙利法的基本定理2
若矩阵A的元素可分成“0”与非“0”两部分,则覆盖“0”元素的最少直线数等于位于不同行、不同列的“0”元素的最大个数。
若矩阵A的元素可分成“0”与非“0”两部分,则覆盖“0”元素的最少直线数等于位于不同行、不同列的“0”元素的最大个数。
将确定一个效率矩阵中最大独立零元素的个数,转化为寻找覆盖所有零元素所需的最少直线数。
匈牙利法的计算步骤
基本步骤:在效率矩阵中产生零元素→判断独立的零元素个数是否等于任务数或人数?→如是,则对效率矩阵中独立零元素所处的位置进行指派(对应的决策变量为1),完成→如否,则要继续产生足够的独立零元素。
通过实例来说明匈牙利法求解指派问题的过程。
例:
有一份说明书,要分别译成英、日、德、俄四种文字,交甲、乙、丙、丁四个人去完成。因各人专长不同,他们完成翻译不同文字所需的时间(h)如表所示。问:如何分配任务使效率最高?
9
13
15
4
译成俄文
11
16
14
13
译成德文
8
14
4
15
译成日文
7
9
10
2
译成英文
丁
丙
乙
甲
人
工作
效率矩阵
步骤一:零元素的产生。
方法:找出效率矩阵每行的最小元素,并分别从每行中减去它。
min
实际含义:从事情的角度来考虑,表示此事分配给此人效率最高。
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
®
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
5
9
11
0
0
5
3
2
4
10
0
11
5
7
8
0
4
11
4
2
9
13
15
4
11
16
14
13
8
14
4
15
7
9
10
2
步骤二:继续产生零元素
方法:再找出矩阵每列的最小元素,再分别从各列中减去它。
min 0 0 5 0
实际含义:从人的角度来考虑,表示某人做此事效率最高。
®
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
5
4
11
0
0
0
3
2
4
5
0
11
5
2
8
0
2
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
5
9
11
0
0
5
3
4
10
0
11
5
7
8
0
步骤三:判断零元素是否位于不同行、不同列?
经过上述两步变换后,矩阵的每行每列至少都有了一个零元素。
确定能否找出m个位于不同行不同列的零元素的集合(本例中m=4),
直观法:m很小时,直接判断得到;
非直观法:m很大时,根据一定规则寻找。
直观法
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
5
4
11
0
0
0
3
2
4
5
0
11
5
2
8
0
只有3个0元素位于不同行、不同列
非直观法-步骤1(试指派过程)
(1) <从任务的角度来挑选>从第一行开始,若该行只有一个零元素,就对这个零元素打上( )号。<表示该0元素处在单独的一行>
同时,对打( )号零元素所在列画一条直线,表示此列已经确定(人员确定),不能再从事其他行的工作(任务) 。
若该行没有零元素或有两个以上零元素(已划去的零元素不计在内),则转下一行,按照上述方法依次进行到最后一行;
例:从行开始的独立零元素的寻找与判断
( )
( )
从行开始标定独立零元素时,只能找到两个独立的零元素。
非直观法-步骤2
(2) <从人的角度>在行寻找的基础上,从第一列开始,若该列只有一个零元素就对这个零元素打上( )号(同样不考虑已划去的零元素),
对打( )号零元素所在行画一条直线(任务分配完毕,不能再分配给其他人)。
若该列没有零元素或有两个以上零元素,则转下一列,依次进行到最后一列;
例:从列开始的独立零元素的寻找与判断
( )
在行标定后的基础上,从第一列开始标定独立零元素时,只能找到一独立的零元素。
问 题
只能对三个零元素进行标定(代表独立的零元素只有三个),后续如何操作?
非直观法-步骤3(第一种情形)
(3) 重复(1)、(2)两个步骤,可能出现三种情况:
① 效率矩阵每行都有一个打( )号的零元素,很显然,按上述步骤得到的打( )号的零元素都位于不同行不同列,只要令对应打( )号零元素对应的决策变量xij=1就找到了问题的最优解;
第一种情形
x11=1,x22=1,x33=1,x44=1。
任务一→甲;二→乙;三→丙;四→丁
任务一
任务二
任务三
任务四
甲 乙 丙 丁
非直观法-4(第二种情形)
② 打( )号的零元素个数小于m,但未被划去的零元素之间存在闭回路(全以0为拐点),这时可顺着闭回路的走向,对每个间隔的零元素打一( )号,然后对所有打( )号的零元素,或所在行,或所在列画一条直线(一般会出现多种方案)。如:
或
第二种情形
( )
( )
只能给两个零元素打括号,还有四个零元素不能打上括号。剩下的未被划去和未打括号的零元素存在闭回路。
( )
( )
x13=1,x22=1,x31=1,x44=1
结论1
结论2
( )
( )
x14=1,x22=1,x31=1,x43=1
非直观法-5(第三种情形)
③ 矩阵中所有零元素或被划去,或打上( )号,但打( )号的零元素个数小于m,如:
打括号的零元素3<m=4。证明0元素产生的还不够,还应继续产生。
步骤四:继续创造零元素。
方法:为设法使每一行都有一个打( )号的零元素,需要继续按定理1对矩阵进行变换。
(1) 从矩阵未被直线覆盖的数字中找出一个最小的数k;
(2) 对矩阵的每行,当该行有直线覆盖时,令ui= 0,无直线覆盖的,令ui=k;
(3) 对矩阵每列,有直线覆盖的列,令vj= -k,对无直线覆盖的列,令vj=0;
(4) 从原矩阵的每个元素aij中分别减去ui和vj,得到一个新的矩阵( aij - ui - vj ),保证新矩阵中,原打括号的0元素不变,同时产生新的零元素。
步骤五:回到第三步,反复进行,一直到矩阵的每一行都有一个打( )号的零元素为止,即找到了最优分配方案。
ui
vj
9
13
15
4
译成俄文
11
16
14
13
译成德文
8
14
4
15
译成日文
7
9
10
2
译成英文
丁
丙
乙
甲
人
工作
最优分配方案为:
甲将说明书译成俄文,乙译成日文,丙译成英文,丁译成德文,
全部所需时间为4+4+9+11=28小时。
回顾:指派问题的计算过程
效率矩阵
步骤一:产生每行的零元素。
方法:从每行中找出最小的元素,与对应的每行元素相减
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
5
9
11
0
0
5
3
2
4
10
0
11
5
7
8
0
4
11
4
2
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
9
13
15
4
11
16
14
13
8
14
4
15
7
9
10
2
min
每行减去对应的最小元素
步骤二:产生位于每列的零元素
方法:再找出矩阵每列的最小元素,再分别从各列中减去。
min 0 0 5 0
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
5
4
11
0
0
0
3
2
4
5
0
11
5
2
8
0
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
5
9
11
0
0
5
3
2
4
10
0
11
5
7
8
0
每列减去对应的最小元素
保证每行、每列都至少有一个0元素。
步骤三:判断零元素是否位于不同行、不同列。
方法:首先从行开始试指派,只有一个零元素时,对零元素打括号,并对所在列画直线。而有多个零元素,或零元素已被画去,则转下一行;行分析完毕后,然后从列开始试指派,对每列只有一个零元素时,打括号,并画去其所在的行。
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
5
4
11
0
0
0
3
2
4
5
0
11
5
2
8
0
( )
( )
行试指派过程
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
5
4
11
0
0
0
3
2
4
5
0
11
5
2
8
0
( )
( )
列试指派过程
( )
步骤四:继续创造零元素。
方法:从未被画去的元素中,找到一个最小的元素k。
(1)对行的操作:选择行位势ui,如果行被直线覆盖,则ui=0;如果未被覆盖,ui=k;
(2)列的操作:列位势vj,如果列被直线覆盖,vj=-k;如果未被覆盖,vj=0。
(3)产生新的效率矩阵:bij= aij’ -ui-vj
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
5
4
11
0
0
0
3
2
4
5
0
11
5
2
8
0
( )
( )
( )
1、最小元素k=2;2、ui依次为2、2、0和2;3、vj依次取为-2、-2、0和0.。
ui
2
2
0
2
vj
-2
-2
0
0
bij= aij’ -ui-vj
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
3
2
11
0
0
0
5
4
2
3
0
11
3
0
8
0
步骤五:继续判断零元素是否位于不同行、不同列。
方法:首先从行开始试指派,只有一个零元素时,对零元素打括号,并对所在列画直线。而有多个零元素,或零元素已被画去,则转下一行;行分析完毕后,然后从列开始试指派,对每列只有一个零元素时,打括号,并画去其所在的行。
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
3
2
11
0
0
0
5
4
2
3
0
11
3
0
8
0
( )
( )
( )
( )
最终结果
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
3
2
11
0
0
0
5
4
2
3
0
11
3
0
8
0
( )
( )
( )
( )
步骤六:获得最后结果。
方法:对于打括号的零元素处进行指派,即可获得最短时间。
ú
ú
ú
ú
û
ù
ê
ê
ê
ê
ë
é
3
2
11
0
0
0
5
4
2
3
0
11
3
0
8
0
( )
( )
( )
( )
x13=1(工作一→丙)
x22=1 (工作二→乙)
x34=1 (工作三→丁)
x41=1(工作四→甲)
最短时间为:9+4+11+4=28 h。
指派结果
极大化的指派问题
对于目标为求极大的指派问题,先要对
效率矩阵进行处理:
(1)找出效率矩阵中的最大值,分别用它去减阵中每一元素,得到新矩阵;
(2)对新得到的矩阵用原匈牙利法求解。
例、有 4 种机械要分别安装在4个工地,它们
在4个工地的工作效率不同,问应如何指
派,可使4台机械发挥的总效益最大?
30 25 40 32
32 35 30 36
35 40 34 27
28 43 32 38
Ⅰ
Ⅱ
Ⅲ
Ⅳ
甲 乙 丙 丁
工地
机器
解:
原效益矩阵中 max Cij= Cij=43
所以 bij= 43- Cij ( i , j=1, 2, 3, 4)
人数和任务数不相等
例 、4项工作分配给6个人完成,有人可不做
3 6 2 6
7 1 4 4
3 6 5 8
6 4 3 7
5 2 4 3
5 7 6 2
Ⅰ Ⅱ Ⅲ Ⅳ
1
2
3
4
5
6
工作
人
解:虚设两项假想的任务
3 6 2 6 0 0
7 1 4 4 0 0
3 6 5 8 0 0
6 4 3 7 0 0
5 2 4 3 0 0
5 7 6 2 0 0
Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ
1
2
3
4
5
6
工作
人
0 5 0 4 0 0
4 0 2 2 0 0
0 5 3 6 0 0
3 3 1 5 0 0
2 1 2 1 0 0
2 6 4 0 0 0
Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ
1
2
3
4
5
6
工作
人
(0)
(0)
(0)
(0)
(0)
(0)
人员安排:1→ Ⅲ,2 → Ⅱ;3 → Ⅰ ;4,5休息;6→ Ⅳ
总的时间为:2+1+3+2=8
0 5 0 4 0 0
4 0 2 2 0 0
0 5 3 6 0 0
3 3 1 5 0 0
2 1 2 1 0 0
2 6 4 0 0 0
Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ
1
2
3
4
5
6
工作
人
(0)
(0)
(0)
(0)
(0)
(0)
人员安排:1→ Ⅲ,2 → Ⅱ;3 → Ⅰ ;4,5休息;6→ Ⅳ
总的时间为:2+1+3+2=8
例、
4人完成5项任务,每人可完成1~2项
25 29 31 42 37
39 38 26 20 33
34 27 28 40 32
24 42 36 23 45
A B C D E
甲
乙
丙
丁
任务
人
解:因每个人可担任一至二项任务,因此将4人
看作8人,再虚设3项任务,化为平衡指派问题。
25 29 31 42 37 0 0 0
39 38 26 20 33 0 0 0
34 27 28 40 32 0 0 0
24 42 36 23 45 0 0 0
25 29 31 42 37 0 0 0
39 38 26 20 33 0 0 0
34 27 28 40 32 0 0 0
24 42 36 23 45 0 0 0
A B C D E F G H
甲
乙
丙
丁
甲
乙
丙
丁
任务
人
最优解:甲——无
乙——C, D
丙——B, E
丁——A
min Z=129
例、
4人完成5项任务,其中一人完成两项,其余每人一项
25 29 31 42 37
39 38 26 20 33
34 27 28 40 32
24 42 36 23 45
A B C D E
甲
乙
丙
丁
任务
人
解:虚设一人戊,完成各任务时间为甲、乙、
丙、丁中最小者,化为平衡指派问题。
25 29 31 42 37
39 38 26 20 33
34 27 28 40 32
24 42 36 23 45
24 27 26 20 32
A B C D E
甲
乙
丙
丁
戊
任务
人
最优方案:甲——B 乙——D、C 丙——E
丁——A 最小时间=131
P109:
有4个工人,要指派他们分别完成4项工作,每人做每项工作所消耗的时间如表所示。问指派哪个人去完成哪项工作,可使总的消耗时间最小?(表中时间单位为h)
17
23
21
19
丁
19
16
17
26
丙
18
22
23
19
乙
24
21
18
15
甲
D
C
B
A
工作
工人
作业
P109:
已知下列5名运动员各种姿势的游泳成绩(距离为50m)如表所示。试问如何从中选拔一个参加200m混合泳的接力队(四种游泳姿势),使预期比赛成绩最好。(表中时间单位为S)
思 考
37
王
自由泳
蝶泳
蛙泳
仰泳
周
张
钱
赵
人
项目