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

📄 main.c

📁 这是Clerc最新的文章balanced PSO,包括论文和与其配套的源程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	double Cf;	double K;	double sp;	double lf;		static double	S=189000.0;	static double	lmax=14.0;	static double	spm=6.0;	static double	sw=1.25;	static double	G=11500000;//----------------------------------------------------
	xs = x;	f=0;
	switch (pb.function)
	{
	#include "cec2005.c" // CEC 2005 benchmark		case 0:		// Parabola (Sphere)
	  //f=0.;
		for (d = 0; d < xs.size; d++) 
	  	{
				xd = xs.x[d];    
			//xd = xs.x[d]-50; // Shifted
      
			f = f + xd * xd;    
		}	  
		break;	
		case 1:		// Griewank
	  f = 0; 
		p = 1;	  
		for (d = 0; d < xs.size; d++)
	  {      
			xd = xs.x[d];	      
			f = f + xd * xd;	      
			p = p * cos (xd / sqrt ((double) (d + 1)));	    
		} 
		f = f / 4000 - p + 1;	  
		break;

		case 2:		// Rosenbrock
		f = 0;  
		t0 = xs.x[0]  + 1;	// Solution on (0,...0) when	  															// offset=0
	  for (d = 1; d < xs.size; d++)
	  {     
			
			t1 = xs.x[d]  + 1;	      
			tt = 1 - t0;	      
			f += tt * tt;      
			tt = t1 - t0 * t0;      
			f += 100 * tt * tt;	      
			t0 = t1;    
		}  
		break;

		case 3:		// Rastrigin
	  k = 10;  
	
		for (d = 0; d < xs.size; d++)    
	  {     
			xd = xs.x[d];	      
			f =f+ xd * xd - k * cos (2 * pi * xd);	    
		}	  
		f =f+ xs.size * k;  
		break;	
		case 4:		// 2D Tripod function
	  // Note that there is a big discontinuity right on the solution	  // point. 	
	x1 = xs.x[0] ; 
	x2 = xs.x[1];  
	s11 = (1.0 - sign (x1)) / 2;	s12 = (1.0 + sign (x1)) / 2; 
	s21 = (1.0 - sign (x2)) / 2;	s22 = (1.0 + sign (x2)) / 2;	  
	//f = s21 * (fabs (x1) - x2); // Solution on (0,0)
	f = s21 * (fabs (x1) +fabs(x2+50)); // Solution on (0,-50)  
	f = f + s22 * (s11 * (1 + fabs (x1 + 50) + fabs (x2 - 50)) 			+ s12 * (2 +fabs (x1 - 50) + fabs (x2 - 50)));	  
	break;

	case 5:  // Ackley
	sum1=0;
	sum2=0;
	DD=x.size;
	pi=acos(-1);
	for (d=0;d<x.size;d++)
		{
		xd=xs.x[d];
		sum1=sum1+xd*xd;
		sum2=sum2+cos(2*pi*xd);
		}
	f=-20*exp(-0.2*sqrt(  sum1/DD  ))-exp(sum2/DD)+20+exp(1);	
	break;	case 6:  // Center-bias test function					// on [-100,100]^2	for(d=0;d<x.size;d++) summit.x[d]=shift*center[d];	
	z=distanceL(x,summit,2);	if(z>radius) f=radius; else f=z;			break;	case 7: // Pressure vessel 				// Ref New Optim. Tech. in Eng. p 638				// D = 4          				x1=xs.x[0]; // [1.1,12.5] granularity 0.0625				x2= xs.x[1];// [0.6,12.5] granularity 0.0625				x3=xs.x[2]; // [0,240]				x4= xs.x[3];// [0,240]			 				f=0.6224*x1*x3*x4 + 1.7781*x2*x3*x3 + 3.1611*x1*x1*x4 +						19.84*x1*x1*x3;			 				// Constraints, by penalty method				y=0.0193*x3-x1; if ( y>0) {c= 1+pow(10,10)*y;  f=f*c*c; }				y=  0.00954*x3-x2; if (y>0) {c=1+y; f=f*c*c;  }				y = 750*1728-pi*x3*x3*(x4+(4.0/3)*x3); 						if (y>0) {c=1+y; f=f*c*c;  }	break;	case 8: // Coil compression spring 				// Ref New Optim. Tech. in Eng. p 644					x1=xs.x[0]; // {1,2, ... 70}				x2= xs.x[1];//[0.6, 3]				x3= xs.x[2];// relaxed form [0.207,0.5]  dx=0.001									// In the original problem, it is a list of									// acceptable values				// {0.207,0.225,0.244,0.263,0.283,0.307,0.331,0.362,0.394,0.4375,0.5}					f=pi*pi*x2*x3*x3*(x1+2)*0.25;						// Constraints				Cf=1+0.75*x3/(x2-x3) + 0.615*x3/x2;				K=0.125*G*pow(x3,4)/(x1*x2*x2*x2);				sp=Fp/K;				lf=Fmax/K + 1.05*(x1+2)*x3;					y=8*Cf*Fmax*x2/(pi*x3*x3*x3) -S;				if (y>0) {c=1+y; f=f*c*c*c;}					y=lf-lmax;				if (y>0) {c=1+y; f=f*c*c*c;}					y=sp-spm;				if (y>0) {c=1+y; f=f*c*c*c;}				y=sp-Fp/K;					if (y>0) {c=1+pow(10,10)*y; f=f*c*c*c;}					y=sw- (Fmax-Fp)/K;				if (y>0) {c=1+pow(10,10)*y; f=f*c*c*c;}				break;
	case 99: // Test
		// 1D Test "deceptive" on [0 1]
			xd=xs.x[0];
		if (xd<0.6) f=xd;
		else f=0.6-(0.5/0.4)*(xd-0.6);
		break;

		// 1D test  [-50, 50]
		xd=xs.x[0];
		f=xd*(xd+1)*cos(xd);
		break;
		
		 // KrishnaKumar
        f = 0;
        for ( d = 0; d < xs.size - 1; d++ )
        {
          f = f + sin( xs.x[d] + xs.x[d + 1] ) + sin( 2 * xs.x[d] * xs.x[d + 1] / 3 );
        }
      break;

			xd=xs.x[0];
			//if (xd<9) f=10-xd; else f=10*xd-90;	
			if (xd<=1) f=10*xd; else f=11-xd;	
		break;
		
		case 1000: //1-D  Landscape on a file
			// Find the nearest x
			xd=xs.x[0];
			z=fabs(xd-funct.x[0]);
			f=funct.fx[0];
			for(d=1;d<funct.N;d++)
			{
				z2=fabs(xd-funct.x[d]);
				if(z2<z)
				{
					z=z2;
					f=funct.fx[d];
				}
			}
		break;		case -1: // Repartition of points. L_infinity + L2		dim=pb.SS.D/pb.nb;		// Distance to the centre (L_infinity)		f1=0;		for(n=0;n<pb.nb;n++)		{			for(d=0;d<dim;d++)			{				z=0.5*(pb.SS.min[d]+pb.SS.max[d]); // Centre				z2=fabs(xs.x[d+n*dim]-z); // distance to the centre				z=0.5*(pb.SS.max[d]-pb.SS.min[d])-z2;				if(z>zero) f1=f1+1/z										- 2/(pb.SS.max[d]-pb.SS.min[d]);				else f1=infinity;			}		}		// Distance to the other points (L2 = Euclidean)		f2=0;		for(n=0;n<pb.nb-1;n++)		{			for(n1=n+1;n1<pb.nb;n1++)			{					z2=0;				for(d=0;d<dim;d++)				{					z=xs.x[d+n*dim]-xs.x[d+n1*dim];					z2=z2+z*z;				}				if(z2>zero) f2=f2+1./sqrt(z2); else f2=infinity;			}		}		f=f1 + f2*dim*2./(pb.nb-1);		break;				case -2: // // Repartition of points  - L2 + L2		dim=pb.SS.D/pb.nb;		// Distance to the centre (L_2)		f1=0;		dMax=0;		for(n=0;n<pb.nb;n++)		{			z2=0;			for(d=0;d<dim;d++)			{				z=xs.x[d+n*dim]-0.5*(pb.SS.min[d]+pb.SS.max[d]); // distance to the centre				z2=z2+z*z;				dist=0.5*(pb.SS.max[d]-pb.SS.min[d]);				dMax=dMax+dist*dist;			}			z2=sqrt(z2);			dMax=sqrt(dMax);			z=dMax-z2; // dMax - distance_to_centre			if(z>zero)			{				f1=f1+1/z -1/dMax;										}			else			 f1=infinity;		}		// Distance to the other points (L_2)		f2=0;		for(n=0;n<pb.nb-1;n++)		{			for(n1=n+1;n1<pb.nb;n1++)			{					z2=0;				for(d=0;d<dim;d++)				{					z=xs.x[d+n*dim]-xs.x[d+n1*dim];					z2=z2+z*z;				}				if(z2>zero) f2=f2+1./sqrt(z2); else f2=infinity;			}		}		f=f1 + f2*2./(pb.nb-1);
	}
return fabs(f-pb.objective);
  
}
//===================================================
struct problem problemDef(int functionCode, FILE *fLandscape)
{
	int d;	int dim;
	struct problem pb;
	float z;
	
	pb.function=functionCode;	
	pb.epsilon = 0.000;	//0.0001 Acceptable error
	pb.objective = 0;       // Objective value

	
	// Define the solution point, for test
	// NEEDED when param.stop = 2 
	// i.e. when stop criterion is distance_to_solution < epsilon
	for (d=0; d<30;d++)
	{
		pb.solution.x[d]=0;
	}
	
	
	// ------------------ Search space
	switch (pb.function)
	{   
		#include "cec2005pb.c"		case 0:			// Parabola
		pb.SS.D =30;// 30 	// Dimension

		for (d = 0; d < pb.SS.D; d++)
		{   
			pb.SS.min[d] = -100; // -100
			pb.SS.max[d] = 100;	// 100
			pb.SS.q.q[d] = 0;	// granularity/quantum/step   1 => integer  			pb.SS.maxS[d]=pb.SS.max[d];			pb.SS.minS[d]=pb.SS.min[d]; 
		 }
				
		pb.evalMax = 6000;// 6000	// Max number of evaluations for each run
		break;
				
		case 1:		// Griewank
		pb.SS.D = 30;	// 30   
	
		 // Boundaries
		 for (d = 0; d < pb.SS.D; d++) 
		 {	
				pb.SS.min[d] = -100; // -100
				pb.SS.max[d] = 100; // 100
				pb.SS.q.q[d] = 0;			pb.SS.maxS[d]=pb.SS.max[d];			pb.SS.minS[d]=pb.SS.min[d]; 
			}
				
		pb.evalMax = 9000;	  // 9000  
		break;
				
		case 2:		// Rosenbrock
		pb.SS.D = 2;	// 30
				
					// Boundaries
		for (d = 0; d < pb.SS.D; d++)
		{	
			pb.SS.min[d] = -10; pb.SS.max[d] = 10; // 10			
			pb.SS.q.q[d] = 0;			pb.SS.maxS[d]=pb.SS.max[d];			pb.SS.minS[d]=pb.SS.min[d]; 	      
		}
				
		pb.evalMax =100; // 40000	    
		break;
				
		case 3:		// Rastrigin
		pb.SS.D = 30;	//30
			// Boundaries
			for (d = 0; d < pb.SS.D; d++)
			{
				pb.SS.min[d] =-10; //-10; 
				pb.SS.max[d] =10; //10; 	  
				pb.SS.q.q[d] = 0;				pb.SS.maxS[d]=pb.SS.max[d];			pb.SS.minS[d]=pb.SS.min[d]; 
			}
			pb.evalMax = 40000; // 40000	
		break;

	
		case 4:		// Tripod
		pb.SS.D = 2;	// 2
	
					// Boundaries
		for (d = 0; d < pb.SS.D; d++)
		{
			pb.SS.min[d] = -100; // -100
			pb.SS.max[d] = 100; // 100
			pb.SS.q.q[d] = 0;				pb.SS.maxS[d]=pb.SS.max[d];			pb.SS.minS[d]=pb.SS.min[d]; 
		 }
		pb.epsilon=0.0001;		
		pb.evalMax = 10000; // 10000	    
		break;

		case 5: // Ackley
		pb.SS.D = 30;	// Dimension

		// Boundaries
		for (d = 0; d < pb.SS.D; d++)
		{
			pb.SS.min[d] = -32; // -32
			pb.SS.max[d] = 32; // 32
			pb.SS.q.q[d] = 0;			pb.SS.maxS[d]=pb.SS.max[d];			pb.SS.minS[d]=pb.SS.min[d]; 	
		 }

		pb.evalMax = 40000; // 40000		 
		break;
		
		 case 6: // Center-bias test function		pb.SS.D = 1;	// Dimension <=30

		// Boundaries
		for (d = 0; d < pb.SS.D; d++)
		{
			pb.SS.min[d] = -100; // 100
			pb.SS.max[d] = 100; // 100
			pb.SS.q.q[d] = 0;			pb.SS.minS[d]=-105;			pb.SS.maxS[d]=105; 	
		 }

		pb.evalMax = 100; //		pb.epsilon=0.00; 
		break;		case 7: // Pressure vessel						// Solution: (1.125, 0.625, 58.2901, 43.6927) => 7197.729						// Solution: (1.125, 0.625, 55.8592, 57.7315) => 7197.729		pb.SS.D=4;					pb.SS.min[0] = 1.125; pb.SS.max[0] = 12.5; pb.SS.q.q[0] = 0.0625;			pb.SS.min[1] = 0.625; pb.SS.max[1] = 12.5; pb.SS.q.q[1] = 0.0625;			pb.SS.min[2] = 0.00000001; pb.SS.max[2] = 240; pb.SS.q.q[2] = 0;			pb.SS.min[3] = 0.00000001; pb.SS.max[3] = 240; pb.SS.q.q[3] = 0;		for (d = 0; d < pb.SS.D; d++)                  
		{			pb.SS.maxS[d]=pb.SS.max[d];			pb.SS.minS[d]=pb.SS.min[d]; 			}			pb.evalMax = 7000 ; // 51818;		pb.epsilon = 0.00001; //0.0000000001;	
		pb.objective = 7197.72893; //7197.7289277771;//pb.objective=0; 		break;		case 8 : // Compression spring (relaxed form for x3			pb.SS.D=3;					pb.SS.min[0] = 1; pb.SS.max[0] = 70; pb.SS.q.q[0] = 1;			pb.SS.min[1] = 0.6; pb.SS.max[1] = 3; pb.SS.q.q[1] = 0;			pb.SS.min[2] = 0.207; pb.SS.max[2] = 0.5; pb.SS.q.q[2] = 0.001;		for (d = 0; d < pb.SS.D; d++)                  
		{			pb.SS.maxS[d]=pb.SS.max[d];			pb.SS.minS[d]=pb.SS.min[d]; 			}			pb.evalMax = 24000 ; // 12500		pb.epsilon = 0.000001;	
		pb.objective = 2.625421; //pb.objective=0;		break;

	case 99: // Test
	pb.SS.D = 1;	// Dimension

		// Boundaries
		for (d = 0; d < pb.SS.D; d++)
		{
			pb.SS.min[d] = 0;
			pb.SS.max[d] = 100;
			pb.SS.q.q[d] = 0;			pb.SS.maxS[d]=pb.SS.max[d];			pb.SS.minS[d]=pb.SS.min[d]; 	
		 }

		pb.evalMax = 500;		 
		break;	

		case 1000: // Landscape on the file fLandscape.txt
								// WARNING. Just valid for 1D function
			pb.SS.D = 1;	// Dimension
			fscanf(fLandscape,"%i",&funct.N);

			pb.SS.min[0] = infinity;
			pb.SS.max[0] = -infinity;
			pb.SS.q.q[0] = 1;			pb.SS.maxS[0]=pb.SS.max[0];			pb.SS.minS[0]=pb.SS.min[0]; 

			for(d=0;d<funct.N;d++)
			{
				fscanf(fLandscape,"%f",&z);funct.x[d]=z;
				if(z<pb.SS.min[0]) pb.SS.min[0]=z;
				if(z>pb.SS.max[0]) pb.SS.max[0]=z;

				fscanf(fLandscape,"%f",&z);funct.fx[d]=z;
			}
		pb.evalMax = 100;
		break;				case -1: // Trying to find a "good" repartition of N points in a D-space		case -2:		dim=30; // Dimension of the _future search space		pb.nb=(int) (10 + 2 * sqrt(dim)); // Nb of positions		pb.SS.D = dim*pb.nb;	// Dimension_of_the space*Nb_of_positions

		// Boundaries
		for (d = 0; d < pb.SS.D; d++)
		{
			pb.SS.min[d] = 0;
			pb.SS.max[d] = 1;
			pb.SS.q.q[d] = 0;			pb.SS.maxS[d]=pb.SS.max[d];			pb.SS.minS[d]=pb.SS.min[d]; 		
		 }

		pb.evalMax = 100000*dim;		pb.epsilon = 0.000;	
		pb.objective = 0;   		 
		break;	

	}
		
	pb.SS.q.size = pb.SS.D;
	return pb;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -