机械优化设计——复合形方法及源程序(共8页)_第1页
机械优化设计——复合形方法及源程序(共8页)_第2页
机械优化设计——复合形方法及源程序(共8页)_第3页
机械优化设计——复合形方法及源程序(共8页)_第4页
机械优化设计——复合形方法及源程序(共8页)_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上机械优化设计复合形方法及源程序(一) 题目:用复合形法求约束优化问题;的最优解。基本思路:在可行域中构造一个具有K个顶点的初始复合形。对该复合形各顶点的目标函数值进行比较,找到目标函数值最大的顶点(即最坏点),然后按一定的法则求出目标函数值有所下降的可行的新点,并用此点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优点移动一步,直至逼近最优点。(二) 复合形法的计算步骤1) 选择复合形的顶点数k,一般取,在可行域内构成具有k个顶点的初始复合形。2) 计算复合形个顶点的目标函数值,比较其大小,找出最好点xL、最坏点xH、及此坏点xG.3) 计算除去最坏点xH

2、以外的(k-1)个顶点的中心xC。判别xC是否可行,若xC为可行点,则转步骤4);若xC为非可行点,则重新确定设计变量的下限和上限值,即令,然后转步骤1),重新构造初始复合形。4) 按式计算反射点x,必要时改变反射系数的值,直至反射成功,即满足式。然后x以取代x,构成新的复合形。5) 若收敛条件得到满足,计算终止。约束最优解为:。(三) 复合形法程序框图见下图:是否否否否是是是是否求反射点计算各顶点的目标函数值f(xj)(j=1,2,k)一次坏点xG代替最坏点xH结 束xR可行?xC可行?计算出去xH后的各顶点中心将各定点的目标函数值和坐标按目标函数值的大小排序形成初始复合形的k个顶点xj(j

3、=1,2,k)输入 n,k,开 始 (四) 源程序如下:/*输入值选择n=2,k=3,本程序可以处理n为2或3,k为3或4的情况*/#include <stdio.h>#include <stdlib.h>#include <time.h>#include <math.h>#define E0 1e-5 /*复合形法收敛控制精度*/double *apply(int,int); /*申请矩阵空间*/double f(double *); /*目标函数*/double *g(double *); /*约束函数*/bool judge(double

4、*); /*可行点的判断*/int main()int n,k;int i,j,k1;int l;double temporary;double restrain; /*收敛条件*/double reflect; /*反射系数*/srand(unsigned)time(NULL);printf("请输入目标函数的维数n:"); /*输入已知数据*/scanf("%d",&n);printf("请输入复合形的顶点数k:");scanf("%d",&k);double *x=apply(k,n); /*

5、存放复合形顶点*/double *y=(double *)calloc(k,sizeof(double); /*存放目标函数值*/double *p=(double *)calloc(3,sizeof(double); /*存放约束函数值*/double *a=(double *)calloc(n,sizeof(double); /*存放设计变量的下限*/double *b=(double *)calloc(n,sizeof(double); /*存放设计变量的上限*/double *x_c=(double *)calloc(n,sizeof(double); /*存放可行点中心*/doubl

6、e *x_r=(double *)calloc(n,sizeof(double); /*存放最坏点的反射点*/printf("本程序中的所有输入,两个数之间用空格隔开,然后按enter键时不要长时间的按,否则,可能会出错n"); printf("请输入选定的第一个可行点x1(包含%d个数):",n);for(i=0;i<n;i+)scanf("%lf",*x+i);printf("请输入初选变量的下限a(包含%d个数):",n);for(i=0;i<n;i+)scanf("%lf",

7、a+i);printf("请输入初选变量的上限b(包含%d个数):",n);for(i=0;i<n;i+)scanf("%lf",b+i);printf("输出输入结果为:nn=%d,k=%d,x1=(",n,k); /*输出已知数据*/for(i=0;i<n-1;i+)printf("%.5lf ",*(*x+i);printf("%.5lf)na=(",*(*x+n-1);for(i=0;i<n-1;i+)printf("%f ",*(a+i);prin

8、tf("%.5lf),b=(",*(a+n-1);for(i=0;i<n-1;i+)printf("%f ",*(b+i);printf("%.5lf)n",*(b+n-1);L1:for(i=1;i<k;i+) /*随机得到其余(k-1)个可行点*/for(j=0;j<n;j+)*(*(x+i)+j)=*(a+j)+(double)(rand()%10000)/10000*(*(b+j)-*(a+j);l=1;for(i=1;i<k;i+) /*找出可行点的个数l,并把可行点放在前l个位置上*/if(judg

9、e(*(x+i)for(j=1;j<k;j+)if(!judge(*(x+j)for(k1=0;k1<n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;break;l+;for(i=0;i<l-1;i+) /*把前l个可行点按目标函数值从大到小排序*/for(j=i+1;j<l;j+)if(f(*(x+i)<f(*(x+j)for(k1=0;k1<n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1)

10、;*(*(x+j)+k1)=temporary;for(i=0;i<n;i+) /*求可行点中心*/*(x_c+i)=0;for(i=0;i<l;i+)for(j=0;j<n;j+)*(x_c+j)+=*(*(x+i)+j);for(i=0;i<n;i+)*(x_c+i)/=l;if(!judge(x_c) /*判断可行点中心是否可行*/for(i=0;i<n;i+)*(a+i)=*(*(x+l-1)+i);*(b+i)=*(x_c+i);goto L1;elsefor(i=l;i<k;i+) /*将不可行点可行化*/dofor(j=0;j<n;j+)

11、*(*(x+i)+j)=*(x_c+j)+0.5*(*(*(x+i)+j)-*(x_c+j);while(!judge(*(x+i);L2:for(i=0;i<k-1;i+) /*将可行点按目标函数值从大到小排序*/for(j=i+1;j<k;j+)if(f(*(x+i)<f(*(x+j)for(k1=0;k1<n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;restrain=0; /*求收敛条件*/for(i=0;i<k;i+)restrain+=(f(*

12、(x+i)-f(*(x+k-1)*(f(*(x+i)-f(*(x+k-1);restrain=sqrt(1.0/(k-1)*restrain);if(restrain<E0) /*判断收敛条件*/printf("n求得约束最优点为:( ");for(i=0;i<n;i+)printf("%.5f ",*(*(x+k-1)+i);printf(")n目标函数的最优解为:%.5fn",f(*(x+k-1);return 0;elseL3:for(i=0;i<n;i+) /*计算除去最坏点*x外的(k-1)个顶点的中心*/

13、*(x_c+i)=0;for(i=1;i<k;i+)for(j=0;j<n;j+)*(x_c+j)+=*(*(x+i)+j);for(i=0;i<n;i+)*(x_c+i)/=k-1;reflect=1.3;L4:for(i=0;i<n;i+) /*求反射点*/*(x_r+i)=*(x_c+i)+reflect*(*(x_c+i)-*(*x+i);if(!judge(x_r)reflect*=0.5;goto L4;else if(f(x_r)<f(*x)for(i=0;i<n;i+)*(*x+i)=*(x_r+i);goto L2;else if(refl

14、ect<=1e-10)for(i=0;i<n;i+)*(*x+i)=*(*(x+1)+i);goto L3;elsereflect*=0.5;goto L4;double *apply(int row,int col) /*申请矩阵空间*/int i;double *x=(double*)calloc(row*col,sizeof(double);double *y=(double *)calloc(row,sizeof(double *);if(!x | !y)printf("内存分配失败!");exit(1);for(i=0;i<row;i+)*(y+i)=x+i*col;return y;double f(double *x) /*目标函数*/return (*x-5)*(*x-5)+4*(*(x+1)-6)*(*(x+1)-6);double *g(double *x) /*约束函数*/double *p=(double *)calloc(3,sizeof(double);if(!p)printf("内存分配失败!");exit(1);*p=64-(*x)*(*x)-(*(x+1)*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论