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