コード例 #1
0
        public void ExponentialScalingStrategy_Scale()
        {
            GeneticAlgorithm algorithm = GetAlgorithm(2);

            ExponentialScalingStrategy target = (ExponentialScalingStrategy)algorithm.FitnessScalingStrategy;

            target.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);
            MockEntity entity1 = new MockEntity();

            entity1.Initialize(algorithm);
            PrivateObject entity1Accessor = new PrivateObject(entity1, new PrivateType(typeof(GeneticEntity)));

            entity1Accessor.SetField("rawFitnessValue", 5);
            MockEntity entity2 = new MockEntity();

            entity2.Initialize(algorithm);
            PrivateObject entity2Accessor = new PrivateObject(entity2, new PrivateType(typeof(GeneticEntity)));

            entity2Accessor.SetField("rawFitnessValue", 7);
            population.Entities.Add(entity1);
            population.Entities.Add(entity2);
            target.Scale(population);

            Assert.Equal((double)25, entity1.ScaledFitnessValue);
            Assert.Equal((double)49, entity2.ScaledFitnessValue);
        }
コード例 #2
0
        public async Task MultiDemeGeneticAlgorithm_Migrate()
        {
            MultiDemeGeneticAlgorithm algorithm = new MultiDemeGeneticAlgorithm
            {
                MinimumEnvironmentSize = 3,
                GeneticEntitySeed      = new MockEntity(),
                PopulationSeed         = new SimplePopulation
                {
                    MinimumPopulationSize = 4
                },
                FitnessEvaluator  = new MockFitnessEvaluator(),
                MigrantCount      = 2,
                SelectionOperator = new MockSelectionOperator
                {
                    SelectionBasedOnFitnessType = FitnessType.Scaled
                },
            };

            algorithm.SelectionOperator = new MockSelectionOperator();
            algorithm.FitnessEvaluator  = new MockFitnessEvaluator();
            await algorithm.InitializeAsync();

            SimplePopulation population1 = (SimplePopulation)algorithm.Environment.Populations[0];

            population1.Entities[0].ScaledFitnessValue = 1;
            population1.Entities[1].ScaledFitnessValue = 5;
            population1.Entities[2].ScaledFitnessValue = 2;
            population1.Entities[3].ScaledFitnessValue = 4;

            SimplePopulation population2 = (SimplePopulation)algorithm.Environment.Populations[1];

            population2.Entities[0].ScaledFitnessValue = 6;
            population2.Entities[1].ScaledFitnessValue = 3;
            population2.Entities[2].ScaledFitnessValue = 8;
            population2.Entities[3].ScaledFitnessValue = 7;

            SimplePopulation population3 = (SimplePopulation)algorithm.Environment.Populations[2];

            population3.Entities[0].ScaledFitnessValue = 9;
            population3.Entities[1].ScaledFitnessValue = 13;
            population3.Entities[2].ScaledFitnessValue = 10;
            population3.Entities[3].ScaledFitnessValue = 12;

            algorithm.Migrate();

            Assert.Equal((double)1, population1.Entities[0].ScaledFitnessValue);
            Assert.Equal((double)2, population1.Entities[1].ScaledFitnessValue);
            Assert.Equal((double)13, population1.Entities[2].ScaledFitnessValue);
            Assert.Equal((double)12, population1.Entities[3].ScaledFitnessValue);

            Assert.Equal((double)6, population2.Entities[0].ScaledFitnessValue);
            Assert.Equal((double)3, population2.Entities[1].ScaledFitnessValue);
            Assert.Equal((double)5, population2.Entities[2].ScaledFitnessValue);
            Assert.Equal((double)4, population2.Entities[3].ScaledFitnessValue);

            Assert.Equal((double)9, population3.Entities[0].ScaledFitnessValue);
            Assert.Equal((double)10, population3.Entities[1].ScaledFitnessValue);
            Assert.Equal((double)8, population3.Entities[2].ScaledFitnessValue);
            Assert.Equal((double)7, population3.Entities[3].ScaledFitnessValue);
        }
