最优化实例和matlab源程序.docx

上传人:b****5 文档编号:7440885 上传时间:2023-01-24 格式:DOCX 页数:15 大小:54.30KB
下载 相关 举报
最优化实例和matlab源程序.docx_第1页
第1页 / 共15页
最优化实例和matlab源程序.docx_第2页
第2页 / 共15页
最优化实例和matlab源程序.docx_第3页
第3页 / 共15页
最优化实例和matlab源程序.docx_第4页
第4页 / 共15页
最优化实例和matlab源程序.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

最优化实例和matlab源程序.docx

《最优化实例和matlab源程序.docx》由会员分享,可在线阅读,更多相关《最优化实例和matlab源程序.docx(15页珍藏版)》请在冰豆网上搜索。

最优化实例和matlab源程序.docx

最优化实例和matlab源程序

最优化平时作业

一、目标规划

1、题目:

见书中例题P110例4

2、解题方法:

利用Lingo求解

3、具体步骤

(1).对应于第一优先等级,建立线性规划问题:

model:

min=-d1;

5*x1+10*x2<=60;

x1-2*x2+d1_-d1=0;

end

运行结果:

-d1=0

(2)对应于第二优先等级,将-d1=0作为约束条件,建立线性规划问题:

min=d2_;

5*x1+10*x2<=60;

x1-2*x2+d1_-d1=0;

4*x1+4*x2+d2_-d2=36;

-d1=0;

end

运行结果:

d2=0;

(3).对应于第三优先等级,将-d1=0,-d1=0作为约束条件,建立线性规划问题:

min=d3_;

5*x1+10*x2<=60;

x1-2*x2+d1_-d1=0;

4*x1+4*x2+d2_-d2=36;

6x1+8*x2+d3_-d3=48;

-d1=0;

d2=0;

end

运行结果:

d3=0;

X14.800000

X22.400000

二、动态规划之0-1背包问题

1、题目:

给定n种物品和一背包。

物品i的重量是Wi,其价值为Vi,背包的容量是c,问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。

2、解题方法与思路:

利用java求解,.思想方法是回溯思想

3、需求分析

对于给定n种物品和一背包。

在容量最大值固定的情况下,要求装入的物品价值最大化

4、java源程序及运行结果

BackTrace.java

*Tochangethistemplate,chooseTools|TemplateManager

*andopenthetemplateintheeditor.

*/

packagesunfa;

importjava.util.Date;

