第13章 整数规划Word文档格式.docx

上传人:b****6 文档编号:20211452 上传时间:2023-01-19 格式:DOCX 页数:18 大小:188.61KB
下载 相关 举报
第13章 整数规划Word文档格式.docx_第1页
第1页 / 共18页
第13章 整数规划Word文档格式.docx_第2页
第2页 / 共18页
第13章 整数规划Word文档格式.docx_第3页
第3页 / 共18页
第13章 整数规划Word文档格式.docx_第4页
第4页 / 共18页
第13章 整数规划Word文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

第13章 整数规划Word文档格式.docx

《第13章 整数规划Word文档格式.docx》由会员分享,可在线阅读,更多相关《第13章 整数规划Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

第13章 整数规划Word文档格式.docx

否则,记它此时的目标函数值为f0、最优解为。

这时若记f为ILP的最优目标函数值,则必有。

如果其中某一个值li不是整数,那么分枝:

即分别求解如下两个子问题:

这样做,实际上是将原约束区域中不含任何整数解的区域去掉,在剩下的约束区域寻找最优解。

分别以LP1和LP2后继子问题为一分枝并标明求解的结果,找出最优目标函数值最小者作为新的下界,替换f0。

应当指出子问题的最优目标值一定不会优于原问题的目标函数值。

如果两个子问题的任何一个的解仍然不是整数,则继续选择一个非整数变量,将这个子问题再次分解为更下一级的子问题。

如果某一个子问题的最优解已满足变量为整数的要求,这就得到一个可行的整数解。

将这个这个子问题的目标函数值记录下来,作为整数规划最优目标值的上界。

从已符合整数条件的各分枝中,找出目标函数值为最小者作为新的上界f*,即有。

如果其他子问题在分枝过程中,尽管尚未获得整数解,但该子问题的目标函数值已超过这个上界,则这个分枝无须再分枝求解。

这是因为即使继续分枝再得到一个整数解,这个解的目标函数值,一定会超过所得到的上界,从而不可能是最优解。

因此,利用定界,可以终止许多不必要的分枝过程,此为剪枝。

如果在分枝过程中得到新的整数解且该整数解的目标函数值小于已记录的上界,则将较小的整数解的目标值代替原来的上界。

因为上界越小,就可能删除更多不必要的分枝。

当所有最底层子问题出现以下三种情况之一时,分枝定界算法终止。

(1)子问题无可行解;

(2)子问题已获得整数解;

(3)子问题的目标函数值超过上界。

我们用一个例子来说明上述过程。

例1:

求解如下整数规划解先解相应的得:

按条件将问题LP分解成如下子问题LP1和LP2并赋它们的下界为14.2。

求解LP1得:

求解LP2得:

可见,LP2可分成两个子问题LP3和LP4并赋他们下界为14.33。

求解LP3得:

求解LP4得:

由于x3和小x4是原整数规划问题的可行解且,所以置f*=15为上界。

以下再将LP1分枝为如下LP5和LP6,并赋予它们下界14.33。

求解LP5得:

求解LP6得:

由于f5、f6f*=15,所以LP5和LP6都没有继续分枝求解的必要。

至此求得最优解x*=x3=(0,5,0)或x*=x4=(1,4,0),最优目标函数值为f=f3=f4=15.上述过程可以用如下框图13-1表示。

图13-113.3整数线性规划分枝定界法的MATLAB程序如下的M函数可用来整数线性规划问题在程序中,x0表示初值,调用时可以代替x0;

neqcstr表示约束条件中前neqcstr个是等式;

pre是精度;

调用时,当neqcstr=0时可以省略,此时也可以省略x0,即调用格式:

x=ILp(c,A,b,vlb,vub);

返回的结果x是最优解,f是最优处目标函数的值。

%M函数ILp.mfunctionx,f=ILp(c,A,b,vlb,vub,x0,neqcstr,pre)ifnargin8,pre=0;

ifnargin7,neqcstr=0;

ifnargin6,x0=;

ifnargin5,vub=;

ifnarginpre);

mtemp=length(temp2);

ifisempty(temp2)x_f_b=xtemp;

ftemp;

vlb;

vub;

whilej=mmi=1;

whilei=mtempifx_f_b(nvars+1,j)pre);

