最优化实例和matlab源程序文档格式.docx
- 文档编号:17888629
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:15
- 大小:52.44KB
最优化实例和matlab源程序文档格式.docx
《最优化实例和matlab源程序文档格式.docx》由会员分享,可在线阅读,更多相关《最优化实例和matlab源程序文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
*/
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<
xd)return-1;
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++){
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<
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;
//进入右子树
//计算上界
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;
bestX.length;
solution+="
"
;
solution+=String.valueOf(bestX[i]);
returnsolution;
publicstaticdoublegetBestValue(){
returnbestp;
}
三、最短路径问题:
给定距离矩阵,求第一点到其它点的最短距离
给定下列矩阵,求第一点到其余各点的最短路径
利用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)<
length(a)
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;
运行输出,第一个点到其它各点的最短路径长度,即:
d=03545352510
四、关键路径问题
1.题目要求:
某工程由下表作业组成,计算出其关键路径。
作业
计划完成时间
紧前工作
A
5
/
B
10
C
11
D
4
E
F
15
CD
G
21
BE
H
35
I
25
J
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)
times/1..2/:
n,Q,TC;
n=3,4;
C_D=12000;
enddata
@for(times:
n=D/Q;
TC=0.5*C_P*Q+C_D*D/Q;
);
结果输出:
全年组织4次订货更好一些,每季度订货一次,每次订货24000件。
程序:
(3)
MODEL:
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:
D=96000;
结果显示:
一年组织4次订货(每季度1次),每次的订货量为24000件,最优费用为91200元
六、矩阵对策给定下列矩阵,求最优决策
见书中P337例7
转化为线性规划问题,再用lingo求解
(1)求X(lingo源程序)
min=x5;
9*x1+2*x2+5*x3+10*x4-x5>
=0;
8*x1+4*x2+8*x3+7*x4-x5>
11*x1+6*x2+7*x3+9*x4-x5>
8*x1+3*x2+8*x3+6*x4-x5>
x1+x2+x3+x4=0;
(2)求Y(lingo源程序)
max=x5;
9*x1+8*x2+11*x3+8*x4-x5>
2*x1+4*x2+6*x3+3*x4-x5>
5*x1+8*x2+7*x3+8*x4-x5>
10*x1+7*x2+9*x3+6*x4-x5>
运行输出:
对策值V=8
七、排队论
1、解题步骤:
第1步调查并收集和处理数据,记录客户到达时刻、等待时间和服务时间.假定客户到达的间隔时间服从指数分布(均值为10分钟);
每个客户的服务时间服从均匀分布U[10,15]。
第2步构造模拟模型.输人因素:
客户的到达间隔时间和服务时间;
排队规则:
先到先服务;
一个服务机构。
第3步模拟实验。
设置模拟时钟及总的运行时间T,如8小时等。
推进原则按下次事件推进或均匀间隔推进。
2、用MATLAB编制程序如下:
forn=1:
arrive=zeros(1,n);
fori=2:
n
arrive(i)=arrive(i-1)+exprnd(0.1);
wait=zeros(1,n);
fori=1:
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);
meantime=mean(wait)
运行结果
meantime=
0
7.2542
12.1298
20.0985
26.8833
32.5758
37.2478
43.6372
51.4519
59.4032
>
计算的一组结果如下表:
客户数目
1
2
3
平均等待时间
5.5753
14.1838
18.9329
28.0946
6
7
8
9
28.1320
38.2700
40.8833
50.5942
59.3735
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 优化 实例 matlab 源程序
![提示](https://static.bdocx.com/images/bang_tan.gif)