Chromosome* Chromosome::ArithmeticCrossoverWithChromosome(Chromosome* Mutator) { //srand( (unsigned)time(0) ); srand should have been called already bool bAnd = (rand() &1); //0 doesn't really matter, updating weights anyway Chromosome* ret = new Chromosome(0); if (bAnd) { for (int i = 0; i < NUM_EVALNODES; i++) { int newWeighting = (Weightings[i] & Mutator->GetWeighting(i)); ret->SetWeighting(i, newWeighting); } } else { for (int i = 0; i < NUM_EVALNODES; i++) { int newWeighting = (Weightings[i] | Mutator->GetWeighting(i)); ret->SetWeighting(i, newWeighting); } } return ret; }
Chromosome* Chromosome::MultiplePointCrossoverWithChromosome(Chromosome* Mutator) { //srand( (unsigned)time(0) ); srand should have been called already Chromosome* ret = new Chromosome(10); // NEED NUM HERE for (int i = 0; i < NUM_EVALNODES; i++) { //In single point crossover, we select a random point //Before the random point, take from A, take rest from B int random_integer1 = (rand() %10); //32 bit integer int random_integer2 = (rand() %10); while (random_integer1 == random_integer2) random_integer2 = (rand() % 10); int mask = 1; //if (random_integer1 > random_integer2) { for (int j = 0 ; j < abs(random_integer1-random_integer2); j++) { mask = mask<<1; mask |= 1; } int nextShift = ((random_integer2 > random_integer1) ? random_integer1 : random_integer2); mask = mask << nextShift; } int newWeighting = (Weightings[i]&mask) | (Mutator->GetWeighting(i)& ~mask); ret->SetWeighting(i, newWeighting); } return ret; }
Chromosome* Chromosome::SinglePointCrossoverWithChromosome(Chromosome* Mutator) { //srand( (unsigned)time(0) ); srand should have been called already Chromosome* ret = new Chromosome(10); // NEED NUM HERE for (int i = 0; i < NUM_EVALNODES; i++) { //In single point crossover, we select a random point //Before the random point, take from A, take rest from B int random_integer = (rand() %10); //32 bit integer int mask = 1; for (int j = 0 ; j < random_integer; j++) { mask = mask<<1; mask |= 1; } int newWeighting = (Weightings[i]&mask) | (Mutator->GetWeighting(i)& ~mask); ret->SetWeighting(i, newWeighting); } return ret; }
Chromosome* Chromosome::UniformPointCrossoverWithChromosome(Chromosome* Mutator) { Chromosome* ret = new Chromosome(10); for (int i = 0 ;i < NUM_EVALNODES; i++) { int Weighting = 0; int currMutatorWeighting = Mutator->GetWeighting(i); for (int j = 0; j < 32; j++) //32 bits in an int { int mask = 1 << j; bool bOne = (rand() &1); if (bOne) { Weighting |= mask & Weightings[i]; } else { Weighting |= mask & currMutatorWeighting; } } ret->SetWeighting(i, Weighting); } return ret; }