public void Cross_TspChromosome_Child()
        {
            var target      = new AlternatingPositionCrossover();
            var chromosome1 = new TspChromosome(100);
            var chromosome2 = new TspChromosome(100);
            var actual      = target.Cross(new TspChromosome[] { chromosome1, chromosome2 });

            Assert.AreEqual(2, actual.Count);

            CollectionAssert.AllItemsAreUnique(chromosome1.GetGenes());
            CollectionAssert.AllItemsAreUnique(chromosome2.GetGenes());
        }
        public void Cross_ParentWithNoOrderedGenes_Exception()
        {
            var target = new AlternatingPositionCrossover();

            var chromosome1 = Substitute.For <ChromosomeBase>(8);

            chromosome1.ReplaceGenes(0, new Gene[] {
                new Gene(8),
                new Gene(2),
                new Gene(3),
                new Gene(4),
                new Gene(6),
                new Gene(5),
                new Gene(7),
                new Gene(1)
            });

            // 3 7 5 1 6 8 2 4
            var chromosome2 = Substitute.For <ChromosomeBase>(8);

            chromosome2.ReplaceGenes(0, new Gene[] {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
                new Gene(5),
                new Gene(5),
                new Gene(6),
                new Gene(7)
            });

            Assert.Catch <CrossoverException>(() =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1, chromosome2
                });
            }, "The Alternating-position (AP) can be only used with ordered chromosomes. The specified chromosome has repeated genes.");
        }
        public void Cross_DocumentationSample_Child()
        {
            var target = new AlternatingPositionCrossover();

            // 1 2 3 4 5 6 7 8
            var chromosome1 = Substitute.For <ChromosomeBase>(8);

            chromosome1.ReplaceGenes(0, new Gene[] {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
                new Gene(5),
                new Gene(6),
                new Gene(7),
                new Gene(8)
            });

            var child1 = Substitute.For <ChromosomeBase>(8);

            chromosome1.CreateNew().Returns(child1);

            // 3 7 5 1 6 8 2 4
            var chromosome2 = Substitute.For <ChromosomeBase>(8);

            chromosome2.ReplaceGenes(0, new Gene[] {
                new Gene(3),
                new Gene(7),
                new Gene(5),
                new Gene(1),
                new Gene(6),
                new Gene(8),
                new Gene(2),
                new Gene(4)
            });
            var child2 = Substitute.For <ChromosomeBase>(8);

            chromosome2.CreateNew().Returns(child2);

            var actual = target.Cross(new List <IChromosome>()
            {
                chromosome1, chromosome2
            });

            Assert.AreEqual(2, actual.Count);

            // 1 3 2 7 5 4 6 8
            var actualChild = actual[0];

            Assert.AreEqual(8, actualChild.Length);

            Assert.AreEqual(1, actualChild.GetGene(0).Value);
            Assert.AreEqual(3, actualChild.GetGene(1).Value);
            Assert.AreEqual(2, actualChild.GetGene(2).Value);
            Assert.AreEqual(7, actualChild.GetGene(3).Value);
            Assert.AreEqual(5, actualChild.GetGene(4).Value);
            Assert.AreEqual(4, actualChild.GetGene(5).Value);
            Assert.AreEqual(6, actualChild.GetGene(6).Value);
            Assert.AreEqual(8, actualChild.GetGene(7).Value);

            // 3 1 7 2 5 4 6 8
            actualChild = actual[1];
            Assert.AreEqual(8, actualChild.Length);
            Assert.AreEqual(3, actualChild.GetGene(0).Value);
            Assert.AreEqual(1, actualChild.GetGene(1).Value);
            Assert.AreEqual(7, actualChild.GetGene(2).Value);
            Assert.AreEqual(2, actualChild.GetGene(3).Value);
            Assert.AreEqual(5, actualChild.GetGene(4).Value);
            Assert.AreEqual(4, actualChild.GetGene(5).Value);
            Assert.AreEqual(6, actualChild.GetGene(6).Value);
            Assert.AreEqual(8, actualChild.GetGene(7).Value);
        }
        public IList <IChromosome> AlternatingPosition()
        {
            var target = new AlternatingPositionCrossover();

            return(target.Cross(CreateTwoParents()));
        }