コード例 #3
0
        public async Task FitnessTargetTerminator_IsComplete_RawFitness()
        {
            double           fitnessTarget = 15;
            GeneticAlgorithm algorithm     = GetAlgorithm(fitnessTarget, FitnessType.Raw);
            await algorithm.InitializeAsync();

            FitnessTargetTerminator terminator = (FitnessTargetTerminator)algorithm.Terminator;

            terminator.Initialize(algorithm);

            // Check with no populations
            Assert.False(terminator.IsComplete(), "No genetic entities have the fitness target.");

            MockEntity entity = new MockEntity();

            entity.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);
            population.Entities.Add(entity);
            algorithm.Environment.Populations.Add(population);

            // Check with a population with one entity
            Assert.False(terminator.IsComplete(), "No genetic entities have the fitness target.");

            PrivateObject accessor = new PrivateObject(entity, new PrivateType(typeof(GeneticEntity)));

            accessor.SetField("rawFitnessValue", 15);
            Assert.True(terminator.IsComplete(), "A entity does have the fitness target.");
        }
コード例 #4
0
        public void SigmaScalingStrategy_Scale_Multiplier1()
        {
            GeneticAlgorithm     algorithm = GetAlgorithm(5);
            SigmaScalingStrategy strategy  = new SigmaScalingStrategy {
                Multiplier = 1
            };

            strategy.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);
            PrivateObject populationAccessor = new PrivateObject(population, new PrivateType(typeof(Population)));

            AddEntity(algorithm, 4, population);
            AddEntity(algorithm, 10, population);
            AddEntity(algorithm, 20, population);
            AddEntity(algorithm, 0, population);

            populationAccessor.SetField("rawMean", (double)(4 + 10 + 20) / 4);
            populationAccessor.SetField("rawStandardDeviation", MathHelper.GetStandardDeviation(population.Entities, population.RawMean.Value, FitnessType.Raw));

            strategy.Scale(population);

            Assert.Equal(3.03, Math.Round(population.Entities[0].ScaledFitnessValue, 2));
            Assert.Equal(9.03, Math.Round(population.Entities[1].ScaledFitnessValue, 2));
            Assert.Equal(19.03, Math.Round(population.Entities[2].ScaledFitnessValue, 2));
            Assert.Equal(0, Math.Round(population.Entities[3].ScaledFitnessValue, 2));
        }
コード例 #5
0
        public async Task FitnessTargetTerminator_IsComplete_ScaledFitness()
        {
            double           fitnessTarget = 15;
            GeneticAlgorithm algorithm     = GetAlgorithm(fitnessTarget, FitnessType.Scaled);
            await algorithm.InitializeAsync();

            FitnessTargetTerminator terminator = (FitnessTargetTerminator)algorithm.Terminator;

            terminator.Initialize(algorithm);

            // Check with no populations
            Assert.False(terminator.IsComplete(), "No genetic entities have the fitness target.");

            MockEntity entity = new MockEntity();

            entity.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);
            population.Entities.Add(entity);
            algorithm.Environment.Populations.Add(population);

            // Check with a population with one entity
            Assert.False(terminator.IsComplete(), "No genetic entities have the fitness target.");

            entity.ScaledFitnessValue = 15;
            Assert.True(terminator.IsComplete(), "A entity does have the fitness target.");
        }
コード例 #6
0
        private static GeneticEntity AddEntity(GeneticAlgorithm algorithm, SimplePopulation population, double scaledFitnessValue)
        {
            GeneticEntity entity = new MockEntity();

            entity.Initialize(algorithm);
            entity.ScaledFitnessValue = scaledFitnessValue;
            population.Entities.Add(entity);
            return(entity);
        }
