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

📄 read_benchmark.c

📁 MC clerc的tribes PSO 解决TSP问题!
💻 C
字号:
 // ----------------------------------------------------------------------------- READ_BENCHMARK
void read_benchmark(FILE *f_problem, int funct, int D)
{
int				d;
int				dim[3]={10,30,50}; // The three possible matrix dimension for benchmark
int				i,j,k;
int               m;
int               MM;
long double		z;
long double		zt[1000],zi[1000];

printf("\n-----------\n Read benchmark data");


   // Benchmark bed. Read bias and shifts
   funct=BM;
  fscanf(f_problem, "%Lf",&z); fbias=z;
  printf("\n fbias %LE",fbias);

  m=100;
  if(funct>=15) m=1000; // For 10-hybrid functions

  if(funct!=12)
  {
	for(d = 0; d < m; d++)
	{fscanf(f_problem, "%Lf",&z); fshift[d]=z;}
  }

 
  if(funct==5)
  {	
	  j=(int)ceil((double)D/4);
	  for(d=1;d<=j;d++) fshift[d-1]=-100;
	j=(int)((double)(3*D)/4);
	for(d=j;d<=D;d++) fshift[d-1]=100;	
  }

  if(funct==8)
  {	
	  for(d=1;d<=D/2;d++) fshift[2*d-2]=-32;
  }

  //------------------
  read_M=0; // Flag for linear transformation (matrix) or not
  if(funct==3) read_M=1;
  if(funct==5) // Read a matrix 100x100
  {
	  read_M=2; 
	 MM=100;
	for(d = 0; d < MM; d++)
		for(m = 0; m <MM ; m++)
		{
			fscanf(f_problem, "%Lf",&z); M[d][m]=z; // Matrix A
		}

	goto end;
  }
  if(funct==7) read_M=1;
  if(funct==8) read_M=1;
  if(funct==10) read_M=1;
  if(funct==11) read_M=1;
 if(funct==12) // Read two matrices 100x100 and vector alpha
 {
	 read_M=2;
	 MM=100;
	for(d = 0; d < MM; d++)
		for(m = 0; m <MM ; m++)
		{
			fscanf(f_problem, "%Lf",&z); M[d][m]=z; // Matrix A
		}
//printf("\n %f ",M[0][0]);

	for(d = 0; d < MM; d++)
		for(m = 0; m <MM; m++)
		{
			fscanf(f_problem, "%Lf",&z); M2[d][m]=z; // Matrix B
		}


  for(d = 0; d < MM; d++) // alpha
  {
	 fscanf(f_problem, "%Lf",&z); fshift[d]=z;
  }

	goto end;
 }

  if(funct==14) read_M=1;

  // Define lambda and sigma line
	if(funct>=15 && funct<=17) BM_h=0;
	if(funct==18) BM_h=1;
	if(funct==19) BM_h=2;
	if(funct==20) BM_h=1;
	if(funct>=21 && funct<=23) BM_h=3;
	if(funct>=24 && funct<=25) BM_h=4;


  if(funct>=16)
  {	 
	  read_M=0; // Matrices will be used differently (see benchmark.c)
	 // 10 matrices 10x10
	for(k=0;k<10;k++)
		for(d = 0; d < 10; d++)
			for(m = 0; m <10 ; m++)
			{
				fscanf(f_problem, "%Lf",&z); MH[k][d][m]=z;
			}

	if(D<=10) goto scale;

	 // 10 matrices 30x30
	for(k=0;k<10;k++)
		for(d = 0; d < 30; d++)
			for(m = 0; m <30 ; m++)
				fscanf(f_problem, "%Lf",&z); MH[k][d][m]=z;

	if(D<=30) goto scale;

	// 10 matrices 50x50
	for(k=0;k<10;k++)
	for(d = 0; d < 50; d++)
		for(m = 0; m <50 ; m++)
			fscanf(f_problem, "%Lf",&z); MH[k][d][m]=z;
  }

scale:
	// Prepare weighting	
	if(funct>=15)  
	{	
		for (i=0;i<10;i++) // For each function
		{
			j=100*i;
			for(d=0;d<D;d++) zt[j+d]=5./BM_lambda[BM_h][i];
		}
	}

	if(funct>15)
	{
		for(d=0;d<1000;d++) zi[d]=zt[d]; // Temporary copy
		for (k=0;k<10;k++) // For each function
		{
			j=100*k; 
			for (d=0;d<D;d++) 
			{		
				zt[d+j]=0;
				for (i=0;i<D;i++) zt[j+d]=zt[j+d]+zi[j+i]*MH[k][i][d];
			}
		}
	}


	if(funct>=15 && funct<=17)
	{
		BM_fit[0]=rastrigin(D,zt,0);		BM_fit[1]=rastrigin(D,zt,100);
		BM_fit[2]=weierstrass(D,zt,200);	BM_fit[3]=weierstrass(D,zt,300);
		BM_fit[4]=griewank(D,zt,400);		BM_fit[5]=griewank(D,zt,500);
		BM_fit[6]=ackley(D,zt,600);			BM_fit[7]=ackley(D,zt,700);
		BM_fit[8]=sphere(D,zt,800);			BM_fit[9]=sphere(D,zt,900);
	}


	if(funct>=18 && funct<=20)
	{
		BM_fit[0]=ackley(D,zt,0);			BM_fit[1]=ackley(D,zt,100);
		BM_fit[2]=rastrigin(D,zt,200);		BM_fit[3]=rastrigin(D,zt,300);
		BM_fit[4]=sphere(D,zt,400);			BM_fit[5]=sphere(D,zt,500);
		BM_fit[6]=weierstrass(D,zt,600);	BM_fit[7]=weierstrass(D,zt,700);
		BM_fit[8]=griewank(D,zt,800);		BM_fit[9]=griewank(D,zt,900);

	}



	if(funct>=15) 		for(i=0;i<10;i++) BM_fit[i]=BM_C/BM_fit[i];




  if(read_M==0) goto end;

    // Read linear transformation matrix M
  // On the data file, there are 3 matrices
  // 10x10, 30x30 and 50x50

  j=0;
read_M:
	for(d = 0; d < dim[j]; d++)
	{
	    for(m = 0; m <dim[j] ; m++)
		{
		 fscanf(f_problem, "%Lf",&z); M[d][m]=z;
		}
	}

	if(D>dim[j]) {j=j+1; goto read_M;}

end:
	printf("\n Benchmark data have been read");
}

⌨️ 快捷键说明

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