Exemple #1
0
        public void PopulationRenwalManagerGetsRightInfoTest(RunType runType)
        {
            var generation = 0;
            var populationRenwalManager = A.Fake <IPopulationRenwalManager>();

            A.CallTo(() => populationRenwalManager.ShouldRenew(A <Population> ._, A <IEnvironment> ._, A <int> ._)).Invokes(
                (Population p, IEnvironment e, int g) =>
            {
                Assert.AreEqual(generation, g, "Wrong generation");
                foreach (var chromosome in p.GetChromosomes())
                {
                    Assert.AreEqual(generation + 1, chromosome.Evaluate(), "Wrong chromosome");
                }
                foreach (var evaluation in p.GetEvaluations())
                {
                    Assert.AreEqual(generation + 1, evaluation, "Wrong evaluation");
                }
                generation++;
            });
            var populationManager = new TestPopulationManager(new[]
                                                              { new double[] { 1, 1, 1 }, new double[] { 2, 2, 2 }, new double[] { 3, 3, 3 } });

            using (var engine = new TestGeneticSearchEngineBuilder(POPULATION_SIZE, 3, populationManager)
                                .AddPopulationRenwalManager(populationRenwalManager).IncludeAllHistory().Build())
            {
                engine.Run(runType);
            }
        }
        public void GetCurrentPopulation_CheckPopulationIsRight(bool includeHistory)
        {
            var populationManager = new TestPopulationManager(new double[] { 2, 2 });

            populationManager.SetPopulationGenerated(new[] { new double[] { 3, 3 } });
            var engineBuilder =
                new TestGeneticSearchEngineBuilder(2, int.MaxValue, populationManager);

            if (includeHistory)
            {
                engineBuilder.IncludeAllHistory();
            }

            var engine = engineBuilder.Build();

            var result1 = engine.Next();
            var result2 = engine.GetCurrentPopulation();

            Assertions.AssertAreTheSame(result1, result2);

            result1 = engine.Next();
            result2 = engine.GetCurrentPopulation();

            Assertions.AssertAreTheSame(result1, result2);
        }
Exemple #3
0
        public void SetCurrentPopulation_EngineRunning_ThrowException()
        {
            Utils.RunTimedTest(() =>
            {
                using (var engine =
                           new TestGeneticSearchEngineBuilder(2, int.MaxValue, new TestPopulationManager(new double[] { 2, 2 })).Build())
                {
                    Task.Run(() => engine.Run());
                    while (!engine.IsRunning)
                    {
                        ;
                    }

                    engine.SetCurrentPopulation(new double[] { 3, 3 }.ToChromosomes("Converted"));

                    if (engine.IsRunning)
                    {
                        Assert.Fail("Should have thrown an exception.");
                    }
                    else
                    {
                        Assert.Fail("For some reason, the engine is no longer running.");
                    }
                }
            });
        }
Exemple #4
0
        public void ConvertPopulationViaManager_CheckWeGetTheRightPopulationAndGeneration()
        {
            var generation            = 0;
            var testPopulationManager = new TestPopulationManager(new double[] { 1, 1, 1, 1, 1 });
            var populationConverter   = A.Fake <IPopulationConverter>();

            A.CallTo(() => populationConverter.ConvertPopulation(A <IChromosome[]> ._, A <int> ._, A <IEnvironment> ._))
            .ReturnsLazily((IChromosome[] c, int g, IEnvironment e) =>
            {
                Assert.AreEqual(generation, g, "We got the wrong generation");
                foreach (var chromosome in c)
                {
                    Assert.AreEqual(1, chromosome.Evaluate(), "Got wrong chromosome");
                }
                generation++;
                return(c);
            });
            var engine = new TestGeneticSearchEngineBuilder(5, 10, testPopulationManager)
                         .AddPopulationConverter(populationConverter).Build();

            for (int i = 0; i < 5; i++)
            {
                engine.Next();
            }
        }
        private GeneticSearchEngineBuilder CreateEngineBuilder(TestPopulationManager populationManager, int generations = int.MaxValue)
        {
            var populationConverter = A.Fake <IPopulationConverter>();

            A.CallTo(() => populationConverter.AddGeneration(A <Population> ._))
            .Invokes((Population population) => populationUpdatedForPopulationConverter.Save(population));
            A.CallTo(() => populationConverter.ConvertPopulation(A <IChromosome[]> ._, A <int> ._, A <IEnvironment> ._))
            .ReturnsLazily((IChromosome[] c, int g, IEnvironment e) => c);
            var stopManager = A.Fake <IStopManager>();

            A.CallTo(() => stopManager.AddGeneration(A <Population> ._))
            .Invokes((Population p) => populationUpdatedForStopManager.Save(p));
            var populationRenwalManager = A.Fake <IPopulationRenwalManager>();

            A.CallTo(() => populationRenwalManager.AddGeneration(A <Population> ._))
            .Invokes((Population p) => populationUpdatedForRenewalManager.Save(p));
            var mutationManager = A.Fake <IMutationProbabilityManager>();

            A.CallTo(() => mutationManager.AddGeneration(A <Population> ._))
            .Invokes((Population p) => populationUpdatedForMutationManager.Save(p));
            var builder = new TestGeneticSearchEngineBuilder(2, generations, populationManager)
                          .AddStopManager(stopManager)
                          .AddPopulationRenwalManager(populationRenwalManager).SetCustomMutationProbabilityManager(mutationManager)
                          .AddPopulationConverter(populationConverter);

            return(builder);
        }