コード例 #7
0
        public void FitnessProportionateSelectionOperator_Select_MinimizeFitness()
        {
            GeneticAlgorithm algorithm = GetAlgorithm();

            ((MockFitnessEvaluator)algorithm.FitnessEvaluator).EvaluationMode = FitnessEvaluationMode.Minimize;

            FitnessProportionateSelectionOperator op = new FitnessProportionateSelectionOperator();

            op.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);
            MockEntity entity1 = new MockEntity();

            entity1.Initialize(algorithm);
            entity1.ScaledFitnessValue = 1; // Slice size: 5
            MockEntity entity2 = new MockEntity();

            entity2.Initialize(algorithm);
            entity2.ScaledFitnessValue = 5; // Slice size: 1
            MockEntity entity3 = new MockEntity();

            entity3.Initialize(algorithm);
            entity3.ScaledFitnessValue = 4; // Slice size: 4
            population.Entities.Add(entity1);
            population.Entities.Add(entity2);
            population.Entities.Add(entity3);
            FakeRandomUtil randomUtil = new FakeRandomUtil();

            RandomNumberService.Instance = randomUtil;

            randomUtil.RandomRatio = 0;
            IList <GeneticEntity> selectedEntities = op.SelectEntities(1, population).ToList();

            Assert.Same(entity2, selectedEntities[0]);

            randomUtil.RandomRatio = .099999;
            selectedEntities       = op.SelectEntities(1, population);
            Assert.Same(entity2, selectedEntities[0]);

            randomUtil.RandomRatio = .1;
            selectedEntities       = op.SelectEntities(1, population);
            Assert.Same(entity3, selectedEntities[0]);

            randomUtil.RandomRatio = .499999;
            selectedEntities       = op.SelectEntities(1, population);
            Assert.Same(entity3, selectedEntities[0]);

            randomUtil.RandomRatio = .5;
            selectedEntities       = op.SelectEntities(1, population);
            Assert.Same(entity1, selectedEntities[0]);

            randomUtil.RandomRatio = 1;
            selectedEntities       = op.SelectEntities(1, population);
            Assert.Same(entity1, selectedEntities[0]);
        }
コード例 #8
0
        public void SigmaScalingStrategy_Scale_EmptyPopulation()
        {
            GeneticAlgorithm     algorithm = GetAlgorithm(10);
            SigmaScalingStrategy op        = new SigmaScalingStrategy();

            op.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);
            Assert.Throws <ArgumentException>(() => op.Scale(population));
        }
コード例 #9
0
        public void FitnessProportionateSelectionOperator_Select()
        {
            GeneticAlgorithm algorithm = GetAlgorithm();
            FitnessProportionateSelectionOperator op = new FitnessProportionateSelectionOperator();

            op.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);
            MockEntity entity1 = new MockEntity();

            entity1.Initialize(algorithm);
            entity1.ScaledFitnessValue = 1;
            MockEntity entity2 = new MockEntity();

            entity2.Initialize(algorithm);
            entity2.ScaledFitnessValue = 5;
            MockEntity entity3 = new MockEntity();

            entity3.Initialize(algorithm);
            entity3.ScaledFitnessValue = 4;
            population.Entities.Add(entity1);
            population.Entities.Add(entity2);
            population.Entities.Add(entity3);
            FakeRandomUtil randomUtil = new FakeRandomUtil();

            RandomNumberService.Instance = randomUtil;

            randomUtil.RandomRatio = 0;
            IList <GeneticEntity> selectedEntities = op.SelectEntities(1, population);

            Assert.Same(entity1, selectedEntities[0]);

            randomUtil.RandomRatio = .099999;
            selectedEntities       = op.SelectEntities(1, population);
            Assert.Same(entity1, selectedEntities[0]);

            randomUtil.RandomRatio = .1;
            selectedEntities       = op.SelectEntities(1, population);
            Assert.Same(entity2, selectedEntities[0]);

            randomUtil.RandomRatio = .599999;
            selectedEntities       = op.SelectEntities(1, population);
            Assert.Same(entity2, selectedEntities[0]);

            randomUtil.RandomRatio = .6;
            selectedEntities       = op.SelectEntities(1, population);
            Assert.Same(entity3, selectedEntities[0]);

            randomUtil.RandomRatio = 1;
            selectedEntities       = op.SelectEntities(1, population);
            Assert.Same(entity3, selectedEntities[0]);
        }
