有偿求助编写个主程序,算法已经给出
#include "math.h"#include "iostream.h"
#include "stdlib.h"
#define E1 0.001//迭代收敛精度
#define ep 0.001//复合形法中映射系数
#define n 4 //设计变量的维数
#define k 5 //复合形法中的顶点数
float af=10;//初始映射系数
int i,j;
double X0[n],XX[n],X[k][n],FF[k];
void produce (double A[n],double B[n]);
int p=0;
double a[n],b[n];//
double F(double C[n]);//目标函数
int cons(double D[n]);//约束域
void bou();//
double *Complex();
double F(double C[n])//目标函数
{
double F;
F=1.56*7.6*pow(10,-2)*3*(C[0]*C[2]+0.5*(C[3]-C[2]-5)*(C[0]+C[1])+C[1]*5);
return F;
}
int cons(double D[n])//约束域
{
if(((D[0]-0.8>=0)&&(1.5-D[0]>=0))&&((D[1]-1.0>=0)&&(1.5-D[1]>=0))&&(D[1]-D[0]-0.1>=0)&&((D[2]-5>=0)&&(20-D[2]>=0))&&((D[3]-60>=0)&&(75-D[3]>=0))
&&(3000-(6*492.5*D[3])/(7.6*3*D[0]*D[0])>=0))
//D[0]是弹簧端部等厚部分的厚度h1;D[1]是弹簧中部厚度;D[2]是弹簧端部长度;D[3]弹簧主片最大伸直长度之半
return 1;//若在约束域内则返回1
else
return 0;
}
void bou()//计算变量的边界条件
{
a[0]=0.8;a[1]=0.8;a[2]=5;a[3]=60;
b[0]=1.5;b[1]=1.5;b[2]=20;b[3]=75;
}
void produce(double A[n],double B[n])//产生复合的K个顶点
{
double rr;int jj;
do
{
rr=rand(); rr=rr/32767;//调用rand随机生成
for(i=0;i<n;i++)
{
X[0][i]=A[i]+rr*(B[i]-A[i]);
XX[i]=X[0][i];//产生起始点的维坐标
}
}
while (cons(XX)==0);//若产生的起始点不在约束范围内,刚继续重新生成,直到在约束范围内为止
for(j=1;j<k;j++)
{ rr=rand();rr=rr/32767;
for(i=0;i<n;i++)
{
X[j][i]=A[i]+rr*(B[i]-A[i]);//产生其余的K-1个点
}
}
for(j=0;j<k;j++)//检查这其余的K-1个点
{
for(i=0;i<n;i++)
{
X0[i]=0;
for(jj=0;jj<j+1;jj++)
{
X0[i]+=X[jj][i];//
}
X0[i]=(1/(j+1.0))*(X0[i]);//求出这K个点的形心
XX[i]=X[j][i];//第J个点
}
while(cons(XX)==0)//若其余的K-1个点有某个点不在可行域内
{
for(i=0;i<n;i++)
{
X[j][i]=X0[i]+0.5*(X[j][i]-X0[i]);//产生新的点,直到这个点在可行域内
XX[i]=X[j][i];//
}
}//至此所有的点均在可行域内
}
}
double *Complex()
{
double EE,Xc[n],Xh[n],Xg[n],Xl[n],Fh,Fg,Fl,Xr[n],*prXl;
int h,g,l;
bou();
produce(a,b);
EE=E1+1;
while(EE>E1)//初始迭代条件大于终于迭代条件
{
for(i=0;i<n;i++)
{
Xc[i]=0;
for(j=0;j<k;j++)
{
Xc[i]+=X[j][i];
}
Xc[i]=1/(k+0.0)*Xc[i];//生成形心
}
for(j=0;j<k;j++)
{
for(i=0;i<n;i++)
{ XX[i]=X[j][i];}
FF[j]=F(XX);
}
Fh=FF[0];Fg=FF[0];Fl=FF[0];h=0;g=0;l=0;
for(j=0;j<k;j++)
{
if(FF[j]>Fh)
{ Fh=FF[j];h=j;}//最坏点FH
if(FF[j]<Fl)
{ Fl=FF[j];l=j;}//最好点
}
for(j=0;j<k;j++)
if((FF[j]>Fg)&&(j!=h))//次坏点FG
{ Fg=FF[j];g=j; }
for(i=0;i<n;i++)
{
Xh[i]=X[h][i];Xg[i]=X[g][i];Xl[i]=X[l][i];//分别在某维时的最坏,次坏,最好点
}
EE=0;
for(j=0;j<k;j++)
{ EE+=pow((FF[j]-F(Xc)),2);}//顶点与目标函数值之间之差的二次幂的和
EE=pow((1/(k+0.0)*EE),0.5);//和的均方根
p++;
if(EE<=E1)//若满足终止迭代条件
{
cout<<"\n F(Xmin)="<<F(Xl);//目标函数
prXl=&X[l][0];break;//最优解,跳出while循环
}
for(i=0;i<n;i++)
{
Xc[i]=0;
for(j=0;j<k;j++)
{
if(j!=h)
Xc[i]+=X[j][i];//求其余各点的形心
}
Xc[i]=1/(k-1.0)*Xc[i];//求其余各点形心
}
if(cons(Xc)==1)//形心在约束范围内
{
while(cons(Xc)==1)
{
for(i=0;i<n;i++)
{
Xr[i]=Xc[i]+af*(Xc[i]-Xh[i]);//求最坏(次)点的映射点
}
if(cons(Xr)==1)//映射点在约束范围内
{
if(F(Xr)>=F(Xh))//若映射点比最坏点还要坏
{
if(af<=ep)//且此时已经小于了要求精度
{
for(i=0;i<n;i++)
{ Xh[i]=Xg[i]; }//则用次坏代替最坏,同时返回 while(cons(Xc)==1)
}
else//若比要求精度大,则将步长缩小一半,返回 while(cons(Xc)==1),继续迭代
af=float(1/2.0*af);
}
else//若映射点比最坏点好
{
for(i=0;i<n;i++)
{ X[h][i]=Xr[i];}//用映射点代替最坏点
break;//跳出循环 while(cons(Xc)==1),重新建立新的K个点,约束域
}
}
else //映射点不在约束范围内步长变为1/2
af=(float)(1/2.0*af);
}
}
else//若形心在约束域外
{
for(i=0;i<n;i++)
{ a[i]=Xl[i];b[i]=Xc[i]; }//则心形心与最好点构成新的复合图形或复合体
produce(a,b);
}
}
return prXl;
}
void main()
{
int i;double *pr;
cout<<"F(x)=1.56*7.6*10^(-2)*3*(C[0]*C[2]+0.5*(C[3]-C[2]-5)*(C[0]+C[1])+C[1]*5)"<<endl;
cout<<"x[0]是弹簧端部等厚部分的厚度h1"<<endl;
cout<<"x[1]是弹簧中部厚度"<<endl;
cout<<"x[2]是弹簧端部长度"<<endl;
cout<<"x[3]弹簧主片最大伸直长度之半"<<endl;
pr=Complex();
cout<<"\n";
for(i=0;i<n;i++)
{
cout<<"X["<<i<<"]="<<*(pr+i)<<"\n";
}
cout<<"迭代次数"<<endl;
cout<<p<<endl;
}
为什么运行没结果,有意者加我QQ 414738266