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

D:/Projekt/ECF_trunk/ECF/bitstring/BitStringMutMix.cpp

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     // determine random left and right bit bound
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     // make sure smaller < bigger
00042     uint tmp = bitIndexSmaller;
00043     if (bitIndexSmaller > bitIndexBigger) {
00044       bitIndexSmaller = bitIndexBigger;
00045       bitIndexBigger = tmp;
00046     }
00047 
00048     // count zeros and ones in chosen segment
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     // mutate chosen segment
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 }

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