Example #1
0
        public void WhenCrossoverIsPerformed_RandomCrossover_50pcChance_ShouldBeApprox50pcCrossoverBetweenParents()
        {
            ConfigurationProvider.Crossover.ChanceOfRandomGeneCrossover = .5d;

            Population <bool> population = new Population <bool> ();

            int genomeLength = 100000;

            population.Initialise(2, genomeLength);

            population [0].Code.For((item, i) => population [0] [i] = false);
            population [1].Code.For((item, i) => population [1] [i] = true);

            double acceptableMin = (double)genomeLength * ((double)4.5d / 10);
            double acceptableMax = (double)genomeLength * ((double)5.5d / 10);

            int crossoverCount = 0;

            Crossover crossover = CrossoverProvider.GetCrossover(Crossover.CrossoverType.Random);

            var child = crossover.PerformCrossover(population [0], population [1]);

            child.Code.ForEach(b => crossoverCount += b ? 1 : 0);

            Assert.LessOrEqual(crossoverCount, acceptableMax);
            Assert.GreaterOrEqual(crossoverCount, acceptableMin);
        }
Example #2
0
        public void WhenCustomCrossoverProviderRequested_ShouldReturnCorrectCrossover()
        {
            CrossoverProvider.AddCrossover(new CustomCrossover());

            Crossover crossover = CrossoverProvider.GetCrossover(Crossover.CrossoverType.Custom);

            Assert.AreEqual(Crossover.CrossoverType.Custom, crossover.CrossoverMethod);
        }
Example #3
0
        public void WhenCrossoverIsPerformed_ChildIsSetAsInitialised()
        {
            Population <int> population = new Population <int> ();

            population.Initialise(2, 1000);

            var crossover = CrossoverProvider.GetCrossover(Crossover.CrossoverType.OnePoint);

            Assert.IsTrue(crossover.PerformCrossover(population [0], population [1]).IsInitialised);
        }
Example #4
0
        public void WhenCrossoverPerformed_TwoPointCrossover_LogReturnsCorrectMethod()
        {
            Population <byte> population = new Population <byte> ();

            population.Initialise(2, 10000);

            var crossover = CrossoverProvider.GetCrossover(Crossover.CrossoverType.TwoPoint);

            crossover.PerformCrossover(population [0], population [1]);

            Assert.AreEqual(Crossover.CrossoverType.TwoPoint, CrossoverProvider.LastLogEntry.Method);
        }
Example #5
0
        public void WhenCrossoverPerformed_CustomCrossover_LogReturnsCorrectMethod()
        {
            Population <double> population = new Population <double> ();

            population.Initialise(2, 10020);

            var crossover = CrossoverProvider.GetCrossover(Crossover.CrossoverType.Random);

            crossover.PerformCrossover(population [0], population [1]);

            Assert.AreEqual(Crossover.CrossoverType.Random, CrossoverProvider.LastLogEntry.Method);
        }
Example #6
0
        public void WhenCrossoverSelectionDefaultIsRequested_ShouldBeCorrect()
        {
            ConfigurationProvider.EnsureIsBuilt();

            CrossoverProvider.AssertSelectionArray(
                new Crossover.CrossoverType[]
            {
                Crossover.CrossoverType.OnePoint,
                Crossover.CrossoverType.TwoPoint,
                Crossover.CrossoverType.Random
            });
        }
Example #7
0
        public void WhenCrossoverConfigurationRatiosChanged_CrossoverSelectionRequested_RequestedCrossoversShouldHaveApproxCorrectChance()
        {
            int onePoint = 0;
            int twoPoint = 0;
            int random   = 0;

            ConfigurationProvider.Crossover.OnePointCrossoverRatio = 1;
            ConfigurationProvider.Crossover.TwoPointCrossoverRatio = 1;
            ConfigurationProvider.Crossover.RandomCrossoverRatio   = 1;

            int tries = 30000;

            Enumerable.Range(0, tries)
            .ForEach(i => {
                switch (CrossoverProvider.GetNextCrossover().CrossoverMethod)
                {
                case Crossover.CrossoverType.OnePoint:
                    onePoint++;
                    break;

                case Crossover.CrossoverType.TwoPoint:
                    twoPoint++;
                    break;

                case Crossover.CrossoverType.Random:
                    random++;
                    break;
                }
            });

            double acceptableErrorPercent = .05;

            int average = (int)(tries / 3);

            int acceptableError = (int)(average * acceptableErrorPercent);

            int acceptableMin = average - acceptableError;
            int acceptableMax = average + acceptableError;

            Assert.GreaterOrEqual(onePoint, acceptableMin);
            Assert.LessOrEqual(onePoint, acceptableMax);

            Assert.GreaterOrEqual(twoPoint, acceptableMin);
            Assert.LessOrEqual(twoPoint, acceptableMax);

            Assert.GreaterOrEqual(random, acceptableMin);
            Assert.LessOrEqual(random, acceptableMax);
        }
Example #8
0
        public void WhenCrossoverIsPerformed_RandomCrossover_100pcChance_ResultingIndividualShouldBeIdenticalToParent2()
        {
            ConfigurationProvider.Crossover.ChanceOfRandomGeneCrossover = 1d;

            Population <int> population = new Population <int> ();

            population.Initialise(2, 10000);

            population [0].Code.For((item, i) => population [0] [i] = 0);
            population [1].Code.For((item, i) => population [1] [i] = 1);

            var crossover = CrossoverProvider.GetCrossover(Crossover.CrossoverType.Random);

            Individual <int> child = crossover.PerformCrossover(population [0], population [1]);

            child.Code.ForEach(i => Assert.AreEqual(1, i));
        }