コード例 #10
0
        public async Task SteadyStateGeneticAlgorithm_CreateNextGeneration_Percentage()
        {
            SteadyStateGeneticAlgorithm algorithm = new SteadyStateGeneticAlgorithm
            {
                GeneticEntitySeed          = new MockEntity(),
                PopulationSeed             = new SimplePopulation(),
                FitnessEvaluator           = new MockFitnessEvaluator(),
                PopulationReplacementValue = new PopulationReplacementValue(20, ReplacementValueKind.Percentage),
                SelectionOperator          = new MockSelectionOperator
                {
                    SelectionBasedOnFitnessType = FitnessType.Scaled
                },
                CrossoverOperator = new MockCrossoverOperator
                {
                    CrossoverRate = 1
                },
                MutationOperator = new MockMutationOperator
                {
                    MutationRate = 1
                }
            };

            algorithm.SelectionOperator = new MockSelectionOperator {
                SelectionBasedOnFitnessType = FitnessType.Scaled
            };
            algorithm.SelectionOperator.Initialize(algorithm);
            algorithm.CrossoverOperator = new MockCrossoverOperator {
                CrossoverRate = 1
            };
            algorithm.CrossoverOperator.Initialize(algorithm);
            algorithm.MutationOperator = new MockMutationOperator {
                MutationRate = 1
            };
            algorithm.MutationOperator.Initialize(algorithm);
            algorithm.FitnessEvaluator = new MockFitnessEvaluator();
            algorithm.FitnessEvaluator.Initialize(algorithm);

            await algorithm.InitializeAsync();

            PrivateObject    ssAccessor = new PrivateObject(algorithm);
            SimplePopulation population = GetPopulation(algorithm, 10);

            int prevPopCount = population.Entities.Count;

            await(Task) ssAccessor.Invoke("CreateNextGenerationAsync", population);

            Assert.Equal(1, ((MockSelectionOperator)algorithm.SelectionOperator).DoSelectCallCount);
            Assert.Equal(1, ((MockCrossoverOperator)algorithm.CrossoverOperator).DoCrossoverCallCount);
            Assert.Equal(2, ((MockMutationOperator)algorithm.MutationOperator).DoMutateCallCount);
            Assert.Equal(prevPopCount, population.Entities.Count);
        }
コード例 #11
0
        public void UniformSelectionOperator_Select()
        {
            MockGeneticAlgorithm algorithm = new MockGeneticAlgorithm
            {
                FitnessEvaluator  = new MockFitnessEvaluator(),
                GeneticEntitySeed = new MockEntity(),
                PopulationSeed    = new SimplePopulation(),
                SelectionOperator = new UniformSelectionOperator
                {
                    SelectionBasedOnFitnessType = FitnessType.Scaled
                }
            };
            UniformSelectionOperator op = new UniformSelectionOperator();

            op.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);

            for (int i = 0; i < 4; i++)
            {
                MockEntity entity = new MockEntity();
                entity.Initialize(algorithm);
                population.Entities.Add(entity);
            }

            TestRandomUtil randomUtil = new TestRandomUtil();

            RandomNumberService.Instance = randomUtil;

            randomUtil.Value = 3;
            IList <GeneticEntity> selectedEntities = op.SelectEntities(1, population);

            Assert.Same(population.Entities[randomUtil.Value], selectedEntities[0]);

            randomUtil.Value = 2;
            selectedEntities = op.SelectEntities(1, population);
            Assert.Same(population.Entities[randomUtil.Value], selectedEntities[0]);

            randomUtil.Value = 1;
            selectedEntities = op.SelectEntities(1, population);
            Assert.Same(population.Entities[randomUtil.Value], selectedEntities[0]);

            randomUtil.Value = 0;
            selectedEntities = op.SelectEntities(1, population);
            Assert.Same(population.Entities[randomUtil.Value], selectedEntities[0]);
        }