Exemple #6
0
        public void RenewPopulation_EngineNotStated_ThrowException()
        {
            var engine =
                new TestGeneticSearchEngineBuilder(2, 4, new TestPopulationManager(new double[] { 2, 2 })).Build();

            engine.RenewPopulation(0.5);
            Assert.Fail("Should have thrown an exception by now");
        }
        public void BestChromosome()
        {
            var populationManager = new TestPopulationManager(new double[] { 1, 10, 14, 7, 8, 13, 11, 1, 6, 6 });
            var engine            = new TestGeneticSearchEngineBuilder(10, 10, populationManager).Build();

            var result = engine.Next();

            Assert.AreEqual(14, result.BestChromosome.Evaluate());
        }
Exemple #8
0
        public void RenewPopulation_BedPercentage_ThrowException(double percentage)
        {
            var engine =
                new TestGeneticSearchEngineBuilder(2, 4, new TestPopulationManager(new double[] { 2, 2 })).Build();

            engine.Next();

            engine.RenewPopulation(percentage);
            Assert.Fail("Should have thrown an exception by now");
        }
Exemple #9
0
        public void IfNoEnvironmentIsSetUseDefaultEnvironment()
        {
            var chromosomeEvaluator = A.Fake <IChromosomeEvaluator>();

            A.CallTo(() => chromosomeEvaluator.SetEnvierment(A <IEnvironment> ._)).Invokes((IEnvironment e) =>
                                                                                           Assert.AreEqual(typeof(DefaultEnvironment), e.GetType()));
            var engine = new TestGeneticSearchEngineBuilder(2, 10, new double[] { 1, 1 }).SetCustomChromosomeEvaluator(chromosomeEvaluator).Build();

            engine.Next();
        }
Exemple #10
0
        public void RenewPopulation_EngineRunning_ThrowException()
        {
            using (var engine =
                       new TestGeneticSearchEngineBuilder(2, int.MaxValue, new TestPopulationManager(new double[] { 2, 2 })).Build())
            {
                Task.Run(() => engine.Run());
                Thread.Sleep(50); // Give the eingine some time to start

                engine.RenewPopulation(0.5);
                Assert.Fail("Should have thrown an exception by now");
            }
        }
        public void StopAtConvergenceTest(RunType runType)
        {
            var populationManager = new TestPopulationManager(new[]
                                                              { new double[] { 1, 2, 1 }, new double[] { 2, 6, 2 }, new double[] { 2, 2.5, 2 } });

            using (var engine = new TestGeneticSearchEngineBuilder(POPULATION_SIZE, MAX_GENERATIONS, populationManager)
                                .AddStopManager(new StopAtConvergence(0.5)).IncludeAllHistory().Build())
            {
                var result = engine.Run(runType);

                Assert.AreEqual(3, result.Generations);
            }
        }
