00001
00020 #include "problemsoft.h"
00021 #include <realea/common/real.h>
00022 #include <limits>
00023 #include "benchmark.h"
00024 #include <cstdlib>
00025 #include <cstdio>
00026 #include "funsoft.h"
00027
00028 using namespace realea;
00029
00030 tFitness eval_softcomputing(const tGen *x, int dim);
00031
00032 static unsigned m_fun;
00033 static tFitness m_optime;
00034
00035 ProblemSoftComputing::ProblemSoftComputing(unsigned int dim) {
00036 if (dim > 1000) {
00037 dim = 1000;
00038 }
00039
00040 m_ndim = dim;
00041 }
00042
00043 ProblemSoftComputing::~ProblemSoftComputing(void) {
00044 }
00045
00046
00047 tFitness eval_softcomputing(const tGen *s, int dim) {
00048 double x[dim];
00049 tFitness result;
00050
00051 for (int i = 0; i < dim; i++) {
00052 x[i] = s[i];
00053 }
00054
00055 if (m_fun == 1) {
00056 result=Shifted_Sphere(dim, (const double *) x)-m_optime;
00057 }
00058 else if (m_fun == 2) {
00059 result=Schwefel_Problem(dim, (const double *)x)-m_optime;
00060 }
00061 else if (m_fun == 3) {
00062 result=Shifted_Rosenbrock(dim, (const double *) x)-m_optime;
00063 }
00064 else if (m_fun == 4) {
00065 result=Shifted_Rastrigin(dim, (const double *) x)-m_optime;
00066 }
00067 else if (m_fun == 5) {
00068 result=Shifted_Griewank(dim, (const double *) x)-m_optime;
00069 }
00070 else if (m_fun == 6) {
00071 result=Shifted_Ackley(dim, (const double *) x)-m_optime;
00072 }
00073 else if (m_fun == 7) {
00074
00075 result=f_Schwefel2_22(dim, x);
00076 }
00077 else if (m_fun == 8) {
00078 result=f_Schwefel1_2(dim, x);
00079 }
00080 else if (m_fun == 9) {
00081 result=Extended_f_10(dim, x);
00082 }
00083 else if (m_fun == 10) {
00084 result=f_Bohachevsky(dim, x);
00085 }
00086 else if (m_fun == 11) {
00087 result=f_Schaffer(dim, x);
00088 }
00089 else if (m_fun == 12) {
00090 result=f_Hybrid_12(dim, x);
00091 }
00092 else if (m_fun == 13) {
00093 result=f_Hybrid_13(dim, x);
00094 }
00095 else if (m_fun == 14) {
00096 result=f_Hybrid_14(dim, x);
00097 }
00098 else if (m_fun == 15) {
00099 result=f_Hybrid_15(dim, x);
00100 }
00101 else if (m_fun == 16) {
00102 result=f_Hybrid_16new(dim, x);
00103 }
00104 else if (m_fun == 17) {
00105 result=f_Hybrid_17new(dim, x);
00106 }
00107 else if (m_fun == 18) {
00108 result=f_Hybrid_18new(dim, x);
00109 }
00110 else if (m_fun == 19) {
00111 result=f_Hybrid_19new(dim, x);
00112 }
00113 else {
00114 fprintf(stderr, "Error: fun no valido\n");
00115 exit(1);
00116 }
00117
00118
00119
00120
00121
00122
00123
00124 return result;
00125 }
00126
00127 ProblemPtr ProblemSoftComputing::get(unsigned int fun) {
00128 string name;
00129 double min, max, optime;
00130
00131 m_fun = fun;
00132
00133 optime = 0;
00134
00135 if (fun == 1) {
00136 min = -100; max = 100;
00137 optime = -450;
00138 }
00139 else if (fun == 2) {
00140 min = -100; max = 100;
00141 optime = -450;
00142 }
00143 else if (fun == 3) {
00144 min = -100; max = 100;
00145 optime = 390;
00146 }
00147 else if (fun == 4) {
00148 min = -5; max = 5;
00149 optime = -330;
00150 }
00151 else if (fun == 5) {
00152 min = -600; max = 600;
00153 optime = -180;
00154 }
00155 else if (fun == 6) {
00156 min = -32; max = 32;
00157 optime = -140;
00158 }
00159 else if (fun == 7) {
00160 min = -10; max = 10;
00161 }
00162 else if (fun == 8) {
00163 min = -65.536; max = 65.536;
00164 }
00165 else if (fun == 9) {
00166 min = -10; max = 10;
00167 }
00168 else if (fun == 10) {
00169 min = -15; max = 15;
00170 }
00171 else if (fun == 11) {
00172 min = -100; max = 100;
00173 }
00174 else if (fun == 10) {
00175 min = -15; max = 15;
00176 }
00177 else if (fun == 11) {
00178 min = -100; max = 100;
00179 }
00180 else if (fun == 12 || fun == 13 || fun == 16 || fun == 18 || fun == 19) {
00181 min = -100; max = 100;
00182 }
00183 else if (fun == 14 || fun == 20) {
00184 min = -5; max = 5;
00185 }
00186 else if (fun == 15 || fun == 21) {
00187 min = -10; max = 10;
00188 }
00189 else if (fun == 17) {
00190 min = -100; max = 100;
00191 }
00192 else {
00193 fprintf(stderr, "Error[domain]: fun no valido\n");
00194 exit(1);
00195 }
00196
00197
00198 ProblemPtr prob (new Problem());
00199 prob->setDimension(m_ndim);
00200
00201 for (unsigned i = 0; i < m_ndim; ++i) {
00202 prob->setDomainValues(i, min, max, true);
00203 }
00204
00205 m_optime = optime;
00206
00207 prob->setOptimize(0, 0);
00208 prob->setMaxEval(5000*m_ndim);
00209 prob->setMinimize();
00210
00211
00212 prob->setEval(eval_softcomputing);
00213 return prob;
00214 }