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