Exemple #12
0
        public void RenewIfNoImprovmentTest2(RunType runType)
        {
            var populationManager = new TestPopulationManager(new double[] { 1, 1, 1 });

            populationManager.SetPopulationGenerated(new[] { new double[] { 2, 2, 2 } });
            using (var engine = new TestGeneticSearchEngineBuilder(POPULATION_SIZE, 4, populationManager)
                                .AddPopulationRenwalManager(new RenewIfNoImprovment(2, 10, 1)).IncludeAllHistory().Build())
            {
                var result = engine.Run(runType);

                Assert.AreEqual(2, result.BestChromosome.Evaluate());
            }
        }
        public void SearchTimeTest(RunType runType)
        {
            var populationManager = new TestPopulationManager(new double[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 });

            using (var engine1 = new TestGeneticSearchEngineBuilder(10, 10, populationManager).Build())
                using (var engine2 = new TestGeneticSearchEngineBuilder(10, 1000, populationManager).Build())
                {
                    var result1 = engine1.Run(runType);
                    var result2 = engine2.Run(runType);

                    Assert.IsTrue(result2.SearchTime > result1.SearchTime, $"engine1 ran for less time than engine2 (engine1 = {result1.SearchTime}; engine2 = {result2.SearchTime})");
                }
        }
        public void HistoryIsRightTest(RunType runType)
        {
            var population        = new[] { new double[] { 1, 1, 1 }, new double[] { 2, 2, 2 }, new double[] { 2, 3, 2 } };
            var populationManager = new TestPopulationManager(population);

            using (var searchEngine =
                       new TestGeneticSearchEngineBuilder(population[0].Length, population.Length - 1, populationManager)
                       .IncludeAllHistory().Build())
            {
                var result = searchEngine.Run(runType);

                result.History.AssertHasEvaluation(population);
            }
        }
Exemple #15
0
        public void ReturnChromosomeEvaluationIfSet()
        {
            var evaluation          = 8;
            var chromosomeEvaluator = A.Fake <IChromosomeEvaluator>();

            A.CallTo(() => chromosomeEvaluator.Evaluate(A <IChromosome> ._)).Returns(evaluation);
            var engine = new TestGeneticSearchEngineBuilder(2, 10, new double[] { 1, 1 }).SetCustomChromosomeEvaluator(chromosomeEvaluator).Build();
            var result = engine.Next();

            foreach (var actualEvaluation in result.Population.GetEvaluations())
            {
                Assert.AreEqual(evaluation, actualEvaluation);
            }
        }
Exemple #16
0
        public void GetCurrentPopulation_EngineRunning_ThrowException()
        {
            using (var engine =
                       new TestGeneticSearchEngineBuilder(2, int.MaxValue, new TestPopulationManager(new double[] { 2, 2 })).Build())
            {
                Task.Run(() => engine.Run());
                while (!engine.IsRunning)
                {
                    ;
                }

                engine.GetCurrentPopulation();
                Assert.Fail("Should have thrown an exception by now");
            }
        }
        public void SearchTimeRunTest()
        {
            var populationManager = new TestPopulationManager(new double[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 });

            using (var engine = new TestGeneticSearchEngineBuilder(10, 50, populationManager).Build())
            {
                var stopwatch = new Stopwatch();
                stopwatch.Start();
                var result = engine.Run();
                stopwatch.Stop();

                Assert.IsTrue(stopwatch.Elapsed.TotalMilliseconds * 0.90 < stopwatch.Elapsed.TotalMilliseconds, $"time is too short. {nameof(stopwatch.Elapsed)} = {stopwatch.Elapsed}; {nameof(result.SearchTime)} = {result.SearchTime.TotalMilliseconds}");
                Assert.IsTrue(stopwatch.Elapsed.TotalMilliseconds * 1.1 > stopwatch.Elapsed.TotalMilliseconds, $"time is too long. {nameof(stopwatch.Elapsed)} = {stopwatch.Elapsed}; {nameof(result.SearchTime)} = {result.SearchTime.TotalMilliseconds}");
            }
        }
        public void StopIfNoImprovmentTest2(RunType runType)
        {
            Utils.RunTimedTest(() =>
            {
                var populationManager = new TestPopulationManager(new[]
                                                                  { new double[] { 1, 1, 1 }, new double[] { 2, 2.5, 2 }, new double[] { 3, 3, 3 } });
                using (var engine = new TestGeneticSearchEngineBuilder(POPULATION_SIZE, MAX_GENERATIONS, populationManager)
                                    .AddStopManager(new StopIfNoImprovment(1, 0.9)).IncludeAllHistory().Build())
                {
                    var result = engine.Run(runType);

                    Assert.AreEqual(3, result.Generations);
                }
            });
        }