コード例 #12
0
        private static SimplePopulation GetPopulation(GeneticAlgorithm algorithm, int populationSize)
        {
            SimplePopulation population = new SimplePopulation {
                MinimumPopulationSize = populationSize
            };

            population.Initialize(algorithm);

            for (int i = 0; i < population.MinimumPopulationSize; i++)
            {
                MockEntity entity = new MockEntity();
                entity.Initialize(algorithm);
                population.Entities.Add(entity);
            }

            return(population);
        }
コード例 #13
0
        public void MeanTreeSize_GetResultValue()
        {
            GeneticAlgorithm algorithm = new MockGeneticAlgorithm
            {
                SelectionOperator = new MockSelectionOperator(),
                FitnessEvaluator  = new MockFitnessEvaluator(),
                GeneticEntitySeed = new TestTreeEntity(),
                PopulationSeed    = new SimplePopulation(),
            };

            algorithm.Metrics.Add(new MeanTreeSize());

            MeanTreeSize target = new MeanTreeSize();

            target.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);

            TreeEntityBase entity = new TestTreeEntity();

            entity.Initialize(algorithm);
            entity.SetRootNode(new TreeNode());
            entity.RootNode.ChildNodes.Add(new TreeNode());
            entity.RootNode.ChildNodes.Add(new TreeNode());
            entity.RootNode.ChildNodes[0].ChildNodes.Add(new TreeNode());
            population.Entities.Add(entity);

            entity = new TestTreeEntity();
            entity.Initialize(algorithm);
            entity.SetRootNode(new TreeNode());
            population.Entities.Add(entity);

            entity = new TestTreeEntity();
            entity.Initialize(algorithm);
            entity.SetRootNode(new TreeNode());
            entity.RootNode.ChildNodes.Add(new TreeNode());
            population.Entities.Add(entity);

            object result = target.GetResultValue(population);

            Assert.Equal(2.33, Math.Round((double)result, 2));
        }
コード例 #14
0
        public void FitnessSharingScalingStrategy_Scale()
        {
            double           scalingCurvature          = .8;
            double           scalingDistance           = 3;
            GeneticAlgorithm algorithm                 = GetAlgorithm(scalingCurvature, scalingDistance);
            FakeFitnessSharingScalingStrategy strategy = (FakeFitnessSharingScalingStrategy)algorithm.FitnessScalingStrategy;

            strategy.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);
            GeneticEntity entity1 = AddEntity(algorithm, population, 5);
            GeneticEntity entity2 = AddEntity(algorithm, population, 6);
            GeneticEntity entity3 = AddEntity(algorithm, population, 9);
            GeneticEntity entity4 = AddEntity(algorithm, population, 11.5);
            GeneticEntity entity5 = AddEntity(algorithm, population, 20);
            GeneticEntity entity6 = AddEntity(algorithm, population, 25);

            strategy.Scale(population);

            ValidateScale(entity1, 3.16);
            ValidateScale(entity2, 3.79);
            ValidateScale(entity3, 7.92);
            ValidateScale(entity4, 10.13);
            ValidateScale(entity5, 20);
            ValidateScale(entity6, 25);

            // Change the population size to verify fitness distances are recalculated
            GeneticEntity entity7 = AddEntity(algorithm, population, 10);

            strategy.Scale(population);

            ValidateScale(entity1, 1.84);
            ValidateScale(entity2, 2.21);
            ValidateScale(entity3, 5.37);
            ValidateScale(entity4, 4.73);
            ValidateScale(entity5, 20);
            ValidateScale(entity6, 25);
            ValidateScale(entity7, 4.6);
        }
