public IEnumerable<IChromosome> GeneratePopulation(int size)
        {
            var population = new IChromosome[size];

            for (int i = 0; i < size; i++)
                population[i] = new VectorChromosome<T>(elements.Shuffle(random), mutationManager, evaluator);

            return population;
        }
        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 IEnumerable <IChromosome> GeneratePopulation(int size)
        {
            var population = new IChromosome[size];

            for (int i = 0; i < size; i++)
            {
                var vector = repeatElements
                    ? SelectKRandomElementsRepeating(elements, length)
                    : elements.SelectKRandomElementsNonRepeating(length).Shuffle(random);
                population[i] = new VectorChromosome <T>(vector, mutationManager, evaluator);
            }
            return(population);
        }
예제 #4
0
        public static List <int> K_CrossoverGetCrossoverPointsAndAssertThatGenomesAreRight(VectorChromosome <int> newChromosome, VectorChromosome <int> chromosome2, VectorChromosome <int> chromosome1)
        {
            var crossoverPoints           = new List <int>();
            var takingFromFirstChromosome = true;

            for (int i = 0; i < chromosome1.Length; i++)
            {
                if (takingFromFirstChromosome)
                {
                    if (newChromosome[i] == chromosome2[i])
                    {
                        crossoverPoints.Add(i);
                        takingFromFirstChromosome = !takingFromFirstChromosome;
                    }
                    else if (newChromosome[i] != chromosome1[i])
                    {
                        Assert.Fail($"Got Genome that dosn't seem to have came from anywhere. 1: {chromosome1}; 2 {chromosome2}; newChromosome {newChromosome} ");
                    }
                }
                else
                {
                    if (newChromosome[i] == chromosome1[i])
                    {
                        crossoverPoints.Add(i);
                        takingFromFirstChromosome = !takingFromFirstChromosome;
                    }
                    else if (newChromosome[i] != chromosome2[i])
                    {
                        Assert.Fail($"Got Genome that doesn't seem to have came from anywhere. 1: {chromosome1}; 2 {chromosome2}; newChromosome {newChromosome} ");
                    }
                }
            }
            for (int j = chromosome1.Length; j < chromosome2.Length && j < newChromosome.GetVector().Length; j++)
            {
                Assert.AreEqual(chromosome2[j], newChromosome[j]);
            }

            return(crossoverPoints);
        }