机械优化设计复合形方法及源程序

上传人:s9****2 文档编号:508427919 上传时间:2023-07-09 格式:DOCX 页数:7 大小:245.92KB
返回 下载 相关 举报
机械优化设计复合形方法及源程序_第1页
第1页 / 共7页
机械优化设计复合形方法及源程序_第2页
第2页 / 共7页
机械优化设计复合形方法及源程序_第3页
第3页 / 共7页
机械优化设计复合形方法及源程序_第4页
第4页 / 共7页
机械优化设计复合形方法及源程序_第5页
第5页 / 共7页
点击查看更多>>
资源描述

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

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

2、,比较其大小,找出最好点xl、最坏点xh、及此坏点xg.3)计算除去最坏点xh以外的(k-1)个顶点的中心xc0判别xc是否可行,若xc为可行点,则转步骤4);若xc为非可行点,则重新确定设计变量的下限和上限值,即令a xL,b xc,然后转步骤1),重新构造初始复合形。4)按式xr xcxc xh计算反射点xr,必要时改变反射系数 a的值,直至反射成功,即满足式gj xr 0, j 1,2,m ; f xr f Xh。然后xr以取代Xh ,构成新的复合形1得到满足,计算终止。约束最优解为:1 k2 25)若收敛条件 f Xjf Xlk 1 j 1 j*x xL,f x f xL 。(三)复合

3、形法程序框图见下图:输入n, k, e4形成初始复合形的k个顶点Xj (j=1,2 ,k)一次坏点XG代替最坏点XHXhXr(四)源程序如下:/*输入值选择n=2,k=3,本程序可以处理 n为2或3, k为3或4的情况*/ #include #include #include #include #define E0 1e-5double *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;do

4、uble restrain;double reflect;srand(unsigned)time(NULL);printf( 请输入目标函数的维数 scanf(%d,&n);printf( 请输入复合形的顶点数/* 复合形法收敛控制精度*/* 申请矩阵空间 */* 目标函数*/*约束函数*/* 可行点的判断*/* 收敛条件*/* 反射系数*/* 输入已知数据*/n:);k:);/* 存放复合形顶点 */* 存放目标函数值*/* 存放约束函数值*/* 存放设计变量的下限*/* 存放设计变量的上限*/* 存放可行点中心*/* 存放最坏点的反射点*/scanf(%d,&k);double *x=ap

5、ply(k,n);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); double *x_r=(double *)calloc(n,sizeof(double);printf( 本程序中的所有输入,两个数之

6、间用空格隔开,然后按enter 键时不要长时间的按,否则,可能会出错 n);printf(请输入选定的第一个可行点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 ,*

7、(*x+i);printf(%.5lf)na=(,*(*x+n-1);for(i=0;in-1;i+)printf(%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,

8、并把可行点放在前l个位置上*/if(judge(*(x+i) for(j=1;jk;j+) if(!judge(*(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+

9、j)+k1);*(*(x+j)+k1)=temporary; for(i=0;in;i+)/* 求可行点中心 */*(x_c+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;else(for(i=l;ik;i+) /*将不可行点可行化*/ dofor(j=0;jn;j+)*(*(x+i)+j)

10、=*(x_c+j)+0.5*(*(*(x+i)+j)-*(x_c+j); while(!judge(*(x+i);L2:for(i=0;ik-1;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(*

11、(x+k-1);restrain=sqrt(1.0/(k-1)*restrain);if(restrainE0) /* 判断收敛条件 */ printf(n求得约束最优点为:();for(i=0;in;i+)printf(%.5f ”,*(*(x+k-1)+i);printf()n 目标函数的最优解为:.5fn,f(*(x+k-1);return 0; else L3: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+

12、)*(x_c+i)/=k-1;reflect=1.3;L4:for(i=0;in;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;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

13、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;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)bre

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号