Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
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());
        }