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);
        }
Example #2
0
        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);
        }