public void GivenSortedSubsetChromosomes_WhenOnePointCrossOver_WithConflict_ThenShouldReply()
        {
            var chromosomes = SortedSubsetTestData.CreateChromosomes();

            var random       = new PredeterminedRandom(5, 7); //Crossover gene value before and after conflicts
            var parameterSet = new ParameterSet();

            parameterSet.SetValue(ParameterNames.FailedCrossoverRetryCount, 1);
            var conflictDetectors = new List <INeighborhoodConflictDetector>()
            {
                new PredeterminedConflictDetector(false, true, true, false, false, false, false, false, false, false)
            };
            var crossover = new OnePointCrossover(random, parameterSet, conflictDetectors);

            var results = crossover.Cross(chromosomes[0], chromosomes[1]);

            var result1 = results[0] as SortedSubsetChromosome;
            var result2 = results[1] as SortedSubsetChromosome;

            result1.Sections[0].Should().BeEquivalentTo(new int[] { 1, 4, 5, 9 });
            result1.Sections[1].Should().BeEquivalentTo(new int[] { 3, 6, 7 });
            result1.Sections[2].Should().BeEquivalentTo(new int[] { 2, 8 });
            result2.Sections[0].Should().BeEquivalentTo(new int[] { 3, 4, 7 });
            result2.Sections[1].Should().BeEquivalentTo(new int[] { 2, 5, 8 });
            result2.Sections[2].Should().BeEquivalentTo(new int[] { 1, 6, 9 });
        }
        public void GivenSortedSubsetChromosomes_WhenOnePointCrossOver_ThenShouldBeProper()
        {
            var chromosomes  = SortedSubsetTestData.CreateChromosomes();
            var random       = new PredeterminedRandom(5); //Crossover gene value
            var parameterSet = new ParameterSet();

            parameterSet.SetValue(ParameterNames.FailedCrossoverRetryCount, 0);
            var conflictDetectors = new List <INeighborhoodConflictDetector>()
            {
                AllRightConflictDetector.Instance
            };
            var crossover = new OnePointCrossover(random, parameterSet, conflictDetectors);

            var results = crossover.Cross(chromosomes[0], chromosomes[1]);

            var result1 = results[0] as SortedSubsetChromosome;
            var result2 = results[1] as SortedSubsetChromosome;

            result1.Sections[0].Should().BeEquivalentTo(new int[] { 1, 4, 9 });
            result1.Sections[1].Should().BeEquivalentTo(new int[] { 3, 5, 7 });
            result1.Sections[2].Should().BeEquivalentTo(new int[] { 2, 6, 8 });
            result2.Sections[0].Should().BeEquivalentTo(new int[] { 3, 4, 5, 7 });
            result2.Sections[1].Should().BeEquivalentTo(new int[] { 2, 6, 8 });
            result2.Sections[2].Should().BeEquivalentTo(new int[] { 1, 9 });
        }
示例#3
0
        public void Cross_LessGenesThenSwapPoint_Exception()
        {
            var target      = new OnePointCrossover(1);
            var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(2);
            var chromosome2 = MockRepository.GenerateStub <ChromosomeBase>(2);

            ExceptionAssert.IsThrowing(new ArgumentOutOfRangeException("parents", "The swap point index is 1, but there is only 2 genes. The swap should result at least one gene to each side."), () =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1,
                    chromosome2
                });
            });
        }
        public void Cross_LessGenesThenSwapPoint_Exception()
        {
            var target      = new OnePointCrossover(1);
            var chromosome1 = Substitute.For <ChromosomeBase>(2);
            var chromosome2 = Substitute.For <ChromosomeBase>(2);

            Assert.Catch <ArgumentOutOfRangeException>(() =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1,
                    chromosome2
                });
            }, "The swap point index is 1, but there is only 2 genes. The swap should result at least one gene to each side.");
        }
        public void GivenSortedSubsetChromosomes_WhenOnePointCrossOver_WithConflict_ThenShouldReturnsZero()
        {
            var chromosomes = SortedSubsetTestData.CreateChromosomes();

            var random       = new PredeterminedRandom(5); //Crossover gene value
            var parameterSet = new ParameterSet();

            parameterSet.SetValue(ParameterNames.FailedCrossoverRetryCount, 0);
            var conflictDetectors = new List <INeighborhoodConflictDetector>()
            {
                new PredeterminedConflictDetector(false, true, true)
            };
            var crossover = new OnePointCrossover(random, parameterSet, conflictDetectors);

            var results = crossover.Cross(chromosomes[0], chromosomes[1]);

            results.Count.Should().Be(0);
        }
示例#6
0
        public void Cross_ParentsWithTwoGenes_Cross()
        {
            var target      = new OnePointCrossover(0);
            var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(2);

            chromosome1.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2)
            });
            chromosome1.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(2));

            var chromosome2 = MockRepository.GenerateStub <ChromosomeBase>(2);

            chromosome2.ReplaceGenes(0, new Gene[]
            {
                new Gene(3),
                new Gene(4)
            });
            chromosome2.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(2));

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

            Assert.AreEqual(2, actual.Count);
            Assert.AreEqual(2, actual[0].Length);
            Assert.AreEqual(2, actual[1].Length);

            Assert.AreEqual(1, actual[0].GetGene(0).Value);
            Assert.AreEqual(4, actual[0].GetGene(1).Value);

            Assert.AreEqual(3, actual[1].GetGene(0).Value);
            Assert.AreEqual(2, actual[1].GetGene(1).Value);
        }
        public void Cross_ParentsWithTwoGenes_Cross()
        {
            var target      = new OnePointCrossover(0);
            var chromosome1 = Substitute.For <ChromosomeBase>(2);

            chromosome1.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2)
            });
            chromosome1.CreateNew().Returns(Substitute.For <ChromosomeBase>(2));

            var chromosome2 = Substitute.For <ChromosomeBase>(2);

            chromosome2.ReplaceGenes(0, new Gene[]
            {
                new Gene(3),
                new Gene(4)
            });
            chromosome2.CreateNew().Returns(Substitute.For <ChromosomeBase>(2));

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

            Assert.AreEqual(2, actual.Count);
            Assert.AreEqual(2, actual[0].Length);
            Assert.AreEqual(2, actual[1].Length);

            Assert.AreEqual(1, actual[0].GetGene(0).Value);
            Assert.AreEqual(4, actual[0].GetGene(1).Value);

            Assert.AreEqual(3, actual[1].GetGene(0).Value);
            Assert.AreEqual(2, actual[1].GetGene(1).Value);
        }
        public IList <IChromosome> OnePointCrossover()
        {
            var target = new OnePointCrossover();

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