⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 funs.cpp

📁 一个遗传算法的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	  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 + -