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

D:/Projekt/ECF_trunk/ECF/binary/BinaryMutMix.cpp

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     // make sure indexSmaller < indexBigger
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     // count 1's and 0's
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     // mix bits in [indexSmaller, indexBigger]
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 }

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