Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }