public void NewGeneration(int numNewDNA = 0, bool crossoverNewDNA = false) { int finalCount = popsize + numNewDNA; if (finalCount <= 0) { return; } if (popsize > 0) { CalculateFitness(); Population.Sort(CompareDNA); } newPopulation.Clear(); for (int i = 0; i < popsize; i++) { if (i < Elitism && i < popsize) { newPopulation.Add(Population[i]); } else if (crossoverNewDNA) { GenerateQP <T> parent1 = ChooseParent(); GenerateQP <T> parent2 = ChooseParent(); //if (parent1 == null) //{ // return; //} GenerateQP <T> child = parent1.Crossover(parent2); // if (child == null) //{ // return; //} //child.Mutate(MutationRate); newPopulation.Add(child); } else { GenerateQP <T> generateclone = new GenerateQP <T>(dnaSize, random, getRandomGene, fitnessFunction, shouldInitGenes: true); newPopulation.Add((GenerateQP <T>)generateclone.Clone()); } } List <GenerateQP <T> > tmpList = new List <GenerateQP <T> >(Population); Population = new List <GenerateQP <T> >(newPopulation); newPopulation = new List <GenerateQP <T> >(tmpList); Generation++; }
public GeneticAlgorithm(int populationSize, int dnaSize, Random random, Func <int, T> getRandomGene, Func <GenerateQP <T>, float> fitnessFunction, int elitism, float mutationRate = 0.01f) { popsize = populationSize; Generation = 1; Elitism = elitism; MutationRate = mutationRate; Population = new List <GenerateQP <T> >(); newPopulation = new List <GenerateQP <T> >(); this.random = random; this.dnaSize = dnaSize; this.getRandomGene = getRandomGene; this.fitnessFunction = fitnessFunction; BestGenes = new T[dnaSize]; for (int i = 0; i < popsize; i++) { GenerateQP <T> generateclone = new GenerateQP <T>(dnaSize, random, getRandomGene, fitnessFunction, shouldInitGenes: true); Population.Add((GenerateQP <T>)generateclone.Clone()); } CalculateFitness(); }