public void DoGeneration() { GenerationCount++; // Create a list to hold our new offspring var offspring = new List <Individual>(); // While our offspring are less than our current population count, create new offspring while (offspring.Count < GAConfig.PopulationCount) { // Get parents var mother = GetParent(); var father = GetParent(); // Handle the case where we have picked the same individual as both parents while (mother == father) { father = GetParent(); } // Perform Crossover var(offspringA, offspringB) = GetOffspring(mother, father); // Mutate (offspringA, offspringB) = Mutate(offspringA, offspringB); // Add offspring to population offspring.Add(offspringA); offspring.Add(offspringB); } // Add all the offspring to our existing population Population.AddRange(offspring); MultiObjectiveHelper.UpdatePopulationFitness(Population); // Take the best 'PopulationCount' worth of individuals var newPopulation = new List <Individual>(); foreach (var individual in Population.OrderBy(i => i.Rank).ThenByDescending(i => i.CrowdingDistance)) { if (!newPopulation.Contains(individual)) { newPopulation.Add(individual); } } newPopulation = newPopulation.Take(GAConfig.PopulationCount).ToList(); Population.Clear(); newPopulation.ForEach(i => Population.Add(i)); }
public void EnsureRankTest() { var population = DefaultPopulationHelper.GetTestPopulation(); MultiObjectiveHelper.UpdatePopulationFitness(population); Assert.AreEqual(population[0].Rank, 1); Assert.AreEqual(population[1].Rank, 1); Assert.AreEqual(population[2].Rank, 1); Assert.AreEqual(population[3].Rank, 2); Assert.AreEqual(population[4].Rank, 2); Assert.AreEqual(population[5].Rank, 2); Assert.AreEqual(population[6].Rank, 3); }
public void EnsureCrowdingDistanceTest() { double epsilon = 0.00001; var population = DefaultPopulationHelper.GetTestPopulation(); MultiObjectiveHelper.UpdatePopulationFitness(population); Assert.IsTrue(double.IsPositiveInfinity(population[0].CrowdingDistance)); Assert.IsTrue(Math.Abs(population[1].CrowdingDistance - 0.9428089) < epsilon); Assert.IsTrue(double.IsPositiveInfinity(population[2].CrowdingDistance)); Assert.IsTrue(double.IsPositiveInfinity(population[3].CrowdingDistance)); Assert.IsTrue(Math.Abs(population[4].CrowdingDistance - 0.9428089) < epsilon); Assert.IsTrue(double.IsPositiveInfinity(population[5].CrowdingDistance)); Assert.IsTrue(double.IsPositiveInfinity(population[6].CrowdingDistance)); }
public void EnsureCrowdingDistanceTournamentSelectionTest() { var population = DefaultPopulationHelper.GetTestPopulation(); MultiObjectiveHelper.UpdatePopulationFitness(population); // Rank 1, float.MaxValue crowding distance var individualA = population[0]; // Rank 1, ~5.65 crowding distance var individualB = population[1]; var fitterIndividualA = WorldHelper.TournamentSelection(individualA, individualB); var fitterIndividualB = WorldHelper.TournamentSelection(individualB, individualA); Assert.AreEqual(individualA, fitterIndividualA); Assert.AreEqual(individualA, fitterIndividualB); }
public void EnsureRankedTournamentSelectionTest() { var population = DefaultPopulationHelper.GetTestPopulation(); MultiObjectiveHelper.UpdatePopulationFitness(population); // Rank 1 var individualA = population[1]; // Rank 2 var individualB = population[3]; var fitterIndividualA = WorldHelper.TournamentSelection(individualA, individualB); var fitterIndividualB = WorldHelper.TournamentSelection(individualB, individualA); Assert.AreEqual(individualA, fitterIndividualA); Assert.AreEqual(individualA, fitterIndividualB); }