00001 00002 #include "benchmark.h" 00003 #include "data.h" 00004 00005 #include <stdio.h> 00006 #include <stdlib.h> 00007 #include <limits.h> 00008 00009 static double pi; 00010 static double e; 00011 00012 double eval_func(int func_number , int dim , double* x){ 00013 00014 pi = acos(-1.0); 00015 e = exp(1.0); 00016 00017 if(dim>1000) dim = 1000; 00018 00019 switch(func_number){ 00020 case 1 : return Shifted_Sphere(dim , x ); 00021 break; 00022 case 2 : return Schwefel_Problem(dim , x ); 00023 break; 00024 case 3 : return Shifted_Rosenbrock(dim , x ); 00025 break; 00026 case 4 : return Shifted_Rastrigin(dim , x ); 00027 break; 00028 case 5 : return Shifted_Griewank(dim , x ); 00029 break; 00030 case 6 : return Shifted_Ackley(dim , x ); 00031 break; 00032 default : 00033 printf("Error : Function number out of range\n"); 00034 exit(0); 00035 break; 00036 } 00037 } 00038 00039 double Shifted_Sphere( int dim , double* x ){ 00040 int i; 00041 double z; 00042 double F = 0; 00043 for(i=0;i<dim;i++){ 00044 z = x[i] - sphere[i]; 00045 F += z*z; 00046 } 00047 return F + f_bias[0]; 00048 } 00049 00050 double Schwefel_Problem( int dim , double* x ){ 00051 int i; 00052 double z; 00053 double F = abss(x[0]); 00054 for(i=1;i<dim;i++){ 00055 z = x[i] - schwefel[i]; 00056 F = max(F , abss(z)); 00057 } 00058 return F + f_bias[1]; 00059 } 00060 00061 double Shifted_Rosenbrock( int dim , double* x ){ 00062 int i; 00063 double z[dim]; 00064 double F = 0; 00065 00066 for(i=0;i<dim;i++) z[i] = x[i] - rosenbrock[i] + 1; 00067 00068 for(i=0;i<dim-1;i++){ 00069 F = F + 100*( pow((pow(z[i],2)-z[i+1]) , 2) ) + pow((z[i]-1) , 2); 00070 } 00071 return F + f_bias[2]; 00072 } 00073 00074 00075 double Shifted_Rastrigin( int dim , double* x ) 00076 { 00077 int i; 00078 double z; 00079 double F = 0; 00080 for(i=0;i<dim;i++){ 00081 z = x[i] - rastrigin[i]; 00082 F = F + ( pow(z,2) - 10*cos(2*pi*z) + 10); 00083 } 00084 return F + f_bias[3]; 00085 } 00086 00087 double Shifted_Griewank( int dim , double* x ){ 00088 int i; 00089 double z; 00090 double F1 = 0; 00091 double F2 = 1; 00092 for(i=0;i<dim;i++){ 00093 z = x[i] - griewank[i]; 00094 F1 = F1 + ( pow(z,2) / 4000 ); 00095 F2 = F2 * ( cos(z/sqrt(i+1))); 00096 00097 } 00098 return (F1 - F2 + 1 + f_bias[4]); 00099 } 00100 00101 double Shifted_Ackley( int dim , double* x ){ 00102 int i; 00103 double z; 00104 double Sum1 = 0; 00105 double Sum2 = 0; 00106 double F = 0; 00107 for(i=0;i<dim;i++){ 00108 z = x[i] - ackley[i]; 00109 Sum1 = Sum1 + pow(z , 2 ); 00110 Sum2 = Sum2 + cos(2*pi*z); 00111 } 00112 F = -20*exp(-0.2*sqrt(Sum1/dim)) -exp(Sum2/dim) + 20 + e + f_bias[5]; 00113 00114 return F; 00115 } 00116