public Individual <T>[][] Apply(Individual <T>[] population, int parentGroupsCount, int parentsPerGroup) { int totalParentsCount = parentGroupsCount * parentsPerGroup; var allParents = new Individual <T> [totalParentsCount]; // Integral phase double[] fractionalParts; LinkedList <Individual <T> > someParents = IntegralPhase(population, totalParentsCount, out fractionalParts); someParents.CopyTo(allParents, 0); // Remainder phase int extraParentsCount = totalParentsCount - someParents.Count; Individual <T>[] extraParents = RemainderPhase(population, fractionalParts, extraParentsCount); Array.Copy(extraParents, 0, allParents, someParents.Count, extraParentsCount); // Shuffle the parents to avoid identical ones being grouped together RandomNumberGenerationUtilities.Shuffle <Individual <T> >(allParents); // Place the parents in groups int counter = 0; var parentGroups = new Individual <T> [parentGroupsCount][]; for (int group = 0; group < parentGroupsCount; ++group) { parentGroups[group] = new Individual <T> [parentsPerGroup]; for (int parent = 0; parent < parentsPerGroup; ++parent) { parentGroups[group][parent] = allParents[counter]; ++counter; } } return(parentGroups); }
public Individual <T>[][] Apply(Individual <T>[] population, int parentGroupsCount, int parentsPerGroup) { // Gather the parents that will be selected int elitesCount = (int)Math.Round(elitePercentage * population.Length); if (elitesCount == 0) { elitesCount = 1; } Array.Sort(population); var selectionPool = new Individual <T> [elitesCount]; Array.Copy(population, selectionPool, elitesCount); // Figure out how many copies of each selected parent will be used Individual <T>[] allParents = SelectEnoughElites(selectionPool, parentGroupsCount * parentsPerGroup); // Shuffle them to avoid grouping together identical parents or the fittest ones. RandomNumberGenerationUtilities.Shuffle <Individual <T> >(allParents, rng); // Place the parents in groups int counter = 0; var parentGroups = new Individual <T> [parentGroupsCount][]; for (int group = 0; group < parentGroupsCount; ++group) { parentGroups[group] = new Individual <T> [parentsPerGroup]; for (int parent = 0; parent < parentsPerGroup; ++parent) { parentGroups[group][parent] = allParents[counter]; ++counter; } } return(parentGroups); }