public static void TestThatChildChanged(this ICrossoverManager crossoverManager) { var elements = new List <string>() { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" }; var generator = new AllElementsVectorChromosomePopulationGenerator <string>(elements, null, null); // Since there's a certain chance that this test will fail, I want to run it twice var passed = false; for (int i = 0; i < 2; i++) { var parentChromosomes = generator.GeneratePopulation(2); var child = (VectorChromosome <string>)crossoverManager.Crossover(parentChromosomes.ElementAt(0), parentChromosomes.ElementAt(1)); try { ((VectorChromosome <string>)parentChromosomes.ElementAt(0)).AssertAreNotTheSame(child); ((VectorChromosome <string>)parentChromosomes.ElementAt(1)).AssertAreNotTheSame(child); passed = true; } catch { // Do nothing } } Assert.IsTrue(passed); }
private void TestCycleCrossover(string[] parent1, string[] parent2, string[] expectedChild) { var chromosome1 = new VectorChromosome <string>(parent1, null, null); var chromosome2 = new VectorChromosome <string>(parent2, null, null); var child = (VectorChromosome <string>)crossoverManager.Crossover(chromosome1, chromosome2); child.AssertAreTheSame(expectedChild); }
public static void TestThatAllElementsInEachVector(this ICrossoverManager crossoverManager, int testRuns) { var elements = new List <string>() { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" }; var generator = new AllElementsVectorChromosomePopulationGenerator <string>(elements, null, null); for (int i = 0; i < testRuns; i++) { var parentChromosomes = generator.GeneratePopulation(2); var child = (VectorChromosome <string>)crossoverManager.Crossover(parentChromosomes.ElementAt(0), parentChromosomes.ElementAt(1)); child.AssertContainSameElements(elements); } }
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()); }