Example #1
0
        public void ConvertPopulation_NextGetsRightPopulation()
        {
            var newPopulationEvaluation = new double[] { 2, 2, 2 };
            var populationManager       = new TestPopulationManager(new double[] { 1, 1, 1 }, c => c.Evaluate());
            var engine = new TestGeneticSearchEngineBuilder(3, 10, populationManager).Build();

            engine.Next();

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

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

            newPopulation = engine.Next();
            newPopulation.Population.GetChromosomes().AssertHasEvaluation(newPopulationEvaluation);
        }
Example #2
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();
            }
        }
Example #3
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);
            }
        }
Example #4
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 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);
        }
        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());
        }
Example #7
0
        public void ChromosomeEvaluatorGetRightEnvironment()
        {
            var counter             = 0;
            var chromosomeEvaluator = A.Fake <IChromosomeEvaluator>();

            A.CallTo(() => chromosomeEvaluator.SetEnvierment(A <IEnvironment> ._)).Invokes((IEnvironment e) =>
            {
                AssertIsRightEnvironment(e, counter);
                counter++;
            });
            var populationManager = new TestPopulationManager(new double[] { 0, 0 }, c => c.Evaluate() + 1);
            var engine            = new TestGeneticSearchEngineBuilder(2, 10, populationManager).SetCustomChromosomeEvaluator(chromosomeEvaluator).Build();

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

            Assert.AreNotEqual(0, counter, "SetEnvierment was never called");
        }
Example #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");
        }
Example #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();
        }
Example #10
0
        public void StopManagerGetsRightEnvironment()
        {
            var counter           = 0;
            var populationManager = new TestPopulationManager(new double[] { 0, 0 }, c => c.Evaluate() + 1);
            var stopManager       = A.Fake <IStopManager>();

            A.CallTo(() => stopManager.ShouldStop(A <Population> ._, A <IEnvironment> ._, A <int> ._)).Invokes((Population p, IEnvironment e, int g) =>
            {
                AssertIsRightEnvironment(e, counter);
                counter++;
            });
            var engine = new TestGeneticSearchEngineBuilder(2, 10, populationManager)
                         .SetEnvironment(new DefaultEnvironment()).AddStopManager(stopManager).Build();

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

            Assert.AreNotEqual(0, counter, "SetEnvierment was never called");
        }
Example #11
0
        public void UpdateEnviermentGetRightParameters()
        {
            var counter     = 0;
            var environment = A.Fake <IEnvironment>();

            A.CallTo(() => environment.UpdateEnvierment(A <IChromosome[]> ._, A <int> ._)).Invokes((IChromosome[] c, int g) =>
            {
                Assert.AreEqual(counter, g, "Wrong generation provided");
                foreach (var chromosome in c)
                {
                    Assert.AreEqual(counter, chromosome.Evaluate(), "Wrong chromosome provided");
                }
                counter++;
            });
            var populationManager = new TestPopulationManager(new double[] { 0, 0 }, c => c.Evaluate() + 1);
            var engine            = new TestGeneticSearchEngineBuilder(2, 10, populationManager).SetEnvironment(environment).Build();

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

            Assert.AreNotEqual(0, counter, "UpdateEnvierment was never called");
        }
Example #12
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);
            }
        }
Example #13
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");
        }
Example #14
0
        public void PopulationConverterGetsRightEnvironment()
        {
            var counter             = 0;
            var populationManager   = new TestPopulationManager(new double[] { 0, 0 }, c => c.Evaluate() + 1);
            var populationConverter = A.Fake <IPopulationConverter>();

            A.CallTo(() => populationConverter.ConvertPopulation(A <IChromosome[]> ._, A <int> ._, A <IEnvironment> ._)).ReturnsLazily((IChromosome[] c, int g, IEnvironment e) =>
            {
                if (counter > 0)
                {
                    AssertIsRightEnvironment(e, counter - 1);
                }
                counter++;
                return(c);
            });
            var engine = new TestGeneticSearchEngineBuilder(2, 10, populationManager)
                         .SetEnvironment(new DefaultEnvironment()).AddPopulationConverter(populationConverter).Build();

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

            Assert.AreNotEqual(0, counter, "SetEnvierment was never called");
        }
Example #15
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);
            }
        }
Example #17
0
        public void SetPopulation_PopulationSet()
        {
            Utils.RunTimedTest(() =>
            {
                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);
            });
        }
Example #18
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");
            }
        }
Example #19
0
        public void MultipleConvertPopulationManagers_ManagersCalledAndInOrder()
        {
            var testPopulationManager = new TestPopulationManager(new double[] { 1, 1, 1, 1, 1 });
            var populationConverter1  = GetOrderedPopulationManager(1);
            var populationConverter2  = GetOrderedPopulationManager(2);
            var populationConverter3  = GetOrderedPopulationManager(3);
            var engine = new TestGeneticSearchEngineBuilder(5, 10, testPopulationManager)
                         .AddPopulationConverter(populationConverter1)
                         .AddPopulationConverter(populationConverter2)
                         .AddPopulationConverter(populationConverter3)
                         .Build();

            var result = engine.Next();

            foreach (var chromosome in result.Population.GetChromosomes())
            {
                Assert.AreEqual(4, chromosome.Evaluate(), "Ended up with wrong chromosome");
            }
        }
Example #20
0
        public void AddMultipleConvertPopulationManagers_AllManagersAreCalled()
        {
            bool manager1Called = false, manager2Called = false;
            var  testPopulationManager = new TestPopulationManager(new double[] { 1, 1, 1, 1, 1 });
            var  managers = new[] { A.Fake <IPopulationConverter>(), A.Fake <IPopulationConverter>() };

            A.CallTo(() => managers[0].ConvertPopulation(A <IChromosome[]> ._, A <int> ._, A <IEnvironment> ._))
            .Invokes((IChromosome[] c, int g, IEnvironment e) => manager1Called = true);
            A.CallTo(() => managers[1].ConvertPopulation(A <IChromosome[]> ._, A <int> ._, A <IEnvironment> ._))
            .Invokes((IChromosome[] c, int g, IEnvironment e) => manager2Called = true);

            var engine = new TestGeneticSearchEngineBuilder(5, 10, testPopulationManager)
                         .AddPopulationConverters(managers)
                         .Build();

            engine.Next();

            Assert.IsTrue(manager1Called);
            Assert.IsTrue(manager2Called);
        }
        public void NextGetsRightGenerationsTest()
        {
            var population        = new[] { new double[] { 1, 1, 1 }, new double[] { 2, 2, 2 }, new double[] { 2, 3, 2 } };
            var populationManager = new TestPopulationManager(population);
            var searchEngine      =
                new TestGeneticSearchEngineBuilder(population[0].Length, population.Length, populationManager)
                .IncludeAllHistory().Build();

            var actualPopulation       = new List <IChromosome[]>();
            GeneticSearchResult result = null;

            while (result == null || !result.IsCompleted)
            {
                result = searchEngine.Next();
                actualPopulation.Add(result.Population.GetChromosomes());
            }

            Assert.AreEqual(3, result.Generations, "We should have ran for 3 generations");
            actualPopulation.AssertHasEvaluation(population);
        }
Example #22
0
        public void AddMultiplePopulationRenewalManagers_AllManagersAreCalled()
        {
            bool manager1Called = false, manager2Called = false;
            var  testPopulationManager = new TestPopulationManager(new double[] { 1, 1, 1, 1, 1 });
            var  managers = new[] { A.Fake <IPopulationRenwalManager>(), A.Fake <IPopulationRenwalManager>() };

            A.CallTo(() => managers[0].ShouldRenew(A <Population> ._, A <IEnvironment> ._, A <int> ._))
            .Invokes((Population p, IEnvironment e, int g) => manager1Called = true);
            A.CallTo(() => managers[1].ShouldRenew(A <Population> ._, A <IEnvironment> ._, A <int> ._))
            .Invokes((Population p, IEnvironment e, int g) => manager2Called = true);

            using (var engine = new TestGeneticSearchEngineBuilder(5, 10, testPopulationManager)
                                .AddPopulationRenwalManagers(managers)
                                .Build())
            {
                engine.Next();

                Assert.IsTrue(manager1Called);
                Assert.IsTrue(manager2Called);
            }
        }
        public void SearchTimeWithNextTest()
        {
            var generations       = 50;
            var populationManager = new TestPopulationManager(new double[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }, millisecondsPerGeneration: 10);
            var engine            = new TestGeneticSearchEngineBuilder(10, generations, populationManager).Build();

            var stopwatch = new Stopwatch();

            stopwatch.Start();
            GeneticSearchResult result = null;

            while (result == null || !result.IsCompleted)
            {
                result = engine.Next();
            }

            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}");
        }