コード例 #15
0
        public void BestMaximumFitnessEntity_GetResultValue()
        {
            GeneticAlgorithm algorithm = new MockGeneticAlgorithm
            {
                SelectionOperator = new MockSelectionOperator(),
                FitnessEvaluator  = new MockFitnessEvaluator(),
                GeneticEntitySeed = new MockEntity(),
                PopulationSeed    = new SimplePopulation(),
            };

            algorithm.Metrics.Add(new BestMaximumFitnessEntity());

            BestMaximumFitnessEntity target = new BestMaximumFitnessEntity();

            target.Initialize(algorithm);

            SimplePopulation population1 = new SimplePopulation()
            {
                Index = 0
            };

            population1.Initialize(algorithm);

            VerifyGetResultValue(2, target, population1, algorithm, "20");
            VerifyGetResultValue(1, target, population1, algorithm, "20");
            VerifyGetResultValue(3, target, population1, algorithm, "30");

            SimplePopulation population2 = new SimplePopulation()
            {
                Index = 1
            };

            population2.Initialize(algorithm);

            VerifyGetResultValue(7, target, population2, algorithm, "70");
            VerifyGetResultValue(1, target, population1, algorithm, "30");
            VerifyGetResultValue(4, target, population2, algorithm, "70");
        }
コード例 #16
0
        public async Task MultiDemeGeneticAlgorithm_CreateNextGeneration_Async()
        {
            TestMultiDemeGeneticAlgorithm algorithm = new TestMultiDemeGeneticAlgorithm
            {
                FitnessEvaluator  = new MockFitnessEvaluator(),
                GeneticEntitySeed = new MockEntity(),
                PopulationSeed    = new SimplePopulation
                {
                    MinimumPopulationSize = 3
                },
                MigrantCount      = 1,
                SelectionOperator = new MockSelectionOperator
                {
                    SelectionBasedOnFitnessType = FitnessType.Raw
                }
            };
            MockSelectionOperator selectionOp = new MockSelectionOperator();

            algorithm.SelectionOperator = selectionOp;
            await algorithm.InitializeAsync();

            PrivateObject accessor = new PrivateObject(algorithm);

            algorithm.Environment.Populations.Add(GetPopulation(algorithm));
            algorithm.Environment.Populations.Add(GetPopulation(algorithm));
            SimplePopulation population = GetPopulation(algorithm);

            algorithm.Environment.Populations.Add(population);

            int prevPopCount = population.Entities.Count;

            await(Task) accessor.Invoke("CreateNextGenerationAsync", population);

            Assert.Equal(1, selectionOp.DoSelectCallCount);
            Assert.Equal(prevPopCount, population.Entities.Count);
        }
コード例 #17
0
        private static void VerifyGetResultValue(int multiplier, BestMaximumFitnessEntity metric, SimplePopulation population, GeneticAlgorithm algorithm, string expectedReturnVal)
        {
            for (int i = 0; i < 5; i++)
            {
                MockEntity entity = new MockEntity();
                entity.Initialize(algorithm);
                entity.ScaledFitnessValue = i * multiplier;
                entity.Identifier         = entity.ScaledFitnessValue.ToString();
                population.Entities.Add(entity);
            }

            for (int i = 10; i >= 5; i--)
            {
                MockEntity entity = new MockEntity();
                entity.Initialize(algorithm);
                entity.ScaledFitnessValue = i * multiplier;
                entity.Identifier         = entity.ScaledFitnessValue.ToString();
                population.Entities.Add(entity);
            }

            object representation = metric.GetResultValue(population);

            Assert.Equal(expectedReturnVal, representation.ToString());
        }
