void EnumKare::Epoch() { UpdataFitnessScores(); int NewBabies = 0; vector<SGenome> vecBabyGenomes; while (NewBabies < m_iPopSize) { SGenome mum = RouletteWheelSelection(); SGenome dad = RouletteWheelSelection(); SGenome baby1, baby2; Crossover(mum.vecBits, dad.vecBits, baby1.vecBits, baby2.vecBits); Mutate(baby1.vecBits); Mutate(baby2.vecBits); vecBabyGenomes.push_back(baby1); vecBabyGenomes.push_back(baby2); NewBabies += 2; } m_vecGenomes = vecBabyGenomes; ++m_iGeneration; }
//--------------------------------Epoch--------------------------------- // // This is the workhorse of the GA. It first updates the fitness // scores of the population then creates a new population of // genomes using the Selection, Croosover and Mutation operators // we have discussed //---------------------------------------------------------------------- void Cga::Epoch() { //Now to create a new population int NewBabies = 0; CalculateTotalFitness(); //create some storage for the baby genomes vector<SGenome> vecBabyGenomes; //Now to add a little elitism we shall add in some copies of the //fittest genomes //make sure we add an EVEN number or the roulette wheel //sampling will crash if (!(NUM_COPIES_ELITE * NUM_ELITE % 2)) { GrabNBest(NUM_ELITE, NUM_COPIES_ELITE, vecBabyGenomes); } while (vecBabyGenomes.size() < m_iPopSize) { //select 2 parents SGenome mum = RouletteWheelSelection(); SGenome dad = RouletteWheelSelection(); //operator - crossover SGenome baby1, baby2; Crossover(mum.vecBits, dad.vecBits, baby1.vecBits, baby2.vecBits); //operator - mutate Mutate(baby1.vecBits); Mutate(baby2.vecBits); //add to new population vecBabyGenomes.push_back(baby1); vecBabyGenomes.push_back(baby2); NewBabies += 2; } //copy babies back into starter population m_vecGenomes = vecBabyGenomes; //increment the generation counter ++m_iGeneration; }
//--------------------------------Epoch--------------------------------- // // This is the workhorse of the GA. It first updates the fitness // scores of the population then creates a new population of // genomes using the Selection, Croosover and Mutation operators // we have discussed //---------------------------------------------------------------------- void CgaBob::Epoch() { UpdateFitnessScores(); //Now to create a new population int NewBabies = 0; //create some storage for the baby genomes vector<SGenome> vecBabyGenomes; while (NewBabies < m_iPopSize) { //select 2 parents SGenome mum = RouletteWheelSelection(); SGenome dad = RouletteWheelSelection(); //operator - crossover SGenome baby1, baby2; Crossover(mum.vecBits, dad.vecBits, baby1.vecBits, baby2.vecBits); //operator - mutate Mutate(baby1.vecBits); Mutate(baby2.vecBits); //add to new population vecBabyGenomes.push_back(baby1); vecBabyGenomes.push_back(baby2); NewBabies += 2; } //copy babies back into starter population m_vecGenomes = vecBabyGenomes; //increment the generation counter ++m_iGeneration; }
//------------------------Epoch------------------------------- // // creates a new population of genomes using the selection, // mutation and crossover operators //------------------------------------------------------------ void CgaTSP::Epoch() { //first we reset variables and calculate the fitness of each genome Reset(); CalculatePopulationsFitness(); //if we have found a solution exit if ((m_dShortestRoute <= m_pMap->BestPossibleRoute())) { m_bStarted = false; return; } //perform the appropriate fitness scaling FitnessScaleSwitch(); //if sigma is zero (either set in sigma scaling or in CalculateBestWorstAv //then the population are identical and we should stop the run if (m_dSigma == 0) { m_bStarted = false; return; } //create a temporary vector for the new population vector<SGenome> vecNewPop; if (m_bElitism) { //Now to add a little elitism we shall add in some copies of the //fittest genomes const int CopiesToAdd = 2; const int NBest = 4; //make sure we add an EVEN number or the roulette wheel //sampling will crash if (!(CopiesToAdd * NBest % 2)) { GrabNBest(NBest, CopiesToAdd, vecNewPop); } } //SUS selection selects the entire population all at once so we have to //handle the epoch slightly differently if SUS is chosen if(m_SelectionType != SUS) { //now create the remainder of the population while (vecNewPop.size() != m_iPopSize) { SGenome mum, dad; //switch on selection method switch(m_SelectionType) { case ROULETTE: //grab two parents dependent on the selection method mum = RouletteWheelSelection(); dad = RouletteWheelSelection(); break; case TOURNAMENT: mum = TournamentSelection(NUM_TO_COMPARE); dad = TournamentSelection(NUM_TO_COMPARE); break; case ALT_TOURNAMENT: mum = AlternativeTournamentSelection(); dad = AlternativeTournamentSelection(); break; } //create 2 children SGenome baby1, baby2; //Breed them Crossover(mum.vecCities, dad.vecCities, baby1.vecCities, baby2.vecCities, m_CrossoverType); //and mutate them Mutate(baby1.vecCities, m_MutationType); Mutate(baby2.vecCities, m_MutationType); //add them to new population vecNewPop.push_back(baby1); vecNewPop.push_back(baby2); } } //SUS selection else { //select all the individuals vector<SGenome> vecSampledPop; SUSSelection(vecSampledPop); //step through the newly sampled population and apply crossover //and mutation operators for (int gen=0; gen<vecSampledPop.size(); gen+=2) { SGenome baby1, baby2; Crossover(vecSampledPop[gen].vecCities, vecSampledPop[gen+1].vecCities, baby1.vecCities, baby2.vecCities, m_CrossoverType); Mutate(baby1.vecCities, m_MutationType); Mutate(baby2.vecCities, m_MutationType); vecNewPop.push_back(baby1); vecNewPop.push_back(baby2); } } //copy into next generation m_vecPopulation = vecNewPop; //increment generation counter ++m_iGeneration; }