Exemple #19
0
        public void RenewAtDifferenceBetweenAverageAndMaximumFitnessTest(RunType runType)
        {
            var populationManager = new TestPopulationManager(new double[] { 1, 2, 1 });

            populationManager.SetPopulationGenerated(new[]
                                                     { new double[] { 2, 5, 2 }, new double[] { 6, 6, 6 }, new double[] { 7, 7, 7 } });
            using (var engine = new TestGeneticSearchEngineBuilder(POPULATION_SIZE, 4, populationManager)
                                .AddPopulationRenwalManager(new RenewAtDifferenceBetweenAverageAndMaximumFitness(1, 1))
                                .IncludeAllHistory().Build())
            {
                var result = engine.Run(runType);

                Assert.AreEqual(5, result.BestChromosome.Evaluate());
            }
        }
Exemple #20
0
        public void ResultGetsRightEnvironment()
        {
            var populationManager = new TestPopulationManager(new double[] { 0, 0 }, c => c.Evaluate() + 1);
            var engine            = new TestGeneticSearchEngineBuilder(2, 10, populationManager).SetCustomChromosomeEvaluator(A.Fake <IChromosomeEvaluator>()).Build();

            int i;

            for (i = 0; i < 4; i++)
            {
                var result = engine.Next();
                AssertIsRightEnvironment(result.Environment, i);
            }

            Assert.AreNotEqual(0, i, "SetEnvierment was never called");
        }
Exemple #21
0
        public void ConvertPopulation_PopulationConverted()
        {
            var newPopulationEvaluation = new double[] { 2, 2, 2 };
            var populationManager       = new TestPopulationManager(new double[] { 1, 1, 1 });
            var engine = new TestGeneticSearchEngineBuilder(3, 10, populationManager).Build();

            engine.Next();

            var newPopulation = engine.SetCurrentPopulation(newPopulationEvaluation.ToChromosomes("Converted"));

            newPopulation.Population.GetChromosomes().AssertHasEvaluation(newPopulationEvaluation);

            newPopulation = engine.GetCurrentPopulation();
            newPopulation.Population.GetChromosomes().AssertHasEvaluation(newPopulationEvaluation);
        }
Exemple #22
0
        public void RenewOnlySomeChromosomes(RunType runType)
        {
            var populationManager = new TestPopulationManager(new double[] { 4, 4, 4 });

            populationManager.SetPopulationGenerated(new[]
                                                     { new double[] { 3, 3, 3 }, new double[] { 2, 2, 2 }, new double[] { 1, 1, 1 } });
            using (var engine = new TestGeneticSearchEngineBuilder(POPULATION_SIZE, 4, populationManager)
                                .AddPopulationRenwalManager(new RenewAtConvergence(0.9, 0.5))
                                .IncludeAllHistory().Build())
            {
                var result = engine.Run(runType);

                Assert.AreEqual(4, result.BestChromosome.Evaluate());
            }
        }
Exemple #23
0
        public void RenewPercantagePopulation_PercentageRenewed(double percent)
        {
            var populationManager = new TestPopulationManager(new double[] { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 });

            populationManager.SetPopulationGenerated(new[] { new double[] { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 } });
            var engine =
                new TestGeneticSearchEngineBuilder(10, int.MaxValue, populationManager).Build();

            engine.Next();

            var result        = engine.RenewPopulation(percent);
            var threeCounters = result.Population.Count(chromosme => chromosme.Evaluation == 3);

            Assert.AreEqual(percent * 10, threeCounters);
        }
        public void ChangeHistoryLastGeneration_AlgorithmPopulationNotChanged()
        {
            var expectedPopulation = new double[] { 1, 1 };
            var engine             = new TestGeneticSearchEngineBuilder(2, 10, expectedPopulation).IncludeAllHistory().Build();
            var fakeChromosome     = ChromosomeFactory.CreateChromosome(10, "ChangedChromosome");

            var result = engine.Next();

            result.History[result.History.Count - 1][0] = fakeChromosome;
            result = engine.GetCurrentPopulation();

            foreach (var chromosome in result.Population.GetChromosomes())
            {
                Assert.AreNotEqual(fakeChromosome, chromosome);
            }
        }
