整数规划

1.1  定义 

目录

1.1  定义                                      1.2   整数规划的分类 

1.2  整数规划特点                       1.3  求解方法分类 

2  分枝定界法

分枝定界法的主要思路                                            分枝定界法求解整数规划问题的步骤

3   0− 1型整数规划 

3.1  投资场所的选定——相互排斥的计划                 3.2 相互排斥的约束条件 

3.3 关于固定费用的问题(Fixed Cost Problem)

3.4   0−1  型整数规划解法之一(过滤隐枚举法)

4 蒙特卡洛法(随机取样法)

5 指派问题的计算机求解 :bintprog 函数

6  生产与销售计划问题

6.1  问题实例               6.2  建立模型                             6.3  求解模型                             习 题


规划中的变量(部分或全部)限制为整数时,称为整数规划。若在线性规划模型中, 变量限制为整数,则称为整数线性规划。目前所流行的求解整数规划的方法,往往只适用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划。 

1.2   整数规划的分类 

如不加特殊说明,一般指整数线性规划。对于整数线性规划模型大致可分为两类: 

  •  变量全限制为整数时,称纯(完全)整数规划。
  • 变量部分限制为整数的,称混合整数规划。

1.2  整数规划特点

(i) 原线性规划有优解,当自变量限制为整数后,其整数规划解出现下述情况:

  •  ①原线性规划优解全是整数,则整数规划优解与线性规划优解一致。
  •  ②整数规划无可行解。
  • ③有可行解(当然就存在优解),但优解值变差。 

(ii) 整数规划优解不能按照实数优解简单取整而获得。 

例 1  原线性规划为   

1.3  求解方法分类 

(i)分枝定界法—可求纯或混合整数线性规划。

(ii)割平面法—可求纯或混合整数线性规划。

(iii)隐枚举法—求解“0-1”整数规划:    

  • ①过滤隐枚举法;    
  • ②分枝隐枚举法。

(iv)匈牙利法—解决指派问题(“0-1”规划特殊情形)。

(v)蒙特卡洛法—求解各种类型规划。

下面将简要介绍常用的几种求解整数规划的方法。 

2  分枝定界法

分枝定界法的主要思路

对有约束条件的优化问题(其可行解为有限数)的所有可行解空间恰当地进行系 统搜索,这就是分枝与定界内容。通常,把全部可行解空间反复地分割为越来越小的子 集,称为分枝;并且对每个子集内的解集计算一个目标下界(对于最小值问题),这称 为定界。在每次分枝后,凡是界限超出已知可行解集目标值的那些子集不再进一步分枝,这样,许多子集可不予考虑,这称剪枝。这就是分枝定界法的主要思路。

分枝定界法可用于解纯整数或混合的整数规划问题。在本世纪六十年代初由 Land Doig 和 Dakin 等人提出的。由于这方法灵活且便于用计算机求解,所以现在它已是解整数规划的重要方法。目前已成功地应用于求解生产进度问题、旅行推销员问题、工厂选址问题、背包问题及分配问题等。 

从以上解题过程可得用分枝定界法求解整数规划(最大化)问题的步骤为:

分枝定界法求解整数规划问题的步骤

开始,将要求解的整数规划问题称为问题 A,将与它相应的线性规划问题称为问题B 。 

3   0− 1型整数规划 

  所代替,是和一般整数规划的约束条件形式一致的。在实际问题中,如果引入  0−1 变 量,就可以把有各种情况需要分别讨论的线性规划问题统一在一个问题中讨论了。我们 先介绍引入  0−1 变量的实际问题,再研究解法。  

3.1  投资场所的选定——相互排斥的计划    

     例 4  某公司拟在市东、西、南三区建立门市部。拟议中有 7 个位置(点) \large A_{i}\, ,i=1,2,...,7  可供选择。规定    

  • 在东区。由 \large A_{1}\, ,A_{2}\, ,A_{3}\,三个点中至多选两个;    
  • 在西区。由 \large A_{4}\, ,A_{5}\, 两个点中至少选一个;
  • 在南区,由  \large A_{6}\, ,A_{7}\,两个点中至少选一个。    

如选用 \large A_{i}\,  点,设备投资估计为 \large b_{i} 元,每年可获利润估计为 \large c_{i}  元,但投资总额不能超过B 元。问应选择哪几个点可使年利润为大? 解题时先引入  0−1 变量  \large x_{i}\, ,i=1,2,...,7  令 

于是问题可写成: 

3.2 相互排斥的约束条件 

有两个相互排斥的约束条件 

3.3 关于固定费用的问题(Fixed Cost Problem)

