private SGenome GetChromoRoulette() { //generate a random number between 0 & total fitness count double Slice = (double)(m_Rand.NextDouble() * m_dTotalFitness); //this will be set to the chosen chromosome SGenome TheChosenOne = m_vecPop[0]; //go through the chromosones adding up the fitness so far double FitnessSoFar = 0; for (int i = 0; i < m_iPopSize; ++i) { FitnessSoFar += m_vecPop[i].Fitness; //if the fitness so far > random number return the chromo at //this point if (FitnessSoFar >= Slice) { TheChosenOne = m_vecPop[i]; break; } } return(TheChosenOne); }
//this runs the GA for one generation. public List <SGenome> Epoch(List <SGenome> old_pop) { //assign the given population to the classes population m_vecPop = old_pop; //reset the appropriate variables Reset(); //sort the population (for scaling and elitism) m_vecPop.Sort(); //sort(m_vecPop.begin(), m_vecPop.end()); //calculate best, worst, average and total fitness CalculateBestWorstAvTot(); //create a temporary vector to store new chromosones List <SGenome> vecNewPop = new List <SGenome>(); //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 ((m_NumCopiesElite * m_NumElite % 2) == 0) { GrabNBest(m_NumElite, m_NumCopiesElite, vecNewPop); } //now we enter the GA loop //repeat until a new population is generated while (vecNewPop.Count < m_iPopSize) { //grab two chromosones SGenome mum = GetChromoRoulette(); SGenome dad = GetChromoRoulette(); //create some offspring via crossover List <double> baby1 = new List <double>(); List <double> baby2 = new List <double>(); Crossover(mum.Weights, dad.Weights, baby1, baby2); //now we mutate Mutate(baby1); Mutate(baby2); //now copy into vecNewPop population vecNewPop.Add(new SGenome(baby1, 0)); vecNewPop.Add(new SGenome(baby2, 0)); } //finished so assign new pop back into m_vecPop m_vecPop = vecNewPop; return(m_vecPop); }