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);
        }