在讨论线性规划时,有些问题是要求使成本为最小。那时总设固定成本为常数,并 在线性规划的模型中不必明显列出。但有些固定费用(固定成本)的问题不能用一般线 性规划来描述,但可改变为混合整数规划来解决,见下例。

例 5   某工厂为了生产某种产品,有几种不同的生产方式可供选择,如选定的生产 方式投资高(选购自动化程度高的设备),由于产量大,因而分配到每件产品的变动成 本就降低;反之,如选定的生产方式投资低,将来分配到每件产品的变动成本可能增加。 所以必须全面考虑。今设有三种方式可供选择,令 

3.4   0−1  型整数规划解法之一(过滤隐枚举法)

 解  0−1 型整数规划容易想到的方法,和一般整数规划的情形一样,就是穷举法, 即检查变量取值为 0 或 1 的每一种组合,比较目标函数值以求得优解,这就需要检查 变量取值的\large 2^{n}  个组合。对于变量个数n较大(例如 n > 100 ),这几乎是不可能的。因 此常设计一些方法,只检查变量取值的组合的一部分,就能求到问题的最优解。这样的方法称为隐枚举法(Implicit Enumeration),分枝定界法也是一种隐枚举法。当然,对有些问题隐枚举法并不适用,所以有时穷举法还是必要的。 

4 蒙特卡洛法(随机取样法)

前面介绍的常用的整数规划求解方法,主要是针对线性整数规划而言,而对于非线性整数规划目前尚未有一种成熟而准确的求解方法,因为非线性规划本身的通用有效解 法尚未找到,更何况是非线性整数规划。 然而,尽管整数规划由于限制变量为整数而增加了难度;然而又由于整数解是有限个,于是为枚举法提供了方便。当然,当自变量维数很大和取值范围很宽情况下,企图 用显枚举法(即穷举法)计算出最优值是不现实的,但是应用概率理论可以证明,在一 定的计算量的情况下,完全可以得出一个满意解。 

解  (i)首先编写 M 文件 mente.m 定义目标函数 f 和约束向量函数 g,程序如下:
 

 
  1. function [f,g]=mengte(x);

  2. f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)-...

  3. x(4)-2*x(5);

  4. g=[sum(x)-400 x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800

  5. 2*x(1)+x(2)+6*x(3)-200

  6. x(3)+x(4)+5*x(5)-200];

(ii)编写M文件mainint.m如下求问题的解: 

 
  1. rand('state',sum(clock));

  2. p0=0;

  3. tic

  4. for i=1:10^6

  5. x=99*rand(5,1);

  6. x1=floor(x);x2=ceil(x);

  7. [f,g]=mengte(x1);

  8. if sum(g<=0)==4

  9. if p0<=f

  10. x0=x1;p0=f;

  11. end

  12. end

  13. [f,g]=mengte(x2);

  14. if sum(g<=0)==4

  15. if p0<=f

  16. x0=x2;p0=f;

  17. end

  18. end

  19. end

  20. x0,p0 toc

本题可以使用LINGO软件求得精确的全局有解,程序如下: 

 
  1. model:

  2. sets:

  3. row/1..4/:b;

  4. col/1..5/:c1,c2,x;

  5. link(row,col):a;

  6. endsets

  7. data:

  8. c1=1,1,3,4,2;

  9. c2=-8,-2,-3,-1,-2;

  10. a=1 1 1 1 1

  11. 1 2 2 1 6

  12. 2 1 6 0 0

  13. 0 0 1 1 5;

  14. b=400,800,200,200;

  15. enddata

  16. max=@sum(col:c1*x^2+c2*x);

  17. @for(row(i):@sum(col(j):a(i,j)*x(j))<b(i));

  18. @for(col:@gin(x));

  19. @for(col:@bnd(0,x,99));

  20. end

 

5 指派问题的计算机求解 :bintprog 函数

整数规划问题的求解可以使用 Lingo 等专用软件。对于一般的整数规划问题,无法 直接利用 Matlab 的函数,必须利用 Matlab 编程实现分枝定界解法和割平面解法。但对于指派问题等  0−1 整数规划问题,可以直接利用 Matlab 的函数 bintprog 进行求解。 

例 8  求解下列指派问题,已知指派矩阵为

解:编写 Matlab 程序如下: 

 
  1. c=[3 8 2 10 3;8 7 2 9 7;6 4 2 7 5

  2. 8 4 2 3 5;9 10 6 9 10];

  3. c=c(:);

  4. a=zeros(10,25);

  5. for i=1:5

  6. a(i,(i-1)*5+1:5*i)=1;

  7. a(5+i,i:5:25)=1;

  8. end

  9. b=ones(10,1);

  10. [x,y]=bintprog(c,[],[],a,b);

  11. x=reshape(x,[5,5]),y

求解的 LINGO 程序如下: 

 
  1. model:

  2. sets:

  3. var/1..5/;

  4. link(var,var):c,x;

  5. endsets

  6. data:

  7. c=3 8 2 10 3

  8. 8 7 2 9 7

  9. 6 4 2 7 5

  10. 8 4 2 3 5

  11. 9 10 6 9 10;

  12. enddata

  13. min=@sum(link:c*x);

  14. @for(var(i):@sum(var(j):x(i,j))=1);

  15. @for(var(j):@sum(var(i):x(i,j))=1);

  16. @for(link:@bin(x));

  17. end

6  生产与销售计划问题

6.1  问题实例

例 9  某公司用两种原油( A和B )混合加工成两种汽油(甲和乙)。甲、乙两种 汽油含原油的低比例分别为 50%和 60%,每吨售价分别为 4800 元和 5600 元。该公 司现有原油 A和B 的库存量分别为 500 吨和 1000 吨,还可以从市场上买到不超过 1500 吨的原油 A。原油 A的市场价为:购买量不超过 500 吨时的单价为 10000 元/吨;购买 量超过 500 吨单不超过 1000 吨时,超过 500 吨的部分 8000 元/吨;购买量超过 1000 吨 时,超过 1000 吨的部分 6000 元/吨。该公司应如何安排原油的采购和加工。

6.2  建立模型

(1)问题分析

安排原油采购、加工的目标是利润最大,题目中给出的是两种汽油的售价和原油 A 的采购价,利润为销售汽油的收入与购买原油 A的支出之差。这里的难点在于原油 A的 采购价与购买量的关系比较复杂,是分段函数关系,能否及如何用线性规划、整数规划 模型加以处理是关键所在。

(2)模型建立

6.3  求解模型

下面介绍 3 种解法

(1)解法一 

由于有非线性约束(15) 、 (16),因而(7)~(17)构成非线性规划模型。将该模型输入 LINGO 软件如下: 

 
  1. model:

  2. sets:

  3. var1/1..4/:y; !这里y(1)=x11,y(2)=x21,y(3)=x12,y(4)=x22;

  4. var2/1..3/:x,c;

  5. endsets

  6. max=4.8*(y(1)+y(2))+5.6*(y(3)+y(4))-@sum(var2:c*x);

  7. y(1)+y(3)<@sum(var2:x)+500;

  8. y(2)+y(4)<1000;

  9. 0.5*(y(1)-y(2))>0;

  10. 0.4*y(3)-0.6*y(4)>0;

  11. (x(1)-500)*x(2)=0;

  12. (x(2)-500)*x(3)=0;

  13. @for(var2:@bnd(0,x,500));

  14. data:

  15. c=10 8 6;

  16. enddata

  17. end

可以用菜单命令“LINGO|Options”在“Global Solver”选项卡上启动全局优化选项,并运行上述程序求得全局最优解:购买 1000 吨原油 A,与库存的 500 吨原油 A和 1000 吨原油B 一起,共生产 2500 吨汽油乙,利润为 5000(千元)。 (2)解法二 引入 0-1 变量将(15)和(16)转化为线性约束。 