ifisempty(temp12),xall=xall,xtemp;

fall=fall,ftemp;

fvub=min(fvub,fall);

elseifftemp=fvubx_f_b=x_f_b,xtemp;

vlb1;

vub1;

end,end,endifx_f_b(nvars+1,j)pre);

ifisempty(tempr2),xall=xall,xtemp;

elseifftempmm,break,endtemp0=round(xint(:

j);

temp1=floor(xint(:

temp2=find(abs(xint(:

j)-temp0)pre);

end,else,x=xtemp;

f=ftemp;

end,ifisempty(fall)fmin=min(fall);

nmin=find(fall=fmin);

x=xall(:

nmin);

f=fmin;

end,else,x=nan*ones(1,nvars);

end13.4例题例2:

引例“火车货车装箱方案”的计算。

调用ILp.m计算如下clear;

c=-40;

37;

58;

36;

35;

45;

50;

A=55,58,62.4,49,40.6,53.3,66;

0.5,1.7,3,2.2,3,1,4;

b=1000;

40;

vlb=zeros(7,1);

vub=7;

5;

6;

7;

3;

4;

tic;

x,f=linprog(c,A,b,vlb,vub,0,0.001),toc输出结果:

x=3160341f=-840elapsed_time=544.1500注意:

分枝定界法本质上还是一种牧举法,并不是一种完全有效的算法,当变量较多或条件较复杂时,计算耗时可能很多。

本例用时544.15秒。

当然,这与使用的计算机有关。

例3:

某厂拟用集装箱托远甲乙两种货物,每箱的体积、重量、可获利润以及托远所受的限制如表13-2。

问两种货物各托运多少箱,可使获得的利润为最大?

表13-2货物体积每箱(m3)重量每箱(t)利润每箱(千元)甲5220乙4510托远限制2413解显然,该问题可用整数规划求解。

设x1和x2分别为甲和乙两种货物的托运箱数(皆为非负整数),则有解法一直接利用分枝定界算法的思想。

首先放弃整数性条件,求线性规划问题c=-20,-10;

A=5,4;

2,5;

b=24,13;

x,f=linprog(c,A,b,0;

0,)x=4.80000.0000f=-96.0000增加条件,求线性规划问题c=-20,-10;

0,4;

inf)x=4.00001.0000f=-90.0000增加条件,求线性规划问题c=-20,-10;

x,f=linprog(c,A,b,5;

0,)x=5.00000.0000f=-100.0000不是可行解(因为不满足限制条件)。

可见x1=4,x2=1,f=90为最优解。

解法二调用ILp.m求解。

c=-20,-10;

x,f=ILp(c,A,b,0;

0,inf;

inf,0,0.0001)x=4.00001.0000f=-9013.5习题1、求如下整数规划问题2、(生产计划制定)某工厂用甲、乙两种原料A,B,C,D四种产品,每种产品消耗原料定额如表13-3所示。

现有甲原料18t,乙原料3t,请制定一个使总利润最大的生产计划。

表13-3A(万件)B(万件)C(万件)D(万件)甲:

23104乙:

20.5单位利润(万元/万件)98501913.6补充:

0-1型整数线性规划13.6.10-1型整数线性规划0-1型整数线性规划是一类变量仅取0或1的特殊的整数规划;

一般描述如下其中。

此时的决策变量称为0-1变量或二进制变量。

在实际问题中,如果引进0-1变量,就可以把各种需要分别讨论的线性(或非线性)规划问题统一在一个问题中讨论。

13.6.2求解0-1线性规划的隐牧举法分枝定界法就是一种解整数规划的隐牧举法,0-1规划可以通过增加限定的整数规划来求解。

对于n个变量的0-1规划,如果使用穷举法,则需要检查2n个取值组合,这显然不是聪明的办法。

这里所说的隐牧举法,是根据0-1规划的特点,设计的一些方法,只检查变量组合的一部分,而不是全部。

值得说明的是,对于有些问题(例如一部分变量是0-1变量的混合线性规划)隐牧举法有时是不适用的,还得使用穷举法。

隐牧举法原理与算法步骤:

()记,将n个决策变量构成的x的2n个取值组合按二进制(或某种顺序)排列;

()按上述顺序对x的取值首先检验是否成立,若不成立则放弃该取值的x,按次序换()中下一x的取值重复上述过程;

若成立,则转下一步;

()对x逐一检验中的m个条件是否满足,一旦某一条件不满足便停止检验后面的条件,而放弃这一x的取值,按次序换()中下一x的取值执行(),若m个条件全满足,则转下一步;

()记按次序换()中下一x的取值,执行();

()最后一组满足的x即为最优解。

13.6.3求解0-1型整数线性规划的MATLAB程序、转换十进制数为二进制数的程序如下是枚举和隐枚举程序中要调用的把十进制数转换为二进制数的程序。

b=de2bi(d)转换整数向量d成二进制矩阵b,二进制矩阵b中的每一行表示十进制向量d中相应的数;

b=de2bi(d,n)转换整数向量d成二进制矩阵b,但指定b的列数n;

而b=debi(d,n,p)转换整数向量d成p进制矩阵b,p进制矩阵b中的每一行表示十进制向量d中相应的数。

%M函数de2bi.mfunctionb=de2bi(d,n,p)d=d(:

);

len_d=length(d);

ifmin(d)0,error(Cannotconvertanegativenumber);

elseifisempty(find(d=inf),error(InputmustnotbeInf.);

elseiffind(d=floor(d),error(Inputmustbeaninteger.);

end;

ifnargin0b1=b1rem(tmp,2);

tmp=floor(tmp/2);

n=length(b1);

ifnargin3,p=2;

endb=zeros(len_d,n);

fori=1:

len_dj=1;

tmp=d(i);

while(j0)b(i,j)=rem(tmp,p);

j=j+1;

end,end;

、牧举法程序如下程序用牧举法求解0-1线性规划minf=c*x,s.t.A*x=b,x的分量全为0或1。

程序中的N表示约束条件A*x=B中的前N个是等式,N=0时可以省略。

返回结果x是最优解,f是最优解处的函数值。

%M函数L01p_e.mfunctionx,f=L01p_e(c,A,b,N)ifnargin4,N=0;

endc=c(:

b=b(:

m,n=size(A);

x=;

f=abs(c)*ones(n,1);

i=1;

whilei0);

t1=t11;

t12;

ifisempty(t1)f=min(f,c*B);

ifc*B=f,x=B;

endendi=i+1;

end、隐牧举法程序%M函数L01p_iefunctionx,f=L01p_ie(c,A,b,N)ifnargin4,N=0;

a=-A(1:

N,:

A;

b=-b(1:

N);

b;

A=c;

b=f;

whilei=2nB=de2bi(i-1,n);

j=1;

t1=A(j,:

)*B-b(j);

while(t1=0&

j0,j=1;

endifj=m+1x=B;

f=c*B;

b

(1)=min(b

(1),f);

endi=i+1;

end13.6.4补充例题例4:

求解如下0-1型整数规划解牧举法c=3,-2,5;

b=2;

6;

a=1,2,-1,;

1,4,1;

1,1,0;

0,4,1;

x,f=L01p_e(c,a,b)x=010f=-2隐牧举法c=3,-2,5;

x,f=L01p_ie(c,a,b)x=010f=-2例5:

一架货运飞机,有效载重量24t(吨),可运物品的重量及运费收入如表13-4所示,其中各物品只有一件可供选择。

问如何选运物品运费总收入最多?

物品123456重量(t)8136957收入(万元)352423表13-4解记则有牧举法求解c=-3,5,2,4,2,3;

A=8,13,6,9,5,7;

b=24;

x,f=L01p_e(c,A,b)x=100101f=-10隐牧举法求解c=-3,5,2,4,2,3;

x,f=L01p_ie(c,A,b)x=100101f=-1013.7补充习题1、求解如下0-1规划

(1)

(2)2、某公司拟在市东、西、南三区建立门市部。

拟议中有7个位置Ai(i=1,7)可供选择。

规定:

在东区,由三个点A1、A2、A3中至少选两个;

在西区,由两个点A4、A5中至少选一个;

在南区,由两个点A6、A7中至少选一个。

投资总额不能超过700万元。

设备投资费与每年可获利润见表13-5。

问应选择哪几个点可使年利润为最大?

表13-5A1A2A3A4A5A6A7设备投资费(万元)13182129112819年终或利润(万元)21252737193325

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1