📄 funs.cpp
字号:
for(j=1;j<=VarNum;j++)
{
fprintf(fp,"%6.1f ",B[i][j]);
if(j%10==0)fprintf(fp,"\n");
}
fprintf(fp,"\n");
}
fprintf(fp,"\nAlph[%02d]\n",VarNum);
for(i=1;i<=VarNum;i++)
{
fprintf(fp,"%12.5f ",Alph[i]);
if(i%5==0)fprintf(fp,"\n");
}
fclose(fp);
} //if((fp=fopen(...
else
{
char ch[30];
fscanf(fp,"%s",ch);
for(i=1;i<=VarNum;i++)
for(j=1;j<=VarNum;j++)fscanf(fp,"%f",&A[i][j]);
fscanf(fp,"%s",ch);
for(i=1;i<=VarNum;i++)
for(j=1;j<=VarNum;j++)fscanf(fp,"%f ",&B[i][j]);
fscanf(fp,"%s",ch);
for(i=1;i<=VarNum;i++)
fscanf(fp,"%f ",&Alph[i]);
fclose(fp);
}
double xx3[MAX_NUM];
for(i=1;i<=VarNum;i++)
{
xx1=0;
for(j=1;j<=VarNum;j++)
xx1+=A[i][j]*sin(Alph[j])+B[i][j]*cos(Alph[j]);
xx3[i]=xx1;
}
for(i=1;i<=VarNum;i++)Alph[i]=(float)xx3[i];
} //if(FirstFlag)...
xx1=0;
for(i=1;i<=VarNum;i++)
{
Ai=Alph[i];
Bi=0;
for(j=1;j<=VarNum;j++)
{
// Ai+=A[i][j]*sin(Alph[j])+B[i][j]*cos(Alph[j]);
Bi+=/*A[i][j]*(x[j])+B[i][j]*(x[j]);//*/A[i][j]*sin(x[j])+B[i][j]*cos(x[j]);
}
xx1+=(Ai-Bi)*(Ai-Bi);
}
return -xx1;
}
double LiPengFun(double x[]) //x[1]>-3,x[2]<3
{
double xx1,xx2,xx;
xx1=x[1]-10;xx2=x[2]-20;
xx=1.0/(0.1+xx1*xx1+xx2*xx2);
xx1=x[1]-20;xx2=x[2]-40;
xx+=1.0/(0.12+xx1*xx1+xx2*xx2);
xx1=x[1]-5;xx2=x[2]-10;
xx+=1.0/(.125+xx1*xx1+xx2*xx2);
return xx;
}
double SchwefelFun(double x[]) //[-512,512]
{
double xx1,xx2;
if(FirstFlag)
{
// printf("\n\n Schwefel function [-512,512]");
// printf("Input dimension(1--100): ");
// scanf("%d",&VarNum);
// if(VarNum>100)VarNum=100;
// if(VarNum<1)VarNum=1;
FirstFlag=0; //numbers of the variable(s) in the function.
}
xx2=0;
for(int i=1;i<=VarNum;i++)
{
xx1=x[i]*sin(sqrt(fabs(x[i])));
xx2+=xx1;
}
return xx2;
}
double FoxHole(double x[])
{
static double a[11]={5,5.3,8,-3,.5,6,8,9,5,5.5,12};
static double b[11]={100,100,100,100,100,100,100,100,100,100,100};
static double c[11]={.1,.6,.5,.11,5,6,7,8,9,0,10};
int i;
if(FirstFlag)
{
// FuncHead("FoxHole function,[-10,10]");
VarNum=1;
FirstFlag=0;
}
double xx1,xx2;
xx2=0;
for(i=0;i<=10;i++)
{
xx1=(x[1]-a[i]);
xx1=b[i]*xx1*xx1;
xx2+=1.0/(xx1+c[i]);
}
return xx2;
}
double LinFun(double x[]) //(0,1)
{
if(FirstFlag)FirstFlag=0;
double xx1,xx2;
xx1=sin(5*Pi/pow(1+x[1],4));
xx2=(1-x[1])*pow(xx1,4);
return xx2;
}
void FuncHead(char *String1,char *String2)
{
printf("%s",String1);
if(String2!=0)
{
printf("%s",String2);
scanf("%d",&VarNum);
if(VarNum>NVARS)VarNum=NVARS;
if(VarNum<1)VarNum=1;
}
FirstFlag=0; //numbers of the variable(s) in the function.
}
/*
double TLJFun(double x[])
{
double sita,alph,beta,Xb,Xd,Yb,Yd,ei,
if(FirstFlag)
{
printf("TuiLiaoJi function\n");
Lower[0]=-15.5;Upper[0]=15.5; //e x[1]
Lower[1]=31.5;Upper[1]=46.5; //h x[2]
Lower[2]=15.5;Upper[2]=46.5; //L1 x[3]
Lower[3]=15.5;Upper[3]=46.5; //L2 x[4]
Lower[4]=31.0;Upper[4]=77.5 ; //L3 x[5]
Lower[5]=-31.0;Upper[5]=31.0; //delt x[6]
VarNum=6;
FirstFlag=0;
}
double Phi=Pi/180;
Xb=x[3]*sin((x[6]+60)*Phi);
Xd=x[1];
Yb=-x[3]*cos((x[6]+60)*Phi);
Yd=x[2]+S(T);
Lbd=sqrt((*/
/*You can add new functions here,and add the phototype of the function
in xx1.h please.the number of variables should be smaller than 100.*/
/*
double KeaneBump(double x[])
{
int i,j;
double xx1,xx2,xx3,Ai,Bi;
float panelty=0;
if(FirstFlag)
{
printf("\n\nThis is Keane's Bump function, [0,10]");
printf("\nInput the dimension(1--100): ");
scanf("%d",&VarNum);
FirstFlag=0;
if(VarNum>MAX_NUM)VarNum=MAX_NUM-2;
if(VarNum<0)VarNum=1;
}
xx1=0;xx2=1; panelty=0;
for(i=1;i<=VarNum;i++)
{xx1+=x[i];xx2*=x[i];}
if(xx1<=7.5*VarNum);
else panelty=100;
if(xx2>=0.75);
else panelty=100;
xx1=xx2=0;xx3=1;
for(i=1;i<=VarNum;i++)
{
xx1+=pow(cos(x[i]),4);
xx2+=i*x[i]*x[i];
xx3*=pow(cos(x[i]),2);
}
xx1=(xx1-2*xx3)/sqrt(xx2);
return xx1-panelty;
}
double Identify(double x[])
{
double yg[4],yx[4],xx1,xx2;
double eps=0;
for(int i=0;i<100;i++)
{
u[2]=u[3];u[1]=u[2];u[0]=u[1];
yg[3]=b0*u[3]+b1*u[2]+b2*u[1]+b3*u[0]-a1*yg[2]-a2*yg[1]-a3*yg[0];
yx[3]=x[1]*u[3]+x[2]*u[2]+x[3]*u[1]+x[4]*u[0]
-x[5]*yx[2]-x[6]*yx[1]-x[7]*yx[0];
eps+=(yg[3]-yx[3])*(yg[3]-yx[3]);
yg[2]=yg[3];yg[1]=yg[2];yg[0]=yg[1];
yx[2]=yx[3];yx[1]=yx[2];yx[0]=yx[1];
}*/
extern "C" __declspec(dllexport)double FitnessEntery(double x[],int varnum);
double Example1(double x[])
{
/* return FitnessEntery(x,VarNum);
double xx1;
if(FirstFlag)
{
// printf("This is an example to demostrate IEGA.\n");
VarNum=1;
FirstFlag=0;
}
xx1=x[1]*sin(10.0*Pi*x[1])+2.0;
return xx1;*/
int i,j;
static double A[51][51],B[51];
if(FirstFlag)
{
if(VarNum>50)VarNum=50;
for(i=1;i<=VarNum;i++)
{
for(j=1;j<=VarNum;j++)
{
if(i!=j)A[i][j]=1;
else A[i][j]=1+12;
}
B[i]=2*i-1.0;
}
FirstFlag=0;
}
double xx1,xx2;
xx1=xx2=0;
for(i=1;i<=VarNum;i++)
{
xx1=0;
for(j=1;j<=VarNum;j++)
{
xx1=xx1+A[i][j]*x[j];
}
xx1=xx1-B[i];
xx2+=xx1*xx1;
}
return -xx2;
}
double LeungF2(double x[])
{
double xx1;
if(FirstFlag)
{
// FuncHead("LeungF2 [-5.12,5.12] ","N(1--100):");
FirstFlag=0;
}
xx1=0;
for(int i=1;i<=VarNum;i++)
{
xx1+=x[i]*x[i]-10*cos(2*Pi*x[i])+10;
}
return -xx1;
}
double LeungF4(double x[])
{
double xx1,xx2;
if(FirstFlag)
{
// FuncHead("LeungF4 [-600,600]","N(1--100):");
FirstFlag=0;
}
xx1=0;xx2=1;
for(int i=1;i<=VarNum;i++)
{
xx1+=x[i]*x[i];
xx2*=cos(x[i]/sqrt(i));
}
xx1=xx1/4000.0-xx2+1;
return -xx1;
}
double LeungF5(double x[])
{
if(FirstFlag)
{
// FuncHead("LeungF5 [-50,50]","N(1--100):");
FirstFlag=0;
}
double xx1,xx2,y1,yi,yi1;
int i;
y1=1+0.25*(x[1]+1);
xx1=10*sin(Pi*y1)*sin(Pi*y1);
for(i=1;i<VarNum;i++)
{
yi=1+.25*(x[i]+1);
yi1=1+0.25*(x[i+1]+1);
yi1=sin(Pi*yi1);
xx1+=(yi-1)*(yi-1)*(1+10.0*yi1*yi1);
}
yi=1+.25*(x[VarNum]+1);
xx1+=(yi-1)*(yi-1);
xx1=xx1*Pi/VarNum;
xx2=0;
for(i=1;i<=VarNum;i++)xx2+=u(x[i],10,100,4);
return -(xx1+xx2);
}
double u(double x,double a,double k,double m)
{
if(x>a) return k*pow(x-a,m);
if(x<-a) return k*pow(-x-a,m);
return 0.0;
}
double ShekelFoxholes(double x[])
{
int i,j;
double xx1,xx2,xx3,xx;
static double a[2][25];
if(FirstFlag)
{
for(i=0;i<5;i++)
{
j=5*i;
a[0][j]=-32;
a[0][1+j]=-16;
a[0][2+j]=0;
a[0][3+j]=16;
a[0][4+j]=32;
a[1][j]=a[1][1+j]=a[1][2+j]=a[1][3+j]=a[1][4+j]=-32+i*16;
}
FirstFlag=0;
}
xx=0;
for(j=0;j<25;j++)
{
xx1=x[1]-a[0][j];
xx2=x[2]-a[1][j];
xx3=j+1+pow(xx1,6)+pow(xx2,6);
xx+=1.0/xx3;
}
return -1.0/(0.002+xx);
}
double LeungF6(double x[])
{
if(FirstFlag)
{
// FuncHead("LeungF6 [-50,50]","N(1--100):");
FirstFlag=0;
}
double xx1,xx2;
int i;
xx1=sin(3*Pi*x[1])*sin(3*Pi*x[1]);
for(i=1;i<VarNum;i++)
{
xx1+=(x[i]-1)*(x[i]-1)*(1+sin(3*Pi*x[i+1])*sin(3*Pi*x[i+1]));
}
xx1+=pow(x[VarNum]-1,2)*(1+pow(sin(2*Pi*x[VarNum]),2));
xx1/=10.0;
xx2=0;
for(i=1;i<=VarNum;i++)xx2+=u(x[i],5,100,4);
return -(xx1+xx2);
}
double LeungF7(double x[])
{
double xx1=0.0;
for(int i=1;i<=VarNum;i++)
{
xx1+=pow(sin(i*x[i]*x[i]/Pi),20)*sin(x[i]);
}
return xx1;
}
double LeungF9(double x[])
{
double xx1;
if(FirstFlag)
{
// FuncHead("LeungF9,[-5,5] ","N(1--100):");
FirstFlag=0;
}
xx1=0;
for(int i=1;i<=VarNum;i++)
{
xx1+=pow(x[i],4)-16*x[i]*x[i]+5*x[i];
}
return -xx1/VarNum;
}
double LeungF13(double x[])
{
double xx1,xx2;
if(FirstFlag)
{
FuncHead("LeungF13,[-10,10] ","N(1--100):");
FirstFlag=0;
}
xx1=0;xx2=1;
for(int i=1;i<=VarNum;i++)
{
/* if(i&1){
xx1+=fabs(x[i]-sqrt(i));
xx2*=fabs(x[i]-sqrt(i));}
else {xx1+=fabs(x[i]+sqrt(i));
xx2*=fabs(x[i]+sqrt(i));}*/
xx1+=fabs(x[i]);
xx2*=fabs(x[i]);
}
return -(xx1+xx2);
}
double LeungF14(double x[])
{
double xx1,xx2;
int i,j;
if(FirstFlag)
{
// FuncHead("LeungF14,[-100,100]","N(1--100):");
FirstFlag=0;
}
xx2=0;
for(i=1;i<=VarNum;i++)
{
xx1=0;
for(j=1;j<=i;j++)xx1+=x[j];
xx2+=xx1*xx1;
}
return -xx2;
}
double LeungF15(double x[])
{
double xx1;
if(FirstFlag)
{
// FuncHead("LeungF15,[-100,100]","N(1--100):");
FirstFlag=0;
}
xx1=fabs(x[1]);
for(int i=2;i<=VarNum;i++)
if(xx1<fabs(x[i]))xx1=fabs(x[i]);
return -xx1;
}
double ParaIden(double x[]) //参数辨识
{
#define KMAX 50
static double yk[KMAX],u[KMAX];
double ykx[KMAX];
int k;
if(FirstFlag)
{
for(k=0;k<KMAX;k++)u[k]=sin(k/12);
yk[0]=yk[1]=yk[2]=0;
for(k=3;k<KMAX;k++)
yk[k]=u[k-1]+0.5*u[k-2]+1.5*yk[k-1]-0.7*yk[k-2];//-0.5*yk[k-3];//+Randval(-.125,.125);
FirstFlag=0;
}
ykx[0]=ykx[1]=ykx[2]=0;
for(k=3;k<KMAX;k++)
ykx[k]=x[3]*u[k-1]+x[4]*u[k-2]+x[1]*ykx[k-1]+x[2]*ykx[k-2];//+x[5]*ykx[k-3];
double e;
for(e=0,k=2;k<KMAX;k++)
{
e+=(yk[k]-ykx[k])*(yk[k]-ykx[k]);
}
return -e;
}
double BackStepWxz(double x[]) //Back Step Function1
{
int i;
double xx=0,xz;
if(FirstFlag)
{
// FuncHead("\n\n BackStep function [-100,100]",
// "\nInput dimension(1--100)");
FirstFlag=0; //numbers of the variable(s) in the function.
}
for(i=1;i<=VarNum;i++)
{
if(i&1)xz=x[i]+sqrt(i);
else xz=x[i]-sqrt(i);
//// xz=x[i];
xx+=(xz)*(xz);
}
return -xx;
}
double MyRob1(double x[])
{
double Distance(double x1,double y1,double x2,double y2);
const double x0=0.0,y0=10.0,sita0=0,xp=100,yp=100;
const double vl0=0,vr0=0;
const double a=0.94,b=0.00093,r=7.5,umax=305,eps=5,degcoe=180/Pi;
double sitak1,dsita,xk1,yk1,vrk1,vlk1,ulk1,urk1;
long int k=0;
if(FirstFlag)
{
FirstFlag=0;
VarNum=1;
}
xk1=x0;yk1=y0;vlk1=vl0;vrk1=vr0;sitak1=sita0;
do
{
sitak1=sitak1+.5*(vrk1-vlk1)/r;
dsita=sitak1-atan2(yp-yk1,xp-xk1);
if(dsita>0)
{
ulk1=umax;
urk1=umax-x[1]*dsita*degcoe;
if(urk1<-umax)urk1=-umax;
if(urk1>umax)urk1=umax;
}
else
{
urk1=umax;
ulk1=umax-x[1]*dsita*degcoe;
if(ulk1<-umax)ulk1=-umax;
if(ulk1>umax)ulk1=umax;
}
vlk1=a*vlk1+b*ulk1;
vrk1=a*vrk1+b*urk1;
xk1=xk1+.5*(vlk1+vrk1)*cos(sitak1);
yk1=yk1+.5*(vlk1+vrk1)*sin(sitak1);
k++;
}while(Distance(xk1,yk1,xp,yp)>eps&&k<10000);
return (double)-k;
}
double Distance(double x1,double y1,double x2,double y2)
{
double x,y;
x=x2-x1;
y=y2-y1;
return sqrt(x*x+y*y);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -