00001 #include "../ECF_base.h"
00002 #include "FloatingPoint.h"
00003
00004
00005 namespace FloatingPoint
00006 {
00007
00008 void FloatingPointCrsBlx::registerParameters(StateP state)
00009 {
00010 myGenotype_->registerParameter(state, "crx.blx", (voidP) new double(0), ECF::DOUBLE);
00011 }
00012
00013
00014 bool FloatingPointCrsBlx::initialize(StateP state)
00015 {
00016 voidP sptr = myGenotype_->getParameterValue(state, "crx.blx");
00017 probability_ = *((double*)sptr.get());
00018 return true;
00019 }
00020
00021
00022 bool FloatingPointCrsBlx::mate(GenotypeP gen1, GenotypeP gen2, GenotypeP child)
00023 {
00024 FloatingPoint* p1 = (FloatingPoint*) (gen1.get());
00025 FloatingPoint* p2 = (FloatingPoint*) (gen2.get());
00026 FloatingPoint* ch = (FloatingPoint*) (child.get());
00027
00028 double min1, max1, min2, max2, min, max, a, b, I;
00029
00030 min1 = p1->realValue[0];
00031 max1 = p1->realValue[0];
00032 min2 = p2->realValue[0];
00033 max2 = p2->realValue[0];
00034 for (uint i = 1; i < p1->realValue.size(); i++) {
00035 if (p1->realValue[i] < min1)
00036 min1 = p1->realValue[i];
00037 if (p1->realValue[i] > max1)
00038 max1 = p1->realValue[i];
00039
00040 if (p2->realValue[i] < min2)
00041 min2 = p2->realValue[i];
00042 if (p2->realValue[i] > max2)
00043 max2 = p2->realValue[i];
00044 }
00045 min = (min1 < min2)?min1:min2;
00046 max = (max1 > max2)?max1:max2;
00047 b = state_->getRandomizer()->getRandomDouble();
00048 I = max - min;
00049 min = min - I*b;
00050 max = max + I*b;
00051 for (uint i = 1; i < p1->realValue.size(); i++) {
00052 a = state_->getRandomizer()->getRandomDouble();
00053 a = min + a*(max-min);
00054 ch->realValue[i] = a;
00055 }
00056
00057 return true;
00058 }
00059
00060 }