コード例 #18
0
        public async Task SimpleGeneticAlgorithm_CreateNextGeneration_Async()
        {
            SimpleGeneticAlgorithm algorithm = new SimpleGeneticAlgorithm
            {
                FitnessEvaluator  = new MockFitnessEvaluator(),
                GeneticEntitySeed = new MockEntity(),
                PopulationSeed    = new SimplePopulation(),
                ElitismStrategy   = new MockElitismStrategy
                {
                    ElitistRatio = .1
                },
                SelectionOperator = new MockSelectionOperator
                {
                    SelectionBasedOnFitnessType = FitnessType.Scaled
                },
                CrossoverOperator = new MockCrossoverOperator
                {
                    CrossoverRate = 1
                },
                MutationOperator = new MockMutationOperator
                {
                    MutationRate = 1
                }
            };

            algorithm.ElitismStrategy = new MockElitismStrategy {
                ElitistRatio = .1
            };
            algorithm.ElitismStrategy.Initialize(algorithm);
            algorithm.SelectionOperator = new MockSelectionOperator {
                SelectionBasedOnFitnessType = FitnessType.Scaled
            };
            algorithm.SelectionOperator.Initialize(algorithm);
            algorithm.CrossoverOperator = new MockCrossoverOperator {
                CrossoverRate = 1
            };
            algorithm.CrossoverOperator.Initialize(algorithm);
            algorithm.MutationOperator = new MockMutationOperator {
                MutationRate = 1
            };
            algorithm.MutationOperator.Initialize(algorithm);
            PrivateObject accessor = new PrivateObject(algorithm);

            SimplePopulation population = GetPopulation(algorithm, 10);

            List <GeneticEntity> originalEntities = new List <GeneticEntity>(population.Entities);

            int prevPopCount = population.Entities.Count;

            await(Task) accessor.Invoke("CreateNextGenerationAsync", population);

            // Find the number of entities in the new population that were in the original population
            int actualElitistEntitiesCount = population.Entities.Count(e => originalEntities.Contains(e));

            Assert.Equal(1, actualElitistEntitiesCount);
            Assert.Equal(1, ((MockElitismStrategy)algorithm.ElitismStrategy).GetElitistGeneticEntitiesCallCount);
            Assert.Equal(1, ((MockSelectionOperator)algorithm.SelectionOperator).DoSelectCallCount);
            Assert.Equal(4, ((MockCrossoverOperator)algorithm.CrossoverOperator).DoCrossoverCallCount);
            Assert.Equal(9, ((MockMutationOperator)algorithm.MutationOperator).DoMutateCallCount);
            Assert.Equal(prevPopCount, population.Entities.Count);
        }
コード例 #19
0
        public void RankSelectionOperator_Select()
        {
            GeneticAlgorithm      algorithm = GetAlgorithm();
            RankSelectionOperator op        = new RankSelectionOperator();

            op.Initialize(algorithm);
            SimplePopulation population = new SimplePopulation();

            population.Initialize(algorithm);
            MockEntity entity1 = new MockEntity();

            entity1.Initialize(algorithm);
            MockEntity entity2 = new MockEntity();

            entity2.Initialize(algorithm);
            MockEntity entity3 = new MockEntity();

            entity3.Initialize(algorithm);
            MockEntity entity4 = new MockEntity();

            entity4.Initialize(algorithm);
            entity1.ScaledFitnessValue = 0;
            entity2.ScaledFitnessValue = 50;
            entity3.ScaledFitnessValue = 23;
            entity4.ScaledFitnessValue = 25;
            population.Entities.Add(entity1);
            population.Entities.Add(entity2);
            population.Entities.Add(entity3);
            population.Entities.Add(entity4);

            TestRandomUtil randomUtil = new TestRandomUtil();

            RandomNumberService.Instance = randomUtil;

            randomUtil.Ratio = 0;
            IList <GeneticEntity> selectedEntities = op.SelectEntities(1, population).ToList();

            Assert.Same(entity1, selectedEntities[0]);

            randomUtil.Ratio = .099999;
            selectedEntities = op.SelectEntities(1, population);
            Assert.Same(entity1, selectedEntities[0]);

            randomUtil.Ratio = .1;
            selectedEntities = op.SelectEntities(1, population);
            Assert.Same(entity3, selectedEntities[0]);

            randomUtil.Ratio = .299999;
            selectedEntities = op.SelectEntities(1, population);
            Assert.Same(entity3, selectedEntities[0]);

            randomUtil.Ratio = .3;
            selectedEntities = op.SelectEntities(1, population);
            Assert.Same(entity4, selectedEntities[0]);

            randomUtil.Ratio = .599999;
            selectedEntities = op.SelectEntities(1, population);
            Assert.Same(entity4, selectedEntities[0]);

            randomUtil.Ratio = .6;
            selectedEntities = op.SelectEntities(1, population);
            Assert.Same(entity2, selectedEntities[0]);

            randomUtil.Ratio = 1;
            selectedEntities = op.SelectEntities(1, population);
            Assert.Same(entity2, selectedEntities[0]);
        }