public static Tuple <DNA, DNA> CrossOver(this DNA dna1, DNA dna2) { var pos = Rand.Next(1, DNA.DNALength); var newGenes1 = new List <Gene>(); newGenes1.AddRange(dna1.Take(pos)); newGenes1.AddRange(dna2.TakeLast(DNA.DNALength - pos)); var newGenes2 = new List <Gene>(); newGenes2.AddRange(dna2.Take(pos)); newGenes2.AddRange(dna1.TakeLast(DNA.DNALength - pos)); pos = Rand.Next(1, DNA.DNALength); var newGenes3 = new DNA(); newGenes3.AddRange(newGenes1.Take(pos)); newGenes3.AddRange(newGenes2.TakeLast(DNA.DNALength - pos)); var newGenes4 = new DNA(); newGenes4.AddRange(newGenes2.Take(pos)); newGenes4.AddRange(newGenes1.TakeLast(DNA.DNALength - pos)); return(new Tuple <DNA, DNA>(newGenes3, newGenes4)); }
/// <summary> /// DNA join (crossover operation) /// Appends front and back to form new DNA /// </summary> public static DNA join(DNAPartial front, DNAPartial back) { DNA child = new DNA(); child.AddRange(front); child.AddRange(back); return child; }