/// <summary> /// edge recombination operator (ER) /// Precondition: parent1 and parent2 contain the same alleles. /// Postcondition: child contains the same alleles as parent1. /// </summary> /// <param name="parent1"></param> /// <param name="parent2"></param> /// <returns></returns> public static Genotype EdgeRecombinationCrossover(Genotype parent1, Genotype parent2) { var count = parent1.Count; if (count <= 1) { return(parent1); } var neighbours = GetNeighbours(parent1, parent2); var previousAllele = parent1[0]; var child = new Genotype(count) { previousAllele }; while (child.Count < count) { DeleteNeighbour(neighbours, previousAllele); var insertAllele = FindNextAllele(neighbours, previousAllele); neighbours.Remove(previousAllele); child.Add(insertAllele); previousAllele = insertAllele; } return(child); }