class Genome{ public: Genome(){ string = 0; bits = 0; evaluated = false; genCreated = -1; } const char* toString(){ strncpy( string, "", l+64 ); for( int i = 0; i < l; i ++ ) string[i] = '0' + bits[i]; char s[64]; sprintf(s, " %3i ", genCreated ); strcat( string, s ); if( evaluated ){ sprintf(s, "%5.1f ", fitness ); strcat( string, s ); sprintf(s, "%5.1f", lastSlot ); strcat( string, s ); } return string; } void initialize(){ bits = new int[l]; string = new char[l+64]; } void randomize(){ for( int i = 0; i < l ; i ++ ) bits[i] = randI(); } const Genome& operator =( const Genome& rhs ){ memcpy( bits, rhs.bits, sizeof(int)*l ); fitness = rhs.fitness; evaluated = rhs.evaluated; genCreated = rhs.genCreated; } void setFitness( float f, float& fitnessTotal ){ this->fitness = f; this->evaluated = true; this->genCreated = gen; fitnessTotal += fitness; this->lastSlot = fitnessTotal; } bool needsEvaluation(){ return !evaluated; } void crossover( Genome& rhs ){ roll( crossoverProb ){ int from = randI( 0, l-1 ); for( int i = from; i < l; i ++ ){ if( bits[i] != rhs.bits[i] ){ int t = bits[i]; bits[i] = rhs.bits[i]; rhs.bits[i] = t; evaluated = false; } } } } void mutate(){ for( int i = 0; i < 1; i ++ ){ roll( mutationProb ){ bits[i] = 1 - bits[i]; evaluated = false; } } } int* bits; char* string; float fitness; bool evaluated; int genCreated; float lastSlot; };