式(7)~(14),式(17)~(21)构成混合整数线性规划模型,将它输入 LINGO 软 件如下: 

 
  1. model:

  2. sets:

  3. var1/1..4/:y; !这里y(1)=x11,y(2)=x21,y(3)=x12,y(4)=x22;

  4. var2/1..3/:x,z,c;

  5. endsets

  6. max=4.8*(y(1)+y(2))+5.6*(y(3)+y(4))-@sum(var2:c*x);

  7. y(1)+y(3)<@sum(var2:x)+500;

  8. y(2)+y(4)<1000;

  9. 0.5*(y(1)-y(2))>0;

  10. 0.4*y(3)-0.6*y(4)>0;

  11. @for(var1(i)|i #lt# 3:500*z(i+1)<x(i);x(i)<500*z(i));

  12. x(3)<500*z(3);

  13. @for(var2:@bin(z));

  14. @for(var2:@bnd(0,x,500));

  15. data:

  16. c=10 8 6;

  17. enddata

  18. end

(3)解法三 

式(6)~(13),式(22)~(26)也构成一个混合整数线性规划模型,可以用 LINGO 求解。输入的 LINGO 模型如下: 

 
  1. model:

  2. sets:

  3. var/1..4/:b,c,y,z,w;

  4. !这里y(1)=x11,y(2)=x21,y(3)=x12,y(4)=x22 端点数为4,即分段数为3;

  5. endsets

  6. data:

  7. b=0,500,1000,1500;

  8. c=0,5000,9000,12000;

  9. z=,,,0; !增加的虚拟变量z(4)=0;

  10. enddata

  11. max=4.8*(y(1)+y(2))+5.6*(y(3)+y(4))-@sum(var:c*w);

  12. y(1)+y(3)<@sum(var:b*w)+500;

  13. y(2)+y(4)<1000;

  14. 0.5*(y(1)-y(2))>0;

  15. 0.4*y(3)-0.6*y(4)>0;

  16. w(1)<z(1);

  17. @for(var(i)|i #ne# 1:w(i)<z(i-1)+z(i));

  18. @sum(var:z)=1;

  19. @sum(var:w)=1;

  20. @for(var:@bin(z));

  21. End

注:这个问题的关键是处理分段线性函数,我们推荐化为整数线性规划模型的第2 和第3种解法,第3种解法更具一般性,其做法如下。

习 题

1. 用分枝定界法解: 

2. 试将下述非线性的  0− 1 规划问题转换成线性的  0− 1 规划问题 

4.有一条河流由于河床泥沙淤结,每当上游发生洪水时,就会破堤淹没两岸,造成人员和财产的损失,为减少总的损失,人们采取破堤泄洪的方法,图 2 是该河流一岸 区域的信息示意图,在该区域边界上有很高的山,使该区域成为封闭区域。区域内又分 成十五个小区,每个小区内标有三个数字,分别表示该区域的海拔高度 \large h\left ( m \right ) 、面积 \large S\left ( km^{2} \right ) 和被完全淹没时土地、房屋和财产等损失总数k (百万元),我们假设

(a)各小区间有相对高度为 1.2m 的小堤相互隔离,例如第一区和第二区之间事 实上有海拔 5.2m 小堤。

(b)当洪水淹没一个小区且洪水高于该小区高度 pm 时,该小区的损失\large f\left ( k,p \right )  为 该小区的k 和 p 的函数:

(c)假设决堤口,可选在大堤或小堤的任何地方,决堤口的数量不受限制,但已 经决口,就不能再补合,从河流经大堤决口流入小区的洪水量按决口数成比例分配,如 在小区之间小堤开一决口,则假设该两小区之间的这段小堤不复存在,若水位高过小堤, 则将自动向邻近低的小区泄洪,若这样的小区有多块时,则平均泄洪。 

(1)整个区域全部受损失的小洪水量Q。

(2)当洪水量为 Q /6, Q/3 时,分别制定泄洪方案,使总损失最小(在一种方 案中,决堤同时进行),并计算出该方案的损失数。 

5.某市为方便小学生上学,拟在新建的 8 个居民小区  \large A_{1}\, ,A_{2}\, ,\cdots ,A_{8}\,  增设若干所小学,经过论证知备选校址有: \large B_{1}\, ,B_{2}\, ,\cdots ,B_{6}\, ,它们能够覆盖的居民小区如表 1。 试建立一个数学模型,确定出最小个数的建校地址,使其能覆盖所有的居民小区。

6.某公司新购置了某种设备 6 台,欲分配给下属的 4 个企业,已知各企业获得这 种设备后年创利润如表 2 所示,单位为千万元。问应如何分配这些设备能使年创总利润 大,大利润是多少? 

7 .有一场由四个项目(高低杠、平衡木、跳马、自由体操) 组成的女子体操团 体赛,赛程规定:每个队至多允许 10 名运动员参赛,每一个项目可以有 6 名选手参加。 每个选手参赛的成绩评分从高到低依次为:10;9.9;9.8;…;0.1;0。每个代表队的 总分是参赛选手所得总分之和,总分多的代表队为优胜者。此外,还规定每个运动员 只能参加全能比赛(四项全参加) 与单项比赛这两类中的一类,参加单项比赛的每个运 动员至多只能参加三个单项。每个队应有 4 人参加全能比赛,其余运动员参加单项比赛。
 

现某代表队的教练已经对其所带领的 10 名运动员参加各个项目的成绩进行了大量 测试,教练发现每个运动员在每个单项上的成绩稳定在 4 个得分上(见表 3) ,她们得 到这些成绩的相应概率也由统计得出(见表中第二个数据。例如:8.4~0.15 表示取得 8.4 分的概率为 0.15)。试解答以下问题:  

(1)每个选手的各单项得分按悲观估算,在此前提下,请为该队排出一个出场 阵容,使该队团体总分尽可能高;每个选手的各单项得分按均值估算,在此前提下, 请为该队排出一个出场阵容,使该队团体总分尽可能高。    

(2)若对以往的资料及近期各种信息进行分析得到:本次夺冠的团体总分估计为 不少于 236.2 分,该队为了夺冠应排出怎样的阵容?以该阵容出战,其夺冠的前景如 何?得分前景(即期望值)又如何?它有 90%的把握战胜怎样水平的对手?

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值