00001 #include <ecf/ECF.h>
00002 #include "FunctionMinEvalOp.h"
00003
00004
00005 void FunctionMinEvalOp::registerParameters(StateP state)
00006 {
00007 state->getRegistry()->registerEntry("function", (voidP) (new uint(1)), ECF::UINT);
00008 }
00009
00010
00011 bool FunctionMinEvalOp::initialize(StateP state)
00012 {
00013 voidP sptr = state->getRegistry()->getEntry("function");
00014 iFunction_ = *((uint*) sptr.get());
00015
00016 return true;
00017 }
00018
00019
00020 FitnessP FunctionMinEvalOp::evaluate(IndividualP individual)
00021 {
00022
00023
00024 FitnessP fitness (new FitnessMin);
00025
00026
00027 FloatingPoint::FloatingPoint* gen = (FloatingPoint::FloatingPoint*) individual->getGenotype().get();
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 double realTemp = 0, value = 0;
00038
00039 switch(iFunction_) {
00040 case 1:
00041 for (uint i = 0; i < gen->realValue.size(); i++){
00042 realTemp = pow((gen->realValue[i] - (i + 1)), 2.);
00043 value += realTemp;
00044 }
00045 break;
00046
00047
00048 case 2: {
00049 double z = 0;
00050 for(uint i = 0; i < gen->realValue.size(); ++i) {
00051 z += (gen->realValue[i] * gen->realValue[i]);
00052 }
00053 value = 0.5 - (pow(sin(sqrt(z)), 2) - 0.5) / pow(1 + 0.001 * z, 2);
00054 value = -1 * value + 1;
00055 } break;
00056
00057
00058 case 3: {
00059 double valueSum = 0, valueProduct = 1, realSum = 0, realProduct = 0;
00060 for (uint i = 0; i < gen->realValue.size(); i++){
00061 realSum = pow(gen->realValue[i], 2.)/4000;
00062 valueSum += realSum;
00063 realProduct = cos(gen->realValue[i] / sqrt((double)(i+1)));
00064 valueProduct *= realProduct;
00065 }
00066 value = valueSum - valueProduct + 1;
00067 } break;
00068
00069
00070 case 4: {
00071 double realSum = 0, valueSum = 0, realCos = 0, valueCos = 0, pi = 3.141592;
00072 for (uint i = 0; i < gen->realValue.size(); i++){
00073 realSum = pow(gen->realValue[i], 2.);
00074 valueSum += realSum;
00075 realCos = cos (2 * pi * gen->realValue[i]);
00076 valueCos += realCos;
00077 }
00078 value = -20 * exp(-0.2*sqrt(valueSum / gen->realValue.size())) - exp(valueCos / gen->realValue.size()) + 20 + exp(1.);
00079 } break;
00080
00081
00082 case 5: {
00083 double realTemp = 0, pi = 3.141592;
00084 for (uint i = 0; i < gen->realValue.size(); i++) {
00085 realTemp = pow(gen->realValue[i], 2.) - 10 * cos(2 * pi * gen->realValue[i]);
00086 value += realTemp;
00087 }
00088 value = value + 10 * gen->realValue.size();
00089 } break;
00090
00091
00092 case 6: {
00093 double realTemp = 0;
00094 for (uint i = 0; i < gen->realValue.size() - 1; i++){
00095 realTemp = 100 * pow(gen->realValue[i + 1] - pow(gen->realValue[i], 2.), 2.) + pow(1 - gen->realValue[i], 2.);
00096 value += realTemp;
00097 }
00098 } break;
00099
00100
00101 case 7: {
00102 double z = 0;
00103 for(uint i = 0; i < gen->realValue.size(); ++i) {
00104 z += (gen->realValue[i] * gen->realValue[i]);
00105 }
00106 value = pow(z, 0.25) * (1.0 + pow( sin( 50 * pow(z, 0.1)), 2));
00107 } break;
00108
00109 default:
00110 throw("FunctionMinEvalOp: invalid function index in configuration!");
00111 }
00112
00113 fitness->setValue(value);
00114 return fitness;
00115 }