Example #9
0
        public void WhenCrossoverConfigurationRatiosChanged_CrossoverSelectionRequested_ShouldBeCorrect()
        {
            ConfigurationProvider.Crossover.OnePointCrossoverRatio = 4;
            ConfigurationProvider.Crossover.TwoPointCrossoverRatio = 3;
            ConfigurationProvider.Crossover.RandomCrossoverRatio   = 1;

            CrossoverProvider.AssertSelectionArray(
                new Crossover.CrossoverType[]
            {
                Crossover.CrossoverType.OnePoint,
                Crossover.CrossoverType.OnePoint,
                Crossover.CrossoverType.OnePoint,
                Crossover.CrossoverType.OnePoint,
                Crossover.CrossoverType.TwoPoint,
                Crossover.CrossoverType.TwoPoint,
                Crossover.CrossoverType.TwoPoint,
                Crossover.CrossoverType.Random
            });
        }
Example #10
0
        public void WhenCrossoverSelectionDefaultIsRequested_RequestedCrossoversShouldHaveApproxEqualChance()
        {
            int onePoint = 0;
            int twoPoint = 0;
            int random   = 0;

            int tries = 10000;

            int min = (int)(tries * ((double)3 / 10));
            int max = (int)(tries * ((double)4 / 10));

            ConfigurationProvider.EnsureIsBuilt();

            for (int i = 0; i < tries; i++)
            {
                switch (CrossoverProvider.GetNextCrossover().CrossoverMethod)
                {
                case Crossover.CrossoverType.OnePoint:
                    onePoint++;
                    break;

                case Crossover.CrossoverType.TwoPoint:
                    twoPoint++;
                    break;

                case Crossover.CrossoverType.Random:
                    random++;
                    break;
                }
            }

            Assert.LessOrEqual(onePoint, max);
            Assert.GreaterOrEqual(onePoint, min);

            Assert.LessOrEqual(twoPoint, max);
            Assert.GreaterOrEqual(twoPoint, min);

            Assert.LessOrEqual(random, max);
            Assert.GreaterOrEqual(random, min);
        }
Example #11
0
        public void WhenCrossoverIsPerformed_OnePointCrossover_ResultingIndividualShouldHaveCorrectCode()
        {
            var crossover = CrossoverProvider.GetCrossover(Crossover.CrossoverType.OnePoint);

            Population <int> population = new Population <int> ();

            population.Initialise(2, 1000);

            population [0].Code.For((item, i) => population [0].Code [i] = 10);
            population [1].Code.For((item, i) => population [1].Code [i] = 20);

            Individual <int> child = crossover.PerformCrossover(population [0], population [1]);

            for (int i = 0; i < CrossoverProvider.LastLogEntry.As <OnePointCrossoverLogEntry> ().CrossoverPoint; i++)
            {
                Assert.AreEqual(population [0] [i], child[i]);
            }

            for (int i = CrossoverProvider.LastLogEntry.As <OnePointCrossoverLogEntry> ().CrossoverPoint; i < child.GenomeLength; i++)
            {
                Assert.AreEqual(population [1] [i], child[i]);
            }
        }
Example #12
0
        public void WhenCrossoverIsPerformed_TwoPointCrossover_ResultingIndividualShouldHaveCorrectCode()
        {
            Population <bool> population = new Population <bool> ();

            population.Initialise(2, 10000);

            population [0].Code.For((item, i) => population [0].Code [i] = false);
            population [1].Code.For((item, i) => population [1].Code [i] = true);

            var crossover = CrossoverProvider.GetCrossover(Crossover.CrossoverType.TwoPoint);

            Individual <bool> child = crossover.PerformCrossover(population [0], population [1]);

            var log = CrossoverProvider.LastLogEntry.As <TwoPointCrossoverLogEntry> ();

            int crossoverPoint1 = log.CrossoverPointStart;
            int crossoverPoint2 = log.CrossoverPointFinish;

            child.Code.For((item, i) => {
                bool pass = (i >= crossoverPoint1 && i <= crossoverPoint2) == item;

                Assert.IsTrue(pass);
            });
        }
Example #13
0
        public void WhenRandomCrossoverProviderRequested_ShouldReturnCorrectCrossover()
        {
            Crossover crossover = CrossoverProvider.GetCrossover(Crossover.CrossoverType.Random);

            Assert.AreEqual(Crossover.CrossoverType.Random, crossover.CrossoverMethod);
        }
Example #14
0
        public void WhenTwoPointCrossoverProviderRequested_ShouldReturnCorrectCrossover()
        {
            Crossover crossover = CrossoverProvider.GetCrossover(Crossover.CrossoverType.TwoPoint);

            Assert.AreEqual(Crossover.CrossoverType.TwoPoint, crossover.CrossoverMethod);
        }
Example #15
0
 public void WhenOnePointCrossoverProviderRequested_ShouldReturnCorrectCrossover()
 {
     Assert.AreEqual(Crossover.CrossoverType.OnePoint,
                     CrossoverProvider.GetCrossover(Crossover.CrossoverType.OnePoint).CrossoverMethod);
 }
Example #16
0
        public void WhenCustomCrossoverProviderRequested_ShouldNotThrowException()
        {
            CrossoverProvider.GetCrossover(Crossover.CrossoverType.Custom);

            Assert.Pass();
        }
Example #17
0
        public void WhenTwoPointCrossoverProviderRequested_ShouldNotThrowException()
        {
            CrossoverProvider.GetCrossover(Crossover.CrossoverType.TwoPoint);

            Assert.Pass();
        }
Example #18
0
        public void TestSetup()
        {
            ConfigurationProvider.Reset();

            CrossoverProvider.Reset();
        }