publicclassBackTrace{

/**

*@paramargs

*/

publicstaticvoidmain(String[]args){

doublew[]={2,2,6,5,4};

doublev[]={6,3,5,4,6};

intn=5;

doublec=10;

knapsack(v,w,c);

System.out.println(bestp);

}

//比较两个元素大小的类

privatestaticclassElementimplementsComparable{

intid;

doubled;

privateElement(intidd,doubledd){

id=idd;

d=dd;

}

publicintcompareTo(Objectx){

doublexd=((Element)x).d;

if(d

if(d==xd)return0;

return1;

}

publicbooleanequals(Objectx){

returnd==((Element)x).d;

}

}

staticdoublec;//背包容量

staticintn;//物品数

staticdouble[]w;//物品重量数组

staticdouble[]p;//物品价值数组

staticdoublecw;//当前重量

staticdoublecp;//当前价值

staticdoublebestp;//当前最优值

staticint[]x;//解

staticint[]sortX;//排好序之后的解

staticint[]bestX;//最有解

staticDatedate=null;//@jve:

decl-index=0:

publicstaticdoubleknapsack(double[]pp,double[]ww,doublecc){

c=cc;

n=pp.length-1;

cw=0.0;

cp=0.0;

bestp=0.0;

Element[]q=newElement[n];

//q为单位重量价值数组

for(inti=1;i<=n;i++)

q[i-1]=newElement(i,pp[i]/ww[i]);

MergeSort.mergeSort(q);

p=newdouble[n+1];

w=newdouble[n+1];

x=newint[n+1];

sortX=newint[n+1];

bestX=newint[n+1];

for(inti=1;i<=n;i++){

p[i]=pp[q[n-i].id];

w[i]=ww[q[n-i].id];

sortX[i]=q[n-i].id;

}

backtrack

(1);//回溯搜索

returnbestp;

}

privatestaticvoidbacktrack(inti){

if(i>=n){

if(cp>bestp){

bestp=cp;

for(intj=1;j<=n;j++){

bestX[j]=x[j];

}

}

return;

}

//搜索子树

if(cw+w[i]<=c){

//进入左子树

x[sortX[i]]=1;

cw+=w[i];

cp+=p[i];

backtrack(i+1);

cw-=w[i];

cp-=p[i];

}

if(bound(i+1)>bestp)

x[sortX[i]]=0;

backtrack(i+1);//进入右子树

}

//计算上界

privatestaticdoublebound(inti){

doublecleft=c-cw;

doublebound=cp;

//以物品重量价值递减顺序装入物品

while(i<=n&&w[i]<=cleft){

cleft-=w[i];

bound+=p[i];i++;

}

//装满背包

if(i<=n)

bound+=p[i]/w[i]*cleft;

returnbound;

}

publicstaticStringgetX(){

Stringsolution=String.valueOf(bestX[1]);

for(inti=2;i

solution+=",";

solution+=String.valueOf(bestX[i]);

}

returnsolution;

}

publicstaticdoublegetBestValue(){

returnbestp;

}

}

三、最短路径问题:

给定距离矩阵,求第一点到其它点的最短距离

1、题目:

给定下列矩阵,求第一点到其余各点的最短路径

2、解题方法:

利用matlab求解

3、具体步骤:

源程序及运行结果

clear;

clc;

M=10000;

a(1,:

)=[0,50,M,40,25,10];

a(2,:

)=[zeros(1,2),15,20,M,25];

a(3,:

)=[zeros(1,3),10,20,M];

a(4,:

)=[zeros(1,4),10,25];

a(5,:

)=[zeros(1,5),55];

a(6,:

)=zeros(1,6);

a=a+a';

pb(1:

length(a))=0;pb

(1)=1;d(1:

length(a))=M;d

(1)=0;temp=1;

whilesum(pb)

tb=find(pb==0);

d(tb)=min(d(tb),d(temp)+a(temp,tb));

tmpb=find(d(tb)==min(d(tb)));

temp=tb(tmpb

(1));

pb(temp)=1;

end

运行输出,第一个点到其它各点的最短路径长度,即:

d=03545352510

四、关键路径问题

1.题目要求:

某工程由下表作业组成,计算出其关键路径。

作业

计划完成时间

紧前工作

A

5

/

B

10

/

C

11

/

D

4

B

E

4

A

F

15

CD

G

21

BE

H

35

BE

I

25

BE

J

15

F,G,I

K

20

FG

2.解题方法:

用lingo求解

3.LINGO源程序

sets:

event/1..8/:

et,lt;

active(event,event)/

!

ABCDE0FGHI0JK;

1,21,31,43,42,53,54,65,65,85,76,77,86,8

/:

d,tf,ff;

endsets

data:

d=510114401521352501520;

enddata

n=@size(event);

et

(1)=0;

@for(event(k)|k#gt#1:

et(k)=@max(active(i,k):

et(i)+d(i,k));

);

lt(n)=et(n);

@for(event(k)|k#lt#n:

lt(k)=@min(active(k,j):

et(j)-d(k,j));

);

@for(active(i,j):

tf(i,j)=lt(j)-et(i)-d(i,j);

ff(i,j)=et(j)-et(i)-d(i,j);

);

 

即项目的总工期为51天,作业在(1,3),(3,5),(5,6)和(6,8)位于关键路径上。

五、存储问题

1.题目要求:

某电器公司的生产流水线需要某种零件,该零件需要靠订货得到.为此,该公司考虑到了如下费用结构:

(1)批量订货的订货费12000元/次;

(2)每个零件的单位成本为10元/件;

(3)每个零件的存贮费用为0.3元/(件·月);

(4)每个零件的缺货损失为1.1元/(件·月)。

公司应如何安排这些零件的订货时间与订货规模,使得全部费用最少?

设该零件的每月需求量为800件.

(1)试求今年该公司对零件的最佳订货存贮策略及费用;

(2)若明年对该零件的需求将提高一倍,则需零件的订货批量应比今年增加多少?

订货次数以为多少?

解:

取一年为单位时间,由假设,订货费CD=12000元/次,存贮费Cp=3.6元/(件·年),需求率D=96000件/年,代入相关的公式得到:

2.LINGO源程序

(1)MODEL:

C_D=12000;

D=96000;

C_P=3.6;

Q=(2*C_D*D/C_P)^0.5;

T=Q/D;

n=1/T;

TC=0.5*C_P*Q+C_D*D/Q;

END

全年的订货次数为

(2)

sets:

times/1..2/:

n,Q,TC;

endsets

data:

n=3,4;

C_D=12000;

D=96000;

C_P=3.6;

enddata

@for(times:

n=D/Q;

TC=0.5*C_P*Q+C_D*D/Q;

);

END

结果输出:

全年组织4次订货更好一些,每季度订货一次,每次订货24000件。

程序:

(3)

MODEL:

sets:

order/1..99/:

TC,EOQ;

endsets

@for(order(i):

EOQ(i)=D/i;

TC(i)=0.5*C_P*EOQ(i)+C_D*D/EOQ(i);

);

TC_min=@min(order:

TC);

Q=@sum(order(i):

EOQ(i)*(TC_min#eq#TC(i)));

N=D/Q;

data:

C_D=12000;

D=96000;

C_P=3.6;

enddata

END

结果显示:

一年组织4次订货(每季度1次),每次的订货量为24000件,最优费用为91200元

六、矩阵对策给定下列矩阵,求最优决策

1、题目:

见书中P337例7

2、解题方法与思路:

转化为线性规划问题,再用lingo求解

3、具体步骤:

源程序及运行结果

(1)求X(lingo源程序)

min=x5;

9*x1+2*x2+5*x3+10*x4-x5>=0;

8*x1+4*x2+8*x3+7*x4-x5>=0;

11*x1+6*x2+7*x3+9*x4-x5>=0;

8*x1+3*x2+8*x3+6*x4-x5>=0;

x1+x2+x3+x4=0;

end

(2)求Y(lingo源程序)

max=x5;

9*x1+8*x2+11*x3+8*x4-x5>=0;

2*x1+4*x2+6*x3+3*x4-x5>=0;

5*x1+8*x2+7*x3+8*x4-x5>=0;

10*x1+7*x2+9*x3+6*x4-x5>=0;

x1+x2+x3+x4=0;

end

运行输出:

对策值V=8

七、排队论

1、解题步骤:

第1步调查并收集和处理数据,记录客户到达时刻、等待时间和服务时间.假定客户到达的间隔时间服从指数分布(均值为10分钟);每个客户的服务时间服从均匀分布U[10,15]。

第2步构造模拟模型.输人因素:

客户的到达间隔时间和服务时间;排队规则:

先到先服务;一个服务机构。

第3步模拟实验。

设置模拟时钟及总的运行时间T,如8小时等。

推进原则按下次事件推进或均匀间隔推进。

2、用MATLAB编制程序如下:

forn=1:

10

arrive=zeros(1,n);

fori=2:

n

arrive(i)=arrive(i-1)+exprnd(0.1);

end

wait=zeros(1,n);

fori=1:

n

if(i==1)

wait(i)=0;

else

servetime=unifrnd(10,15);

if(arrive(i-1)+servetime+wait(i-1)>arrive(i))

wait(i)=arrive(i-1)+servetime+wait(i-1)-arrive(i);

else

wait(i)=0;

end

end

end

meantime=mean(wait)

end

运行结果

meantime=

0

meantime=

7.2542

meantime=

12.1298

meantime=

20.0985

meantime=

26.8833

meantime=

32.5758

meantime=

37.2478

meantime=

43.6372

meantime=

51.4519

meantime=

59.4032

>>计算的一组结果如下表:

客户数目

0

1

2

3

4

平均等待时间

0

5.5753

14.1838

18.9329

28.0946

客户数目

5

6

7

8

9

平均等待时间

28.1320

38.2700

40.8833

50.5942

59.3735

 

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

当前位置:首页 > 经管营销 > 人力资源管理

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

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