📄 main.c
字号:
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 + -