00001 #include <ecf/ECF.h>
00002 #include "OneMaxEvalOp.h"
00003
00004
00005
00006 StateP state_;
00007
00008 bool OneMaxEvalOp::initialize(StateP state)
00009 {
00010 state_ = state;
00011 return true;
00012 }
00013
00014
00015 vector<IndividualP> jedinke;
00016 uint gen = 0;
00017 uint jednakihP = 0;
00018 uint jednakih = 0;
00019
00020
00021 FitnessP OneMaxEvalOp::evaluate(IndividualP individual)
00022 {
00023
00024 if(state_->getGenerationNo() != gen) {
00025 gen = state_->getGenerationNo();
00026
00027
00028
00029 ECF_LOG(state_, 1, "jednakih: " + uint2str(jednakih) + ", " + uint2str(100*jednakih/jedinke.size()));
00030
00031 jedinke.clear();
00032 jednakihP = 0;
00033 jednakih = 0;
00034 }
00035
00036
00037 uint size = (uint) jedinke.size();
00038 for(uint i = 0; i < size; i++)
00039 if(individual == jedinke[i])
00040 jednakihP++;
00041
00042
00043 BitString::BitString* nova = (BitString::BitString*) individual->getGenotype().get();
00044 for(uint i = 0; i < size; i++) {
00045 BitString::BitString* stara = (BitString::BitString*) jedinke[i]->getGenotype().get();
00046
00047 uint n, size = (uint) nova->bits.size();
00048 for(n = 0; n < size; n++) {
00049 if(nova->bits[n] != stara->bits[n])
00050 break;
00051 }
00052 if(n == size) {
00053 jednakih++;
00054
00055 break;
00056 }
00057 }
00058
00059
00060 jedinke.push_back((IndividualP) individual->copy());
00061
00062
00063
00064
00065 FitnessP fitness (new FitnessMax);
00066
00067
00068
00069 BitString::BitString* bitstr = (BitString::BitString*) individual->getGenotype().get();
00070
00071
00072
00073
00074 uint ones = 0;
00075 for(uint i = 0; i<bitstr->bits.size(); i++){
00076 if(bitstr->bits[i] == true)
00077 ones++ ;
00078 }
00079 fitness->setValue(ones);
00080
00081
00082 return fitness;
00083 }