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