《机械优化设计——复合形方法及源程序(共8页).doc》由会员分享,可在线阅读,更多相关《机械优化设计——复合形方法及源程序(共8页).doc(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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 #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 tem
4、porary;double 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); /*存放约
5、束函数值*/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(本程序中的所有输入,两个数之间用空格隔开,然后按enter键时不要长时间的按,否则,可能会出错n); pr
6、intf(请输入选定的第一个可行点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
7、=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,并把可行点放在前l个位置上*/if(judge(*(x+i)for(j=1;jk;
8、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+j)+k1);*(*(x+j)+k1)=temporary;for(i=0;in;i+) /*求可
9、行点中心*/*(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;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:f
10、or(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(*(x+k-1);restrain=sqrt(1.0/(k-1)*restrain);if(restrainE0) /*判断
11、收敛条件*/printf(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
12、_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 row,int col) /*申请矩阵空间*/int i;double *x=(double*)calloc(row*col,sizeo
13、f(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)break;if(i=3)return true;elsereturn false;(五) 运行结果如下:专心-专注-专业
限制150内