00001 #include "../ECF_base.h"
00002 #include "Binary.h"
00003
00004 namespace Binary
00005 {
00006
00007 void BinaryMutMix::registerParameters(StateP state)
00008 {
00009 myGenotype_->registerParameter(state, "mut.mix", (voidP) new double(0), ECF::DOUBLE);
00010 }
00011
00012
00013 bool BinaryMutMix::initialize(StateP state)
00014 {
00015 voidP sptr = myGenotype_->getParameterValue(state, "mut.mix");
00016 probability_ = *((double*)sptr.get());
00017 return true;
00018 }
00019
00020
00021 bool BinaryMutMix::mutate(GenotypeP gene)
00022 {
00023 Binary* bin = (Binary*) (gene.get());
00024
00025 uint dimension = state_->getRandomizer()->getRandomInteger((uint) bin->variables.size());
00026
00027
00028 uint bitIndexSmaller = state_->getRandomizer()->getRandomInteger((uint) bin->getNumBits());
00029 uint bitIndexBigger;
00030 do {
00031 bitIndexBigger = state_->getRandomizer()->getRandomInteger((uint) bin->getNumBits());
00032 }while(bitIndexBigger == bitIndexSmaller);
00033
00034 uint tmp = bitIndexSmaller;
00035 if(bitIndexSmaller > bitIndexBigger) {
00036 bitIndexSmaller = bitIndexBigger;
00037 bitIndexBigger = tmp;
00038 }
00039
00040
00041 int counter0 = 0;
00042 int counter1 = 0;
00043
00044 for(uint i = bitIndexSmaller; i <= bitIndexBigger; i++) {
00045 if(bin->variables[dimension][i]) counter1++;
00046 else counter0++;
00047 }
00048
00049 int fairness0 = counter0;
00050 int fairness1 = counter1;
00051
00052
00053 for(uint i = bitIndexSmaller; i <= bitIndexBigger; i++) {
00054 int random = state_->getRandomizer()->getRandomInteger(1, fairness0 + fairness1);
00055 if(random <= fairness1) {
00056 if(counter1 > 0) {
00057 bin->variables[dimension][i] = true;
00058 counter1--;
00059 }
00060 else {
00061 bin->variables[dimension][i] = false;
00062 counter0--;
00063 }
00064 }
00065 else {
00066 if(counter0 > 0) {
00067 bin->variables[dimension][i] = false;
00068 counter0--;
00069 }
00070 else {
00071 bin->variables[dimension][i] = true;
00072 counter1--;
00073 }
00074 }
00075 }
00076
00077 bin->update();
00078
00079 return true;
00080 }
00081
00082 }