机械优化设计-复合型法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
int i,iw,l,ll,lh,it;
double fx,fx0,sdx,fxh,fxr,alp;
double *x0=(double*)calloc(n,sizeof(double));
double *xh=(double*)calloc(n,sizeof(double));
double *xr=(double*)calloc(n,sizeof(double));
{
int l,lp,lp1,i;
double temp;
for(l=0;l<k-1;l++)
for(lp=0;lp<k-l;lp++)
{
lp1=lp+1;
if(fxk[lp]<=fxk[lp1])
{
temp=fxk[lp];
fxk[lp]=fxk[lp1];
fxk[lp1]=temp;
for(i=0;i<n;i++)
double a[]={0,0},b[]={10,20},f,x[2],xcom[2][100];
comple(2,3,3,0.00001,x,a,b,xcom,&f);
printf(" \n\n\n输出最优解及目标函数值:\n");
printf("\n x1=%.5f x2=%.5f f(x1,x2)=%.5f\n\n ",x[0],x[1],f);
void constraint(double x[],double g[])
{
g[0]=64-x[0]*x[0]-x[1]*x[1];
g[1]=x[1]-x[0]-10;
g[2]=x[0]-10;
}
int gau(double x[],double g[],int kg)
{
int i;
constraint(x,g);
}
/*wsd说明n优化模型维数k复合形顶点数kg约束函数个数ep收敛精度x a初始点下限b初始点上限xcom进程中的优化结果*f */
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
double objfx(double x[]);
void constraint(double x[],double g[]);
{
xs=0;
for(l=0;l<ll;l++)
{
if(l!=lh)
xs=xs+xcom[i][l];
}
if(lh>-1)
x0[i]=xs/(ll-1);
else
x0[i]=xs/ll;
}
}
void fxse(int n,int k,double x[],double xcom[][100],double fxk[])
for(i=0;i<kg;i++)
{
if(g[i]>0)
goto s33;
}
return 1;
s33:return 0;
}
void xcent(int n,int k,int ll,int lh,double x0[],double xcom[][100])
{
int i,l;
double xs;
for(i=0;i<n;i++)
{
xcent(n,k,ll,lh,x0,xcom);
iw=gau(x0,g,kg);
if(iw==0)
goto s5;
for(i=0;i<n;i++)
x[i]=xcom[i][ll+1];
s24: iw=gau(x,g,kg);
4)按式 计算反射点xR,必要时改变反射系数α的值,直至反射成功,即满足式 。然后xR以取代xH,构成新的复合形。
5)若收敛条件 得到满足,计算终止。约束最优解源自文库: 。
(三)复合形法程序框图见下图:
(四)源程序如下:
#include<math.h>
double objfx(double x[])
{
double ff;
(一)题目:用复合形法求约束优化问题
; ; 的最优解。
基本思路:在可行域中构造一个具有K个顶点的初始复合形。对该复合形各顶点的目标函数值进行比较,找到目标函数值最大的顶点(即最坏点),然后按一定的法则求出目标函数值有所下降的可行的新点,并用此点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优点移动一步,直至逼近最优点。
(二)复合形法的计算步骤
1)选择复合形的顶点数k,一般取 ,在可行域内构成具有k个顶点的初始复合形。
2)计算复合形个顶点的目标函数值,比较其大小,找出最好点xL、最坏点xH、及此坏点xG..
3)计算除去最坏点xH以外的(k-1)个顶点的中心xC。判别xC是否可行,若xC为可行点,则转步骤4);若xC为非可行点,则重新确定设计变量的下限和上限值,即令 ,然后转步骤1),重新构造初始复合形。
double *fxk=(double*)calloc(k,sizeof(double));
double *g=(double*)calloc(kg,sizeof(double));
s5: for(i=0;i<n;i++)
x[i]=bl[i]+rand()/40000.0*(bu[i]-bl[i]);
{
x[i]=xcom[i][lp];
xcom[i][lp]=xcom[i][lp1];
xcom[i][lp1]=x[i];
}
}
}
}
void comple(int n,int k,int kg,double ep,double x[],double bl[],double bu[], double xcom[][100],double *f)
ff=(x[0]-5)*(x[0]-5)+4*(x[1]-6)*(x[1]-6);
return ff;
}
#include<stdio.h>
void main()
{
void comple(int n,int k,int kg,double ep,double x[],double bl[],double bu[], double xcom[][100],double *f) ;
iw=gau(x,g,kg);
if(iw==0)
goto s5;
for(i=0;i<n;i++)
xcom[i][0]=x[i];
for(l=1;l<k;l++)
for(i=0;i<n;i++)
xcom[i][l]=bl[i]+rand()/50000.0*(bu[i]-bl[i]);
lh=-1;
for(ll=1;ll<k;ll++)
int i,iw,l,ll,lh,it;
double fx,fx0,sdx,fxh,fxr,alp;
double *x0=(double*)calloc(n,sizeof(double));
double *xh=(double*)calloc(n,sizeof(double));
double *xr=(double*)calloc(n,sizeof(double));
{
int l,lp,lp1,i;
double temp;
for(l=0;l<k-1;l++)
for(lp=0;lp<k-l;lp++)
{
lp1=lp+1;
if(fxk[lp]<=fxk[lp1])
{
temp=fxk[lp];
fxk[lp]=fxk[lp1];
fxk[lp1]=temp;
for(i=0;i<n;i++)
double a[]={0,0},b[]={10,20},f,x[2],xcom[2][100];
comple(2,3,3,0.00001,x,a,b,xcom,&f);
printf(" \n\n\n输出最优解及目标函数值:\n");
printf("\n x1=%.5f x2=%.5f f(x1,x2)=%.5f\n\n ",x[0],x[1],f);
void constraint(double x[],double g[])
{
g[0]=64-x[0]*x[0]-x[1]*x[1];
g[1]=x[1]-x[0]-10;
g[2]=x[0]-10;
}
int gau(double x[],double g[],int kg)
{
int i;
constraint(x,g);
}
/*wsd说明n优化模型维数k复合形顶点数kg约束函数个数ep收敛精度x a初始点下限b初始点上限xcom进程中的优化结果*f */
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
double objfx(double x[]);
void constraint(double x[],double g[]);
{
xs=0;
for(l=0;l<ll;l++)
{
if(l!=lh)
xs=xs+xcom[i][l];
}
if(lh>-1)
x0[i]=xs/(ll-1);
else
x0[i]=xs/ll;
}
}
void fxse(int n,int k,double x[],double xcom[][100],double fxk[])
for(i=0;i<kg;i++)
{
if(g[i]>0)
goto s33;
}
return 1;
s33:return 0;
}
void xcent(int n,int k,int ll,int lh,double x0[],double xcom[][100])
{
int i,l;
double xs;
for(i=0;i<n;i++)
{
xcent(n,k,ll,lh,x0,xcom);
iw=gau(x0,g,kg);
if(iw==0)
goto s5;
for(i=0;i<n;i++)
x[i]=xcom[i][ll+1];
s24: iw=gau(x,g,kg);
4)按式 计算反射点xR,必要时改变反射系数α的值,直至反射成功,即满足式 。然后xR以取代xH,构成新的复合形。
5)若收敛条件 得到满足,计算终止。约束最优解源自文库: 。
(三)复合形法程序框图见下图:
(四)源程序如下:
#include<math.h>
double objfx(double x[])
{
double ff;
(一)题目:用复合形法求约束优化问题
; ; 的最优解。
基本思路:在可行域中构造一个具有K个顶点的初始复合形。对该复合形各顶点的目标函数值进行比较,找到目标函数值最大的顶点(即最坏点),然后按一定的法则求出目标函数值有所下降的可行的新点,并用此点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优点移动一步,直至逼近最优点。
(二)复合形法的计算步骤
1)选择复合形的顶点数k,一般取 ,在可行域内构成具有k个顶点的初始复合形。
2)计算复合形个顶点的目标函数值,比较其大小,找出最好点xL、最坏点xH、及此坏点xG..
3)计算除去最坏点xH以外的(k-1)个顶点的中心xC。判别xC是否可行,若xC为可行点,则转步骤4);若xC为非可行点,则重新确定设计变量的下限和上限值,即令 ,然后转步骤1),重新构造初始复合形。
double *fxk=(double*)calloc(k,sizeof(double));
double *g=(double*)calloc(kg,sizeof(double));
s5: for(i=0;i<n;i++)
x[i]=bl[i]+rand()/40000.0*(bu[i]-bl[i]);
{
x[i]=xcom[i][lp];
xcom[i][lp]=xcom[i][lp1];
xcom[i][lp1]=x[i];
}
}
}
}
void comple(int n,int k,int kg,double ep,double x[],double bl[],double bu[], double xcom[][100],double *f)
ff=(x[0]-5)*(x[0]-5)+4*(x[1]-6)*(x[1]-6);
return ff;
}
#include<stdio.h>
void main()
{
void comple(int n,int k,int kg,double ep,double x[],double bl[],double bu[], double xcom[][100],double *f) ;
iw=gau(x,g,kg);
if(iw==0)
goto s5;
for(i=0;i<n;i++)
xcom[i][0]=x[i];
for(l=1;l<k;l++)
for(i=0;i<n;i++)
xcom[i][l]=bl[i]+rand()/50000.0*(bu[i]-bl[i]);
lh=-1;
for(ll=1;ll<k;ll++)