00001
00020
00021
00022 # include <stdio.h>
00023 # include <stdlib.h>
00024 # include <math.h>
00025
00026 # include "global.h"
00027 # include "sub.h"
00028 # include "rand.h"
00029
00030
00031 long double calc_ackley (long double *x)
00032 {
00033 int i;
00034 long double sum1, sum2, res;
00035 sum1 = 0.0;
00036 sum2 = 0.0;
00037 for (i=0; i<nreal; i++)
00038 {
00039 sum1 += x[i]*x[i];
00040 sum2 += cos(2.0*PI*x[i]);
00041 }
00042 sum1 = -0.2*sqrt(sum1/nreal);
00043 sum2 /= nreal;
00044 res = 20.0 + E - 20.0*exp(sum1) - exp(sum2);
00045 return (res);
00046 }
00047
00048
00049 long double calc_rastrigin (long double *x)
00050 {
00051 int i;
00052 long double res;
00053 res = 0.0;
00054 for (i=0; i<nreal; i++)
00055 {
00056 res += (x[i]*x[i] - 10.0*cos(2.0*PI*x[i]) + 10.0);
00057 }
00058 return (res);
00059 }
00060
00061
00062 long double calc_weierstrass (long double *x)
00063 {
00064 int i, j;
00065 long double res;
00066 long double sum;
00067 long double a, b;
00068 int k_max;
00069 a = 0.5;
00070 b = 3.0;
00071 k_max = 20;
00072 res = 0.0;
00073 for (i=0; i<nreal; i++)
00074 {
00075 sum = 0.0;
00076 for (j=0; j<=k_max; j++)
00077 {
00078 sum += pow(a,j)*cos(2.0*PI*pow(b,j)*(x[i]+0.5));
00079 }
00080 res += sum;
00081 }
00082 return (res);
00083 }
00084
00085
00086 long double calc_griewank (long double *x)
00087 {
00088 int i;
00089 long double s, p;
00090 long double res;
00091 s = 0.0;
00092 p = 1.0;
00093 for (i=0; i<nreal; i++)
00094 {
00095 s += x[i]*x[i];
00096 p *= cos(x[i]/sqrt(1.0+i));
00097 }
00098 res = 1.0 + s/4000.0 - p;
00099 return (res);
00100 }
00101
00102
00103 long double calc_sphere (long double *x)
00104 {
00105 int i;
00106 long double res;
00107 res = 0.0;
00108 for (i=0; i<nreal; i++)
00109 {
00110 res += x[i]*x[i];
00111 }
00112 return (res);
00113 }
00114
00115
00116 long double calc_schwefel (long double *x)
00117 {
00118 int i, j;
00119 long double sum1, sum2;
00120 sum1 = 0.0;
00121 for (i=0; i<nreal; i++)
00122 {
00123 sum2 = 0.0;
00124 for (j=0; j<=i; j++)
00125 {
00126 sum2 += x[j];
00127 }
00128 sum1 += sum2*sum2;
00129 }
00130 return (sum1);
00131 }
00132
00133
00134 long double calc_rosenbrock (long double *x)
00135 {
00136 int i;
00137 long double res;
00138 res = 0.0;
00139 for (i=0; i<nreal-1; i++)
00140 {
00141 res += 100.0*pow((x[i]*x[i]-x[i+1]),2.0) + 1.0*pow((x[i]-1.0),2.0);
00142 }
00143 return (res);
00144 }
00145
00146
00147 long double nc_schaffer (long double x, long double y)
00148 {
00149 int i;
00150 int a;
00151 long double b;
00152 long double res;
00153 long double temp1, temp2;
00154 long double t1[2], t2[2];
00155 t1[0] = x;
00156 t1[1] = y;
00157 for (i=0; i<2; i++)
00158 {
00159 if (fabs(t1[i]) >= 0.5)
00160 {
00161 res = 2.0*t1[i];
00162
00163 a = (int) res;
00164 b = fabs(res-a);
00165 if (b<0.5)
00166 {
00167 t2[i] = a/2.0;
00168 }
00169 else
00170 {
00171 if (res<=0.0)
00172 {
00173 t2[i] = (a-1.0)/2.0;
00174 }
00175 else
00176 {
00177 t2[i] = (a+1.0)/2.0;
00178 }
00179 }
00180 }
00181 else
00182 {
00183 t2[i] = t1[i];
00184 }
00185 }
00186 temp1 = pow((sin(sqrt(pow(t2[0],2.0)+pow(t2[1],2.0)))),2.0);
00187 temp2 = 1.0 + 0.001*(pow(t2[0],2.0)+pow(t2[1],2.0));
00188 res = 0.5 + (temp1-0.5)/(pow(temp2,2.0));
00189 return (res);
00190 }
00191
00192
00193 long double nc_rastrigin (long double *x)
00194 {
00195 int i;
00196 int a;
00197 long double b;
00198 long double res;
00199 for (i=0; i<nreal; i++)
00200 {
00201 if (fabs(x[i]) >= 0.5)
00202 {
00203 res = 2.0*x[i];
00204
00205 a = (int) res;
00206 b = fabs(res-a);
00207 if (b<0.5)
00208 {
00209 temp_x4[i] = a/2.0;
00210 }
00211 else
00212 {
00213 if (res<=0.0)
00214 {
00215 temp_x4[i] = (a-1.0)/2.0;
00216 }
00217 else
00218 {
00219 temp_x4[i] = (a+1.0)/2.0;
00220 }
00221 }
00222 }
00223 else
00224 {
00225 temp_x4[i] = x[i];
00226 }
00227 }
00228 res = 0.0;
00229 for (i=0; i<nreal; i++)
00230 {
00231 res += (temp_x4[i]*temp_x4[i] - 10.0*cos(2.0*PI*temp_x4[i]) + 10.0);
00232 }
00233 return (res);
00234 }