/// <summary>
        /// Only send the random if the compoment calling shuffle doesn't need to be thread safe.
        /// </summary>
        public static T[] Shuffle <T>(this ICollection <T> collection, Random random = null)
        {
            var array = collection.ToArray();
            int n     = array.Length;

            while (n > 1)
            {
                n--;
                int k = random != null?random.Next(n + 1) : ProbabilityUtils.GetRandomInt(n + 1);

                T value = array[k];
                array[k] = array[n];
                array[n] = value;
            }

            return(array);
        }
Exemplo n.º 2
0
        public IChromosome[] GenerateChildren(Population population, int number, int generation, IEnvironment environment)
        {
            if (number < 1)
            {
                throw new InternalSearchException("Code 1003 (requested 0 children)");
            }

            selectionStrategy.SetPopulation(population, number * 2);
            var mutationProbability = mutationManager.MutationProbability(population, environment, generation);

            CheckMuationProbability(mutationProbability);

            var children = new ConcurrentBag <IChromosome>();
            var tasks    = new Task[number];

            for (int i = 0; i < number; i++)
            {
                tasks[i] = Task.Run(() =>
                {
                    var parent1 = AssertNotNull(selectionStrategy.SelectChromosome());
                    var parent2 = AssertNotNull(selectionStrategy.SelectChromosome());
                    var child   = crossoverManager.Crossover(parent1, parent2);
                    if (ProbabilityUtils.P(mutationProbability))
                    {
                        child.Mutate();
                    }
                    children.Add(child);
                });
            }

            foreach (var task in tasks)
            {
                task.Wait();
            }

            return(children.ToArray());
        }