最优化实例和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 >>计算的一组结果如下表: