机械优化设计复合形方法及源程序文件.doc

上传人:夺命阿水 文档编号:10556 上传时间:2022-06-24 格式:DOC 页数:7 大小:132.50KB
返回 下载 相关 举报
机械优化设计复合形方法及源程序文件.doc_第1页
第1页 / 共7页
机械优化设计复合形方法及源程序文件.doc_第2页
第2页 / 共7页
机械优化设计复合形方法及源程序文件.doc_第3页
第3页 / 共7页
机械优化设计复合形方法及源程序文件.doc_第4页
第4页 / 共7页
机械优化设计复合形方法及源程序文件.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《机械优化设计复合形方法及源程序文件.doc》由会员分享,可在线阅读,更多相关《机械优化设计复合形方法及源程序文件.doc(7页珍藏版)》请在课桌文档上搜索。

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

2、中心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=1,2,k)输入 n

3、,k,开 始(四) 源程序如下:/*输入值选择n=2,k=3,本程序可以处理n为2或3,k为3或4的情况*/#include #include #include #include #define E0 1e-5 /*复合形法收敛控制精度*/double *apply(int,int); /*申请矩阵空间*/double f(double *); /*目标函数*/double *g(double *); /*约束函数*/bool judge(double *); /*可行点的判断*/int main()int n,k;int i,j,k1;int l;double temporary;doubl

4、e restrain; /*收敛条件*/double reflect; /*反射系数*/srand(unsigned)time(NULL);printf(请输入目标函数的维数n:); /*输入已知数据*/scanf(%d,&n);printf(请输入复合形的顶点数k:);scanf(%d,&k);double *x=apply(k,n); /*存放复合形顶点*/double *y=(double *)calloc(k,sizeof(double); /*存放目标函数值*/double *p=(double *)calloc(3,sizeof(double); /*存放约束函数值*/double

5、 *a=(double *)calloc(n,sizeof(double); /*存放设计变量的下限*/double *b=(double *)calloc(n,sizeof(double); /*存放设计变量的上限*/double *x_c=(double *)calloc(n,sizeof(double); /*存放可行点中心*/double *x_r=(double *)calloc(n,sizeof(double); /*存放最坏点的反射点*/printf(本程序中的所有输入,两个数之间用空格隔开,然后按enter键时不要长时间的按,否则,可能会出错n); printf(请输入选定的第

6、一个可行点x1(包含%d个数):,n);for(i=0;in;i+)scanf(%lf,*x+i);printf(请输入初选变量的下限a(包含%d个数):,n);for(i=0;in;i+)scanf(%lf,a+i);printf(请输入初选变量的上限b(包含%d个数):,n);for(i=0;in;i+)scanf(%lf,b+i);printf(输出输入结果为:nn=%d,k=%d,x1=(,n,k); /*输出已知数据*/for(i=0;in-1;i+)printf(%.5lf ,*(*x+i);printf(%.5lf)na=(,*(*x+n-1);for(i=0;in-1;i+)p

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

8、(*(x+j)for(k1=0;k1n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;break;l+;for(i=0;il-1;i+) /*把前l个可行点按目标函数值从大到小排序*/for(j=i+1;jl;j+)if(f(*(x+i)f(*(x+j)for(k1=0;k1n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;for(i=0;in;i+) /*求可行点中心*/*(x_c+

9、i)=0;for(i=0;il;i+)for(j=0;jn;j+)*(x_c+j)+=*(*(x+i)+j);for(i=0;in;i+)*(x_c+i)/=l;if(!judge(x_c) /*判断可行点中心是否可行*/for(i=0;in;i+)*(a+i)=*(*(x+l-1)+i);*(b+i)=*(x_c+i);goto L1;elsefor(i=l;ik;i+) /*将不可行点可行化*/dofor(j=0;jn;j+)*(*(x+i)+j)=*(x_c+j)+0.5*(*(*(x+i)+j)-*(x_c+j);while(!judge(*(x+i);L2:for(i=0;ik-1;

10、i+) /*将可行点按目标函数值从大到小排序*/for(j=i+1;jk;j+)if(f(*(x+i)f(*(x+j)for(k1=0;k1n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;restrain=0; /*求收敛条件*/for(i=0;ik;i+)restrain+=(f(*(x+i)-f(*(x+k-1)*(f(*(x+i)-f(*(x+k-1);restrain=sqrt(1.0/(k-1)*restrain);if(restrainE0) /*判断收敛条件*/printf

11、(n求得约束最优点为:( );for(i=0;in;i+)printf(%.5f ,*(*(x+k-1)+i);printf()n目标函数的最优解为:%.5fn,f(*(x+k-1);return 0;elseL3:for(i=0;in;i+) /*计算除去最坏点*x外的(k-1)个顶点的中心*/*(x_c+i)=0;for(i=1;ik;i+)for(j=0;jn;j+)*(x_c+j)+=*(*(x+i)+j);for(i=0;in;i+)*(x_c+i)/=k-1;reflect=1.3;L4:for(i=0;in;i+) /*求反射点*/*(x_r+i)=*(x_c+i)+reflec

12、t*(*(x_c+i)-*(*x+i);if(!judge(x_r)reflect*=0.5;goto L4;else if(f(x_r)f(*x)for(i=0;in;i+)*(*x+i)=*(x_r+i);goto L2;else if(reflect=1e-10)for(i=0;in;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);do

13、uble *y=(double *)calloc(row,sizeof(double *);if(!x | !y)printf(存分配失败!);exit(1);for(i=0;irow;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)*(*(x+1);*(p+1)=*(x+1)-*x-10;*(p+2)=*x-10;return p;bool judge(double *x) /*可行点的判断*/int i;double *p=(double *)calloc(3,sizeof(double);p=g(x);for(i=0;i0)break;if(i=3)return true;elsereturn false;(五) 运行结果如下:7 / 7

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

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号