public List <Representation> NextGeneration() { // New generation will consist of both old and new members // Genetic operators generate as many descendants as there are parents // Every descendant will compete against a small selection of old generation // From that selection, the most similar member is chosen and competes against the descendant // Winner remains in population List <Representation> newGeneration = StaticOperations.CloneList(oldGeneration); List <Representation> eliteMembers = UniqueEliteSelection(oldGeneration.Count / 10 < 6 ? 6 : oldGeneration.Count / 10); foreach (Representation representation in eliteMembers) { Representation member = newGeneration.Find(item => item.Values.SequenceEqual(representation.Values)); newGeneration.Remove(member); } List <Representation> survivingDescendatns = new List <Representation>(); descendants.Shuffle(); descendants = descendants.Skip(eliteMembers.Count).ToList(); Random random = new Random(); foreach (Representation descendant in descendants) { // Generate random selection of old members int sampleCount = random.Next(3, 7); int[] sampleIndices = new int[sampleCount]; for (int i = 0; i < sampleCount; i++) { sampleIndices[i] = random.Next(0, newGeneration.Count); } List <Representation> sampleMembers = new List <Representation>(); for (int i = 0; i < sampleCount; i++) { sampleMembers.Add(newGeneration[sampleIndices[i]]); } // Calculate, which of the selected members is more similar to current member int[] distancesField = new int[sampleCount]; for (int i = 0; i < sampleMembers.Count; i++) { distancesField[i] = StaticOperations.TotalDistanceBetweenPaths(descendant, sampleMembers[i]); } int minDistanceIndex = 0; for (int i = 0; i < distancesField.Length; i++) { if (distancesField[minDistanceIndex] < distancesField[i]) { minDistanceIndex = i; } } // Stochastic competition // Descendant and old member fight in stochastic probabilistic tournament // based on their fitness int selectingNumber = random.Next(0, (int)(descendant.Fitness + sampleMembers[minDistanceIndex].Fitness)); if (selectingNumber <= (int)descendant.Fitness) { survivingDescendatns.Add(descendant); newGeneration.Remove(sampleMembers[minDistanceIndex]); } // Compare fitness of descendant and calculated similar member // Winner goes into new generation //if (descendant.Fitness > sampleMembers[minDistanceIndex].Fitness) //{ // survivingDescendatns.Add(descendant); // newGeneration.Remove(sampleMembers[minDistanceIndex]); //} } // New generation consists of old generation members that won their duels and // descendants that eliminated losing old generation members newGeneration.AddRange(survivingDescendatns); newGeneration.AddRange(eliteMembers); return(newGeneration); }