Exemple #25
0
        public void RenewPopulation_CheckPopulationRenewedSentToNextGeneration()
        {
            var populationManager = new TestPopulationManager(new double[] { 2, 2 }, c => c.Evaluate() + 1);

            populationManager.SetPopulationGenerated(new[] { new double[] { 3, 3 } });
            var engine =
                new TestGeneticSearchEngineBuilder(2, int.MaxValue, populationManager).Build();

            engine.Next();
            engine.RenewPopulation(1);
            var result = engine.Next();

            foreach (var chromosme in result.Population)
            {
                Assert.AreEqual(4, chromosme.Evaluation);
            }
        }
        public void IsCompletedTests()
        {
            var generations       = 30;
            var populationManager = new TestPopulationManager(new double[] { 1, 2, 3 });
            var searchEngine      =
                new TestGeneticSearchEngineBuilder(3, generations, populationManager)
                .IncludeAllHistory().Build();

            for (int i = 0; i < generations - 1; i++)
            {
                var result = searchEngine.Next();
                Assert.IsFalse(result.IsCompleted, "Shouldn't have finished yet");
            }

            var finalResult = searchEngine.Next();

            Assert.IsTrue(finalResult.IsCompleted);
        }
Exemple #27
0
        public void OnNewGenerationEventGetsRightEnvironment()
        {
            var counter           = 0;
            var populationManager = new TestPopulationManager(new double[] { 0, 0 }, c => c.Evaluate() + 1);
            var engine            = new TestGeneticSearchEngineBuilder(2, 10, populationManager).SetCustomChromosomeEvaluator(A.Fake <IChromosomeEvaluator>()).Build();

            engine.OnNewGeneration += (p, en) =>
            {
                AssertIsRightEnvironment(en, counter);
                counter++;
            };

            engine.Next();
            engine.Next();
            engine.Next();

            Assert.AreNotEqual(0, counter, "SetEnvierment was never called");
        }
        public void ElitismTest(double eilentPrecentage, RunType runType)
        {
            var populationSize    = 10;
            var populationManager =
                new TestPopulationManager(
                    new double[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }, c => c.Evaluate() - 1);

            using (var engine = new TestGeneticSearchEngineBuilder(populationSize, 10, populationManager)
                                .SetElitePercentage(eilentPrecentage).IncludeAllHistory().Build())
            {
                var result        = engine.Run(runType);
                var maxEvaluation = result.BestChromosome.Evaluate();

                Assert.AreEqual(10, maxEvaluation);
                Assert.AreEqual(eilentPrecentage * populationSize,
                                result.Population.GetChromosomes().Count(c => c.Evaluate() == maxEvaluation));
            }
        }
Exemple #29
0
        public void SetCurrentPopulation_WrongNumberOfChromosomes_ThrowException()
        {
            Utils.RunTimedTest(() =>
            {
                using (var engine = new TestGeneticSearchEngineBuilder(2, int.MaxValue, new TestPopulationManager(new double[] { 2, 2 })).Build())
                {
                    Task.Run(() => engine.Run());
                    while (!engine.IsRunning)
                    {
                        ;
                    }

                    engine.SetCurrentPopulation(new double[] { 3, 3, 3 }.ToChromosomes("Converted"));

                    Assert.Fail("Should have thrown an exception by now");
                }
            });
        }
Exemple #30
0
        public void ConvertPopulationViaManager_CheckPopulationConverted()
        {
            var testPopulationManager = new TestPopulationManager(new double[] { 1, 1, 1, 1, 1 });
            var populationConverter   = A.Fake <IPopulationConverter>();
            var convertedPopulation   = new double[] { 2, 2, 2, 2, 2 };

            A.CallTo(() => populationConverter.ConvertPopulation(A <IChromosome[]> ._, A <int> ._, A <IEnvironment> ._))
            .Returns(convertedPopulation.ToChromosomes("Converted Chromosomes"));
            var engine = new TestGeneticSearchEngineBuilder(convertedPopulation.Length, 10, testPopulationManager)
                         .AddPopulationConverter(populationConverter).Build();

            var result = engine.Next();

            for (var i = 0; i < result.Population.GetChromosomes().Length; i++)
            {
                Assert.AreEqual(convertedPopulation[i], result.Population.GetChromosomes()[i].Evaluate(), "Wrong chromosome");
            }
        }