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

上传人:b****3 文档编号:5314824 上传时间:2022-12-15 格式:DOCX 页数:9 大小:72.10KB
下载 相关 举报
机械优化设计复合形方法及源程序.docx_第1页
第1页 / 共9页
机械优化设计复合形方法及源程序.docx_第2页
第2页 / 共9页
机械优化设计复合形方法及源程序.docx_第3页
第3页 / 共9页
机械优化设计复合形方法及源程序.docx_第4页
第4页 / 共9页
机械优化设计复合形方法及源程序.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

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

《机械优化设计复合形方法及源程序.docx》由会员分享,可在线阅读,更多相关《机械优化设计复合形方法及源程序.docx(9页珍藏版)》请在冰豆网上搜索。

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

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

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

(一)题目:

用复合形法求约束优化问题

的最优解。

基本思路:

在可行域中构造一个具有K个顶点的初始复合形。

对该复合形各顶点的目标函数值进行比较,找到目标函数值最大的顶点(即最坏点),然后按一定的法则求出目标函数值有所下降的可行的新点,并用此点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优点移动一步,直至逼近最优点。

(二)复合形法的计算步骤

1)选择复合形的顶点数k,一般取

,在可行域内构成具有k个顶点的初始复合形。

2)计算复合形个顶点的目标函数值,比较其大小,找出最好点xL、最坏点xH、及此坏点xG..

3)计算除去最坏点xH以外的(k-1)个顶点的中心xC。

判别xC是否可行,若xC为可行点,则转步骤4);若xC为非可行点,则重新确定设计变量的下限和上限值,即令

,然后转步骤1),重新构造初始复合形。

4)按式

计算反射点xR,必要时改变反射系数α的值,直至反射成功,即满足式

然后xR以取代xH,构成新的复合形。

5)若收敛条件

得到满足,计算终止。

约束最优解为:

(三)复合形法程序框图见下图:

(四)源程序如下:

/*输入值选择n=2,k=3,本程序可以处理n为2或3,k为3或4的情况*/

#include

#include

#include

#include

#defineE01e-5/*复合形法收敛控制精度*/

double**apply(int,int);/*申请矩阵空间*/

doublef(double*);/*目标函数*/

double*g(double*);/*约束函数*/

booljudge(double*);/*可行点的判断*/

intmain()

{

intn,k;

inti,j,k1;

intl;

doubletemporary;

doublerestrain;/*收敛条件*/

doublereflect;/*反射系数*/

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*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("请输入选定的第一个可行点x1(包含%d个数):

",n);

for(i=0;i

scanf("%lf",*x+i);

printf("请输入初选变量的下限a(包含%d个数):

",n);

for(i=0;i

scanf("%lf",a+i);

printf("请输入初选变量的上限b(包含%d个数):

",n);

for(i=0;i

scanf("%lf",b+i);

printf("输出输入结果为:

\nn=%d,k=%d,x1=(",n,k);/*输出已知数据*/

for(i=0;i

printf("%.5lf",*(*x+i));

printf("%.5lf)\na=(",*(*x+n-1));

for(i=0;i

printf("%f",*(a+i));

printf("%.5lf),b=(",*(a+n-1));

for(i=0;i

printf("%f",*(b+i));

printf("%.5lf)\n",*(b+n-1));

L1:

for(i=1;i

for(j=0;j

*(*(x+i)+j)=*(a+j)+(double)(rand()%10000)/10000*(*(b+j)-*(a+j));

l=1;

for(i=1;i

if(judge(*(x+i)))

{

for(j=1;j

if(!

judge(*(x+j)))

{

for(k1=0;k1

{

temporary=*(*(x+i)+k1);

*(*(x+i)+k1)=*(*(x+j)+k1);

*(*(x+j)+k1)=temporary;

}

break;

}

l++;

}

for(i=0;i

for(j=i+1;j

if(f(*(x+i))

for(k1=0;k1

{

temporary=*(*(x+i)+k1);

*(*(x+i)+k1)=*(*(x+j)+k1);

*(*(x+j)+k1)=temporary;

}

for(i=0;i

*(x_c+i)=0;

for(i=0;i

for(j=0;j

*(x_c+j)+=*(*(x+i)+j);

for(i=0;i

*(x_c+i)/=l;

if(!

judge(x_c))/*判断可行点中心是否可行*/

{

for(i=0;i

{

*(a+i)=*(*(x+l-1)+i);

*(b+i)=*(x_c+i);

}

gotoL1;

}

else

{

for(i=l;i

do{

for(j=0;j

*(*(x+i)+j)=*(x_c+j)+0.5*(*(*(x+i)+j)-*(x_c+j));

}while(!

judge(*(x+i)));

L2:

for(i=0;i

for(j=i+1;j

if(f(*(x+i))

for(k1=0;k1

{

temporary=*(*(x+i)+k1);

*(*(x+i)+k1)=*(*(x+j)+k1);

*(*(x+j)+k1)=temporary;

}

restrain=0;/*求收敛条件*/

for(i=0;i

restrain+=(f(*(x+i))-f(*(x+k-1)))*(f(*(x+i))-f(*(x+k-1)));

restrain=sqrt(1.0/(k-1)*restrain);

if(restrain

{

printf("\n求得约束最优点为:

(");

for(i=0;i

printf("%.5f",*(*(x+k-1)+i));

printf(")\n目标函数的最优解为:

%.5f\n",f(*(x+k-1)));

return0;

}

else

{

L3:

for(i=0;i

*(x_c+i)=0;

for(i=1;i

for(j=0;j

*(x_c+j)+=*(*(x+i)+j);

for(i=0;i

*(x_c+i)/=k-1;

reflect=1.3;

L4:

for(i=0;i

*(x_r+i)=*(x_c+i)+reflect*(*(x_c+i)-*(*x+i));

if(!

judge(x_r))

{

reflect*=0.5;

gotoL4;

}

elseif(f(x_r)

{

for(i=0;i

*(*x+i)=*(x_r+i);

gotoL2;

}

elseif(reflect<=1e-10)

{

for(i=0;i

*(*x+i)=*(*(x+1)+i);

gotoL3;

}

else

{

reflect*=0.5;

gotoL4;

}

}

}

}

double**apply(introw,intcol)/*申请矩阵空间*/

{

inti;

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

*(y+i)=x+i*col;

returny;

}

doublef(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;

returnp;

}

booljudge(double*x)/*可行点的判断*/

{

inti;

double*p=(double*)calloc(3,sizeof(double));

p=g(x);

for(i=0;i<3;i++)

if(*(p+i)>0)

break;

if(i==3)

returntrue;

else

returnfalse;

}

(五)运行结果如下:

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1