internal List <Individual> GetNewPopulation() { List <Individual> newPopulation = new List <Individual>(); foreach (Individual individual in population) { individual.EvaluateFitness(); List <Individual> invalidIndividuals = new List <Individual>(); Individual target = this.SelectDifferenceIndividual(population, invalidIndividuals); invalidIndividuals.Add(target); Individual differenceIndividual1 = this.SelectDifferenceIndividual(population, invalidIndividuals); invalidIndividuals.Add(differenceIndividual1); Individual differenceIndividual2 = this.SelectDifferenceIndividual(population, invalidIndividuals); Individual trialIndividual = mutationStrategy.GetTrialVector(target, new List <Individual>() { differenceIndividual1, differenceIndividual2 }); Individual child = crossoverStrategy.Cross(individual, trialIndividual); child.EvaluateFitness(); newPopulation.Add(generationSelectionStrategy.Select(new List <Individual> { individual, child })); } return(newPopulation); }