private void DetermineCrossoverPoints(int numberOfGenes, GAConfiguration configuration)
        {
            _firstCrossoverPoint  = configuration.GetRandomInteger(1, numberOfGenes - 1);
            _secondCrossoverPoint = configuration.GetRandomInteger(1, numberOfGenes - 1, _firstCrossoverPoint);

            if (_firstCrossoverPoint > _secondCrossoverPoint)
            {
                var temp = _firstCrossoverPoint;
                _firstCrossoverPoint  = _secondCrossoverPoint;
                _secondCrossoverPoint = temp;
            }
        }
Beispiel #2
0
        protected override Chromosome Perform(Chromosome father, Chromosome mother, GAConfiguration configuration)
        {
            var geneCount = father.Genes.Length;

            var childOne = new UnorderedChromosome(geneCount);
            var childTwo = new UnorderedChromosome(geneCount);

            var crossoverPoint = configuration.GetRandomInteger(1, father.Genes.Length - 1);

            for (int i = 0; i < geneCount; i++)
            {
                if (i < crossoverPoint)
                {
                    childOne.Genes[i] = father.Genes[i];
                    childTwo.Genes[i] = mother.Genes[i];
                }
                else
                {
                    childOne.Genes[i] = mother.Genes[i];
                    childTwo.Genes[i] = father.Genes[i];
                }
            }

            if (configuration.GetNextDouble() < 0.5)
            {
                return(childOne);
            }
            else
            {
                return(childTwo);
            }
        }
Beispiel #3
0
        protected override Chromosome Perform(Chromosome father, Chromosome mother, GAConfiguration settings)
        {
            var geneCount      = father.Genes.Length;
            var child          = new OrderedChromosome(geneCount);
            var crossoverPoint = settings.GetRandomInteger(1, father.Genes.Length - 1);

            var seen = new HashSet <Gene>();

            for (int i = 0; i < crossoverPoint; i++)
            {
                child.Genes[i] = father.Genes[i];
                seen.Add(father.Genes[i]);
            }

            var count = 0;

            for (int i = 0; i < geneCount; i++)
            {
                if (!seen.Contains(mother.Genes[i]))
                {
                    child.Genes[crossoverPoint + count] = mother.Genes[i];
                    seen.Add(mother.Genes[i]);
                    count++;
                }
            }

            return(child);
        }
Beispiel #4
0
        protected override void Perform(GAConfiguration settings, Chromosome chromosome, int geneIndex)
        {
            var secondMutationPoint = settings.GetRandomInteger(0, chromosome.Genes.Length - 1, geneIndex);

            if (geneIndex > secondMutationPoint)
            {
                var temp = secondMutationPoint;
                secondMutationPoint = geneIndex;
                geneIndex           = temp;
            }

            Scramble(chromosome, geneIndex, secondMutationPoint, settings);
        }
Beispiel #5
0
        protected override void Perform(GAConfiguration settings, Chromosome chromosome, int geneIndex)
        {
            var secondMutationPoint = settings.GetRandomInteger(0, chromosome.Genes.Length - 1, geneIndex);

            FlipGenes(chromosome, geneIndex, secondMutationPoint);
        }