670 likes | 833 Views
运筹学教程. 版权所有,未经准许,不得翻制. 第五章 整 数 规 划. 整数规划及其数学模型 用分支定界法求解整数规划 0-1 型整数规划 指派问题及其 LINGO 模型. 第一节 整数规划及其数学模型. 一、 整数规划数学模型的一般形式
E N D
运筹学教程 版权所有,未经准许,不得翻制
第五章 整 数 规 划 • 整数规划及其数学模型 • 用分支定界法求解整数规划 • 0-1型整数规划 • 指派问题及其LINGO模型
第一节 整数规划及其数学模型 一、 整数规划数学模型的一般形式 要求一部分或全部决策变量必须取整数值的规划问题称为整数规划(integer programming,简记IP)。不考虑整数条件,由余下的目标函数和约束条件构成的规划问题称为该整数规划问题的松弛问题(slack problem)。若松弛问题是一个线性规则,则称该整数规划为整数线性规划(integer linear programming)。整数线性规划数学模型的一般形式为:
第一节 整数规划及其数学模型 Opt Z = c1x1 + c2 x2 + ... + cn xn (1-1) (1-2)
第一节 整数规划及其数学模型 整数线性规划问题分为下列几种类型: 1.纯整数线性规划:指全部决策变量部必须取整数值的整数线性规划。有时,也称为全整数规划。 2.混合整数线性规划:指决策变量中有一部分必须取整数值,另一部分可以不取整数值的整数线性规划。 3.0-1型整数线性规划:指决策变量只能取值0或1的整数线性规划。
第一节 整数规划及其数学模型 本章仅讨论整数线性规划。后面提到的整数规划,一般都是指整数线性规划。 整数规划的实例很多。例如,我们前面介绍的生产问题,如果产量的单位是件,则往往就要求变量取整数。另外,在表示工厂何时开工等问题时,往往需要利用0-1型整数变量。 二、整数规划解的特点 整数线性规划及其松弛问题,从解的特点上看,二者之间既有密切的联系,又有本质区别。
第一节 整数规划及其数学模型 松弛问题作为一个线性规划问题,其可行解的集合是一个凸集,任意两个可行解的凸组合仍为可行解。整数规划问题的可行解集合是它的松弛问题可行解集合的一个子集,任意两个可行解的凸组合不一定满足整数约束条件,因而不一定仍为可行解。由于整数规划问题的可行解一定也是它的松弛问题的可行解(反之则不一定),所以,整数规划问题最优解的目标函数值不会优于松弛问题最优解的目标函数值。
第一节 整数规划及其数学模型 在一般情况下,松弛问题的最优解不会刚好满足变量的整数约束条件,因而不是整数规划的可行解,自然就不是整数规划的最优解。此时,若对松弛问题的这个最优解中不符合整数要求的分量简单地取整数,所得到的解不一定是整数规划问题的最优解,甚至还不一定是整数规划问题的可行解。
第一节 整数规划及其数学模型 例1考虑下面的整数规划问题: 画出可行域见图4-1。在图4-1中,四边形OBPC及其内部的点为松弛问题的可行域,其中那些整数格点为整数规划问题的可行解。根据目标函数等值线的优化方向,P点(x1=18/7, x2=19/7)就是其松弛问题的最优解,z=94/7。
第一节 整数规划及其数学模型 在P点附近对x1和x2简单取整,可得四点:A1,A2,A3和A4。其中,Al和A2为非可行解;A3和A4虽为可行解,但不是最优解。 图4-1 例1的图解法
第一节 整数规划及其数学模型 本例整数规划的最优解为A*点(x1=4,x2=2),其目标函数值Z =12。 由于整数规划及其松弛问题之间的上述特殊关系,像例4先求松弛问题最优解,再用简单取整的方法虽然直观简单,却并不是求解整数规划的有效方法。
第二节 用分支定界法求解整数规划 通常,混合整数规划问题一般有无限多个可行解。即使是纯整数规划问题,随着问题规模的扩大,其可行解的数目也将急剧增加。因此通过枚举全部可行解,并从中筛选出最优解的算法无实际应用价值。分支定界法(branch and bound method)是一种隐枚举法(implicit enumeration)或部分枚举法,它是在枚举法基础上的改进。分支定界法的关键是分支和定界。
第二节 用分支定界法求解整数规划 若整数规划的松弛问题的最优解不符合整数要求,假设Xi=b*不符合整数要求;[b*]是不超过b*的最大整数,则构造两个约束条件:Xi ≤ [b*]和Xi ≥[b*]+1。分别将其并入上述松弛问题中,从而形成两个分支,即两个后继问题。这两个后继问题的可行域中包含原整数规划问题的所有可行解。而在原松弛问题可行域中,满足的一部分区域在以后的求解过程中被遗弃了,然而它不包含整数规划的任何可行解。
第二节 用分支定界法求解整数规划 根据需要,各个后继问题可以类似地产生自己的分支,即自己的后继问题。如此不断继续,直到获得整数规划最优解。这就是所谓“分支”。 所谓“定界”,是在分支过程中,若某个后继问题恰巧获得整数规划问题的一个可行解,那么,它的目标函数值就是一个“界限”,可作为衡量处理其他分支的一个依据。因为整数规划问题的可行解集是它的松弛问题可行解集的一个子集,前者最优解的目标函数值不会优于后者。
第二节 用分支定界法求解整数规划 所以,对于那些相应松弛问题最优解的目标函数值比上述“界限”值差的后继问题,就可以剔除而不再考虑了。当然,如果在以后的分支过程中出现了更好的“界限”,则以它来取代原来的界限,这样可以提高定界的效果。 “分支”为求出整数规划最优解创造了条件,而“定界”则可以提高搜索的效率。经验表明,根据对实际问题的了解,事先选择一个合理的“界限”,可以提高分支定界的搜索效率。
第二节 用分支定界法求解整数规划 下面介绍分之定界法的基本步骤。 步骤1:称整数规划问题为问题A,它的松弛问题为问题B,以Zb表示问题A的目标函数的初始界(如已知问题A的一个可行解,则可取它的目标函数值Zb)。对于最大化问题A,Zb为下界;对最小化问题A,Zb为上界。解问题B。转步骤2;
第二节 用分支定界法求解整数规划 步骤2:如问题B无可行解,则问题A也无可行解;如问题B的最优解符合问题A的整数要求,则它就是问题A的最优解。对于这两种情况,求解过程到此结束。如问题B的最优解存在,但不符合问题A的整数要求,则转步骤3;
第二节 用分支定界法求解整数规划 步骤3:对问题B,任选一个不符合整数要求的变量进行分支。设选择Xi=b(其中b不是整数),且设[b]为不超过b的最大整数。对问题B分别增加下面两个约束条件中的一个: Xi <= [b]和 Xi => [b]+1 从而形成两个后继问题。解这两个后继问题。转步骤4;
第二节 用分支定界法求解整数规划 步骤4:考查所有后继问题,如其中有某几个存在最优解,且其最优解满足问题A的整数要求,则以它们中最优的目标函数值和界Zb作比较。若比界Zb更优,则以其取代原来的界Zb,并称相应的后继问题为问题C。否则,原来的界Zb不变。转步骤5;
第二节 用分支定界法求解整数规划 步骤5:在不属于C的后继问题中,称存在最优解且其目标函数值比界zb更优的后继问题为待检查的后继问题。 若不存在待检查的后继问题,当问题C存在时,问题C的最优解就是问题A的最优解;当问题C不存在时,和界Zb对应的可行解就是问题A的最优解。Zb即为问题A的最优解的目标函数值,求解到此结束。
第二节 用分支定界法求解整数规划 若存在待检查的后继问题,则选择其中目标函数值最优的一个后继问题,改称其为问题B。回到步骤3。 从分支定界法的原理和步骤可知,它也适用于求解混合整数规划问题。如在下面的例题中,假如原问题仅要求x1是整数,那么(H1)的解就是原问题的最优解。 分支定界法是求解整数规划的较好方法,在实际问题中有着广泛应用。
第二节 用分支定界法求解整数规划 例2 求解整数规划A。B为A的松弛问题 (A) (B)
第二节 用分支定界法求解整数规划 松弛问题(B)的最优解是x1=3/2,x2=10/3,不符合整数的要求。取x1为分支变量,得到两个后继问题H1和后继问题H2。另外,显然可以取Zb=0(x1=0,x2=0是原问题的可行解)。 (H1) (H2)
第二节 用分支定界法求解整数规划 分别求解两个后继问题,得到相应的最优解如下: H1:x1=2,x2=23/9,Z=41/9 H2:x1=1,x2=7/3, Z=10/3 这两个后继问题都不符合整数的要求,所以还要继续分支。由于H1的目标函数值大于H2的目标函数值,故选择H1继续分支。得到两个后继问题H11和H12。
第二节 用分支定界法求解整数规划 (H11) (H12) 分别求解两个后继问题,得到相应的最优解如下: H11:无可行解
第二节 用分支定界法求解整数规划 H12:x1=33/14,x2=2,Z=61/14 还是没有符合整数要求的解。对H12继续进行分支,得到两个后继问题H121和H122. (H121) (H122)
第二节 用分支定界法求解整数规划 分别求解两个后继问题,得到相应的最优解如下: H121:x1=2,x2=2,Z=4 H122:x1=3,x2=1,Z=4 所以,Zb由0改为4。由于待检的后继问题H2的目标函数值为10/3小于4,原问题A是求最大,故H2无须再分支了。这样,我们就求出了原问题的最优解:x1=3,x2=1或x1=2,x2=2,目标函数值为4。 上述分之定界法求解的过程可以用图4-1表示。
第二节 用分支定界法求解整数规划 图4-1 例2的分支定界解法示意图
第三节 0-1型整数规划 一、0-1变量及其应用 如前所述,若变量只能取值0或l,则称其为0-l变量。 0-l变量作为逻辑变量(1ogical variable),常被用来表示系统是否处于某个特定状态,或者决策时是否取某个特定方案。例如
第三节 0-1型整数规划 当问题含有多项要素,而每项要素皆有两种选择时,可用一组0-1变量来描述。一般地,设问题有有限项要素E1,E2,…,En。其中每项Ej有两种选择Aj和非Aj(j=1,2,…,n),则可令: 那么,向量(x1, x2, … , xn)T就描述了问题的特定状态或方案,即
第二节 用分支定界法求解整数规划 在应用中,有时会遇到变量可以取多个整数值的问题。这时,利用0-l变量是二进制变量(binary variable)的性质,可以用一组0-1变量来取代该变量。例如,变量x可取0与9之间的任意整数时,可令:
第二节 用分支定界法求解整数规划 其中,x0,x1,x2,x3皆为0-1变量。 例3 工件排序问题 用4台机床加工3件产品。各产品的机床加工顺序,以及产品i机床j上的加工时间aij见表4-1。 现在要求确定各件产品在机床上的加工方案,使在最短的时间内加工完全部产品。
第二节 用分支定界法求解整数规划 表4-1 工件排序数据表 解:下面给出这个问题的LINGO模型。注意:上面表格中的数据要给出具体的数值。由于下面的模型数据与公式完全分离,对于不同的类似问题只要更换数据即可。
第二节 用分支定界法求解整数规划 ModeL sets: chanp/1..3/; jizhuang/1..4/; shi/1..8/; chanpshi(chanp,shi):shijian; !shijian就是产品的具体加工时间; links(chanp,jizhuang):a,x,y; endsets
第二节 用分支定界法求解整数规划 data: a=6 0 3 4 4 1 0 6 0 6 8 0; enddata s=@size(chanp); m=@size(jizhuang); min = w; @for(chanp(i):W>=x(i,m)+a(i,m));
第二节 用分支定界法求解整数规划 @for(links(i,j)|j#lt#m: x(i,j)+a(i,j)<=x(i,j+1)); @for(chanp(i): @for(links(j,k) |j#gt#i#and#a(i,k)#gt#0#and#a(j,k)#gt#0: x(i,k)+A(i,k)<x(j,k)+1000*y(j,k); x(j,k)+A(j,k)<x(i,k)+1000*(1-y(j,k)) ) );
第二节 用分支定界法求解整数规划 @for(links(i,j):@bin(y(i,j))); @for(links(i,j): shijian(i,2*j-1)=x(i,j); shijian(i,2*j)=x(i,j)+a(i,j) ); END 为了更加直观起见,我们将上面的模型插入到一个 Excel表格中,模型的输入数据和输出结果也都存放在这个表格中。激活模型并进行求解,就将显示出新的结果。如图4-2所示。
第二节 用分支定界法求解整数规划 图4-2 工件排序
第四节 指派问题 一、指派问题的标准形式及其数学模型 在现实生活中,有各种性质的指派问题(assignment problem)。例如,有若干项工作需要分配给若干人(或部门)来完成;有若干项合同需要选择若干个投标者来承包;有若干班级需要安排在各教室里上课等等。诸如此类问题,它们的基本要求是在满足特定的指派要求条件下,使指派方案的总体效果最佳。由于指派问题的多样性.有必要定义指派问题的标准形式。
第四节 指派问题 指派问题的标准形式(以人和事为例)是:有n个人和n件件事,已知第i人做第j时的费用为cij(i,j=1,2,…,n),要求确定人和事之间的一一对应的指派方案,使完成这n件事的总费用最少。 一般称下面的矩阵为指派问题的系数矩阵。
第四节 指派问题 在实际问题中,根据cij的具体意义,矩阵C可以有不同的含义,如费用、成本、时间等。系数矩阵C中,第i行中各元素表示第i人做各事的费用,第j列各元素表示第j事由各人做的费用。 为了建立标准指派问题的数学模型,引入n2个0-1变量:
第四节 指派问题 这样,指派问题的数学模型可写成:
第四节 指派问题 模型中限制变量只取0或1,满足一行(列)中有且只有一个1。 对于任何一个数学模型,如果对变量有取整数的限制,则相应的模型就是整数规划。利用LINGO求解整数规划非常容易。例如限制x取整数,可用“@gin(x);”即可;如限制取x取0或1,可用“@bin(x);”即可。
第四节 指派问题 例4 某商业公司计划开办五家新商店。为了尽早建成营业,商业公司决定由5家建筑公司分别承建。已知建筑公司Ai(i=1,2,…,5)对新商店Bj(j=1,2,…,5)的建造费用的报价(万元)为cij (i,j=l,2,…,5),详见表3-12。问商业公司应当怎样分配建造任务给5家建筑公司,才能使总的建造费用最少?
第四节 指派问题 表4-2 报价数据 解: 这是一个n等于5的指派问题。建立相应的LINGO模型如下:
第四节 指派问题 !指派问题的数学模型; !这是一个n等于5的指派问题; sets: a/1..5/; aa(a,a):c,x; endsets @for(a(j):@sum(a(i):x(i,j))=1); @for(a(i):@sum(a(j):x(i,j))=1);
第四节 指派问题 data: c= 4 8 7 15 12 7 9 17 14 10 6 9 12 8 7 6 7 14 6 10 6 9 12 10 6; Enddata min=@sum(aa:c*x); @for(aa(i,j):@bin(x(i,j)));
第四节 指派问题 运行模型可得下面的解答( 演示): Objective value: 34.00000 Variable Value X( 1, 3) 1.000000 X( 2, 2) 1.000000 X( 3, 1) 1.000000 X( 4, 4) 1.000000 X( 5, 5) 1.000000
第四节 指派问题 二、匈牙利解法 我们知道标准的指派问题是—类特殊的整数规划问题,又是特殊的0—l规划问题和特殊的运输问题。因此,它可以用多种相应的解法来求解。但是,这些解法都没有充分利用指派问题的特殊性质,有效地减少其计算量。1955年,库恩利用匈牙利数学家康尼格(D.Konik)的关于矩阵中独立零元素的定理,提出了解指派问题的—种算法,习惯上称之为匈牙利解法。
第四节 指派问题 匈牙利解法的关键是利用了指派问题最优解的以下性质:若将指派问题的系数矩阵C=(cij)n×n的某行(或某列)各元素分别减去—个常数K,得到—个新的矩阵: 则以C和C’为系数矩阵的两个指派问题有相同的最优解。这个性质容易理解。由于系数矩阵的这种变化并不影响数学模型的约束方程组,而只是使目标函数值减少了K。所以,最优解不变。