机械优化设计 复合形法实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二.程序框图
开始
输入 n,k,ε
形成初始复合形的 k 个顶点 xj(j=1,2,3,.....k)
计算各顶点的目标函数值
a=xl
Fra Baidu bibliotek
将各定点的目标函数值和坐标
b=xc
按目标函数值的大小排序
是 δ <ε 否
计算出去 xH 后的各顶点中心 xc=1−1k x
������ ������ =1
xj
否 xc 可行?
四.程序结果
lh=-1; for(ll=1;ll<k;ll++) {
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);
if(iw==0) {
bu[], double xcom[][100],double *f) {
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)); double *fxk=(double*)calloc(k,sizeof(double)); double *g=(double*)calloc(kg,sizeof(double)); s5: for(i=0;i<n;i++)
int gau(double x[],double g[],int kg) {
int i; constraint(x,g); 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++) { xs=0; for(l=0;l<ll;l++) {
if(sdx<ep) goto s38;
fxse(n,k,x,xcom,fxk);
lh=0;
s22: fxh=fxk[lh];
for(i=0;i<n;i++)
xh[i]=xcom[i][lh]; xcent(n,k,k,lh,x0,xcom); iw=gau(x0,g,kg); if(iw==0)goto s36; alp=1.3; s12: for(i=0;i<n;i++)
xr[i]=x0[i]+alp*(x0[i]-xh[i]); iw=gau(xr,g,kg); if(iw==0) {
alp=alp*0.5; goto s12; } fxr=objfx(xr); if(fxr>=fxh) { if(alp>1.0e-4) {
alp=alp*0.5; goto s12; } lh=lh+1; if(lh<3)goto s22;
bu[], double xcom[][100],double *f) ;
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); } #include <stdlib.h> #include <math.h> #include <stdio.h> double objfx(double x[]); void constraint(double x[],double g[]); 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; }
复 合 型 法 实 验 报 告
院系:机电工程学院 专业:机制自动化 班级:10--03 班 姓名: 学号:
一.复合形法求约束思想
在可行区内构造一个具有 k 个顶点的初始复合形.对该复合形的 顶点的目标函数值进行比较,找到目标函数值最大的顶点(称最坏点), 然后按一定的法则求出目标函数值的所有下降的可行的新点,并用此 点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优 点移动一步,直至逼近最优点.
printf(" Fmin=%.5f\n",fx0);
for(i=0;i<kg;i++)
printf( "
G(%d)min=%.5f",i,g[i]);
sdx=0;
for(l=0;l<k;l++)
sdx=sdx+(fx0-fxk[l])*(fx0-fxk[l]);
sdx=sqrt(sdx/(double)k);
for(i=0;i<n;i++) x[i]=x0[i]+0.5*(x[i]-x0[i]);
goto s24; } else {
for(i=0;i<n;i++) xcom[i][ll+1]=x[i];
} } for(l=0;l<k;l++) { for(i=0;i<n;i++) x[i]=xcom[i][l]; fx=objfx(x);
fxk[l]=fx;
}
it=0;
s14: it=it+1;
printf("\n\n\n N= %2d\n",it);
lh=-1;
xcent(n,k,k,lh,x0,xcom);
fx0=objfx(x0);
iw=gau(x0,g,kg);
for(i=0;i<n;i++)
printf("
X(%d)min=%.5f ",i+1,x0[i]);
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++) {
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
} for(i=0;i<n;i++)
xcom[i][lh]=xr[i]; fxk[lh]=fxr; goto s14; s36: for(i=0;i<n;i++) {
bl[i]=xcom[i][k]; bu[i]=x0[i];
} goto s5; s38: for(i=0;i<n;i++)
x[i]=x0[i]; *f=objfx(x); free(x0); free(xh); free(xr); free(g); free(fxk); }
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
是
反射点 xr=xc+α (xc-xh)
x*=xl,f*=fl 结束
xr 可行?
否
是
否
f(xr)<f(xh)?
α =0.5α 否
α <=10^(-10)?
是
是
xh=xr
三.程序
以次坏点 xg 代替最坏点 xh
#include<math.h>
double objfx(double x[])
{
double ff;
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[]) {
int l,lp,lp1,i; double temp; for(l=0;l<k-1;l++)
x[i]=bl[i]+rand()/40000.0*(bu[i]-bl[i]); 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]);
开始
输入 n,k,ε
形成初始复合形的 k 个顶点 xj(j=1,2,3,.....k)
计算各顶点的目标函数值
a=xl
Fra Baidu bibliotek
将各定点的目标函数值和坐标
b=xc
按目标函数值的大小排序
是 δ <ε 否
计算出去 xH 后的各顶点中心 xc=1−1k x
������ ������ =1
xj
否 xc 可行?
四.程序结果
lh=-1; for(ll=1;ll<k;ll++) {
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);
if(iw==0) {
bu[], double xcom[][100],double *f) {
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)); double *fxk=(double*)calloc(k,sizeof(double)); double *g=(double*)calloc(kg,sizeof(double)); s5: for(i=0;i<n;i++)
int gau(double x[],double g[],int kg) {
int i; constraint(x,g); 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++) { xs=0; for(l=0;l<ll;l++) {
if(sdx<ep) goto s38;
fxse(n,k,x,xcom,fxk);
lh=0;
s22: fxh=fxk[lh];
for(i=0;i<n;i++)
xh[i]=xcom[i][lh]; xcent(n,k,k,lh,x0,xcom); iw=gau(x0,g,kg); if(iw==0)goto s36; alp=1.3; s12: for(i=0;i<n;i++)
xr[i]=x0[i]+alp*(x0[i]-xh[i]); iw=gau(xr,g,kg); if(iw==0) {
alp=alp*0.5; goto s12; } fxr=objfx(xr); if(fxr>=fxh) { if(alp>1.0e-4) {
alp=alp*0.5; goto s12; } lh=lh+1; if(lh<3)goto s22;
bu[], double xcom[][100],double *f) ;
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); } #include <stdlib.h> #include <math.h> #include <stdio.h> double objfx(double x[]); void constraint(double x[],double g[]); 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; }
复 合 型 法 实 验 报 告
院系:机电工程学院 专业:机制自动化 班级:10--03 班 姓名: 学号:
一.复合形法求约束思想
在可行区内构造一个具有 k 个顶点的初始复合形.对该复合形的 顶点的目标函数值进行比较,找到目标函数值最大的顶点(称最坏点), 然后按一定的法则求出目标函数值的所有下降的可行的新点,并用此 点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优 点移动一步,直至逼近最优点.
printf(" Fmin=%.5f\n",fx0);
for(i=0;i<kg;i++)
printf( "
G(%d)min=%.5f",i,g[i]);
sdx=0;
for(l=0;l<k;l++)
sdx=sdx+(fx0-fxk[l])*(fx0-fxk[l]);
sdx=sqrt(sdx/(double)k);
for(i=0;i<n;i++) x[i]=x0[i]+0.5*(x[i]-x0[i]);
goto s24; } else {
for(i=0;i<n;i++) xcom[i][ll+1]=x[i];
} } for(l=0;l<k;l++) { for(i=0;i<n;i++) x[i]=xcom[i][l]; fx=objfx(x);
fxk[l]=fx;
}
it=0;
s14: it=it+1;
printf("\n\n\n N= %2d\n",it);
lh=-1;
xcent(n,k,k,lh,x0,xcom);
fx0=objfx(x0);
iw=gau(x0,g,kg);
for(i=0;i<n;i++)
printf("
X(%d)min=%.5f ",i+1,x0[i]);
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++) {
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
} for(i=0;i<n;i++)
xcom[i][lh]=xr[i]; fxk[lh]=fxr; goto s14; s36: for(i=0;i<n;i++) {
bl[i]=xcom[i][k]; bu[i]=x0[i];
} goto s5; s38: for(i=0;i<n;i++)
x[i]=x0[i]; *f=objfx(x); free(x0); free(xh); free(xr); free(g); free(fxk); }
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
是
反射点 xr=xc+α (xc-xh)
x*=xl,f*=fl 结束
xr 可行?
否
是
否
f(xr)<f(xh)?
α =0.5α 否
α <=10^(-10)?
是
是
xh=xr
三.程序
以次坏点 xg 代替最坏点 xh
#include<math.h>
double objfx(double x[])
{
double ff;
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[]) {
int l,lp,lp1,i; double temp; for(l=0;l<k-1;l++)
x[i]=bl[i]+rand()/40000.0*(bu[i]-bl[i]); 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]);