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