• Main Page
  • Modules
  • Classes
  • Files
  • File List

D:/Projekt/ECF_trunk/examples/FunctionMin/FunctionMinEvalOp.cpp

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"); // get parameter value
00014     iFunction_ = *((uint*) sptr.get()); // convert from voidP to user defined type
00015 
00016     return true;
00017 }
00018 
00019 
00020 FitnessP FunctionMinEvalOp::evaluate(IndividualP individual)
00021 {
00022     // evaluation creates a new fitness object using a smart pointer
00023     // in our case, we try to minimize the function value, so we use FitnessMin fitness (for minimization problems)
00024     FitnessP fitness (new FitnessMin);
00025 
00026     // we define FloatingPoint as the only genotype (in the configuration file)
00027     FloatingPoint::FloatingPoint* gen = (FloatingPoint::FloatingPoint*) individual->getGenotype().get();
00028     // (you can also use boost smart pointers:)
00029     //FloatingPointP gen = boost::dynamic_pointer_cast<FloatingPoint::FloatingPoint> (individual->getGenotype());
00030 
00031     // alternative encoding: Binary Genotype
00032     //Binary::Binary* gen = (Binary::Binary*) individual->getGenotype().get();
00033     //BinaryP gen = boost::dynamic_pointer_cast<Binary::Binary> (individual->getGenotype());
00034 
00035     // we implement the fitness function 'as is', without any translation
00036     // the number of variables is read from the genotype itself (size of 'realValue' vactor)
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     // Schaffer's F6 function
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     // Griewangk
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     // Ackley
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     // Rastrigin
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     // Rosenbrock
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     // Schaffer's F7 function
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 }

Generated on Tue Nov 4 2014 13:04:31 for ECF by  doxygen 1.7.1