最优化实例和matlab源程序

最优化实例和matlab源程序
最优化实例和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;

X1 4.800000

X2 2.400000

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

1、题目:给定n种物品和一背包。物品i 的重量是Wi ,其价值为Vi ,背包的容量是c,问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。

2、解题方法与思路:利用java 求解,.思想方法是回溯思想

3、需求分析

对于给定n 种物品和一背包。在容量最大值固定的情况下,要求装入的物品价值最大化

4、java 源程序及运行结果

BackTrace.java

* To change this template, choose Tools | Template Manager

* and open the template in the editor.

*/

package sunfa; import java.util.Date;

public class BackTrace {

* @param args

*/

public static void main(String[] args) {

double w[]={2,2,6,5,4};

double v[]={6,3,5,4,6};

int n=5;

double c=10; knapsack(v,w,c);

System.out.println(bestp);

} //比较两个元素大小的类private static class Element implements Comparable{ int id; double d;

private Element(int idd,double dd){ id=idd;

d=dd;

}

public int compareTo(Object x){ double xd=((Element)x).d; if(d

if(d==xd)return 0;

return 1;

}

public boolean equals(Object x){ return d==((Element)x).d;

}

}

static double c; // 背包容量

static int n;// 物品数

static double[]w;// 物品重量数组static double[]p; // 物品价值数组static

double cw;// 当前重量static double cp;// 当前价值static double bestp; // 当前最优值static int [] x;// 解

static int [] sortX;// 排好序之后的解static int [] bestX;// 最有解

static Date date = null; // @jve:decl-index=0:

public static double knapsack(double[]pp,double[]ww,double cc){ c=cc;

n=pp.length-1; cw=0.0;

cp=0.0; bestp=0.0;

Element[]q=new Element[n];

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

for(int i=1;i<=n;i++) q[i-

1]=new Element(i,pp[i]/ww[i]);

MergeSort.mergeSort(q);

p=new double[n+1]; w=new double[n+1]; x=new int[n+1]; sortX=new int[n+1];

bestX=new int[n+1]; for(int i=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);// 回溯搜索

return bestp;

}

private static void backtrack(int i){ if(i>=n){ if(cp>bestp){ bestp=cp;

for(int j=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);// 进入右子树}

//计算上界

private static double bound(int i){

double cleft=c-cw;

double bound=cp;

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

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

cleft-=w[i]; bound+=p[i];i++;

}

//装满背包

if(i<=n)

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

return bound;

}

public static String getX(){

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

for(int i=2;i

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

}

return solution;

}

public static double getBestValue(){

return bestp;

}

三、最短路径问题:给定距离矩阵,求第一点到其它点的最短距离

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

0 50 40 25 10

50

0 15 20

25

15 0 10 20

40 20 10 0 10 25 25

20 10 0 55 10 25 25

55 0

2、解题方:利用 matla b 求

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; while sum(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;

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

d = 0 35 45 35 25 10

四、关键路径问题

1.题目要求:

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

2.解题方法:用lingo 求解

3.LINGO 源程序

sets : event/1..8/: et, lt; active(event, event)/

! A B C D E 0 F G H I 0 J K;

1,2 1,3 1,4 3,4 2,5 3,5 4,6 5,6 5,8 5,7 6,7 7,8 6,8 /: d, tf, ff; endsets

data :

d = 5 10 11 4 4 0 15 21 35 25 0 15 20; 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 件/年,代入相关的公式得到: (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

1 n= 3.7947 全年的订货次数为 T 次

(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

数以为多少? 解: (件

元/ 2 1200 96000 25298

3.6

T

D TC *

0.2635

2.LINGO 2C D C P D

2 3.6 12000 96000 91073

源程序 96000

Q

结果输出:全年组织 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 次),每次的订货量为24 000 件,最优费用为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 编制程序如下:

for n=1:10

arrive=zeros(1,n);

for i=2:n

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

end

wait=zeros(1,n);

for i=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 =

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

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

相关主题
相关文档
最新文档