/// <summary>
        /// Mutate the specified chromosome.
        /// </summary>
        /// <param name="chromosome">The chromosome.</param>
        /// <param name="probability">The probability to mutate each chromosome.</param>
        protected override void PerformMutate(IChromosome chromosome, float probability)
        {
            ExceptionHelper.ThrowIfNull("chromosome", chromosome);

            var genesLength = chromosome.Length;

            if (m_mutableGenesIndexes == null || m_mutableGenesIndexes.Length == 0)
            {
                if (m_allGenesMutable)
                {
                    m_mutableGenesIndexes = Enumerable.Range(0, genesLength).ToArray();
                }
                else
                {
                    m_mutableGenesIndexes = RandomizationProvider.Current.GetInts(1, 0, genesLength);
                }
            }

            foreach (var i in m_mutableGenesIndexes)
            {
                if (i >= genesLength)
                {
                    throw new MutationException(this, "The chromosome has no gene on index {0}. The chromosome genes length is {1}.".With(i, genesLength));
                }

                if (RandomizationProvider.Current.GetDouble() <= probability)
                {
                    chromosome.ReplaceGene(i, chromosome.GenerateGene(i));
                }
            }
        }
        /// <summary>
        /// Mutate the specified chromosome.
        /// </summary>
        /// <param name="chromosome">The chromosome.</param>
        /// <param name="probability">The probability to mutate each chromosome.</param>
        protected override void PerformMutate(IChromosome chromosome, float probability)
        {
            ExceptionHelper.ThrowIfNull("chromosome", chromosome);

            var genesLength = chromosome.Length;

            if (m_mutableGenesIndexes == null || m_mutableGenesIndexes.Length == 0)
            {
                if (m_allGenesMutable)
                {
                    m_mutableGenesIndexes = Enumerable.Range(0, genesLength).ToArray();
                }
                else
                {
                    m_mutableGenesIndexes = RandomizationProvider.Current.GetInts(1, 0, genesLength);
                }
            }

            foreach (var i in m_mutableGenesIndexes)
            {
                if (i >= genesLength)
                {
                    throw new MutationException(this, "The chromosome has no gene on index {0}. The chromosome genes length is {1}.".With(i, genesLength));
                }

                if (RandomizationProvider.Current.GetDouble() <= probability)
                {
                    chromosome.ReplaceGene(i, chromosome.GenerateGene(i));
                }
            }
        }
Example #3
0
        /// <summary>
        /// Mutate the specified chromosome.
        /// </summary>
        /// <param name="chromosome">The chromosome.</param>
        /// <param name="probability">The probability to mutate each chromosome.</param>
        protected override void PerformMutate(IChromosome chromosome, float probability)
        {
            if (RandomizationProvider.Current.GetFloat() < probability)
            {
                // Get random insertion size and index
                int insertionSize = RandomizationProvider.Current.GetInt(MinInsertionSize, MaxInsertionSize);
                int index         = RandomizationProvider.Current.GetInt(0, chromosome.Length - 1);


                // Generate new genes for insertion
                List <Gene> newGenes = new List <Gene>();

                for (int i = 0; i < insertionSize; i++)
                {
                    newGenes.Add(chromosome.GenerateGene(index + i));
                }

                // Get genes from chromosome and insert generated ones
                List <Gene> genes = new List <Gene>();
                genes.AddRange(chromosome.GetGenes());
                genes.InsertRange(index, newGenes);


                // Resize chromosome and replace with new
                chromosome.Resize(genes.Count);

                chromosome.ReplaceGenes(0, genes.ToArray());
            }
        }
Example #4
0
        protected override void PerformMutate(IChromosome chromosome, float probability)
        {
            for (int i = 0; i < chromosome.Length; i++)
            {
                double rnd = RandomizationProvider.Current.GetDouble();

                if (rnd <= probability)
                {
                    int value = (int)chromosome.GetGene(i).Value;

                    if (rnd <= probability / 2)
                    {
                        value++;
                    }
                    else
                    {
                        value--;
                    }

                    chromosome.ReplaceGene(i, new Gene(value));
                }
                else if (rnd >= .8f)
                {
                    chromosome.ReplaceGene(i, chromosome.GenerateGene(i));
                }
            }
        }
Example #5
0
        /// <summary>
        /// Mutate the specified chromosome.
        /// </summary>
        /// <param name="chromosome">The chromosome.</param>
        /// <param name="probability">The probability to mutate each chromosome.</param>
        protected override void PerformMutate(IChromosome chromosome, float probability)
        {
            if (RandomizationProvider.Current.GetFloat() < probability)
            {
                int randIndex = RandomizationProvider.Current.GetInt(0, chromosome.Length - 1);

                // Create a new randon gene in place of the other
                chromosome.ReplaceGene(randIndex, chromosome.GenerateGene(randIndex));
            }
        }
Example #6
0
        /// <summary>
        /// Mutate the specified chromosome.
        /// </summary>
        /// <param name="chromosome">The chromosome.</param>
        /// <param name="probability">The probability to mutate each chromosome.</param>
        protected override void PerformMutate(IChromosome chromosome, float probability)
        {
            ExceptionHelper.ThrowIfNull("chromosome", chromosome);

            var genesLength = chromosome.Length;

            if (m_mutableGenesIndexes == null || m_mutableGenesIndexes.Length == 0)
            {
                if (m_allGenesMutable)
                {
                    m_mutableGenesIndexes = Enumerable.Range(0, genesLength).ToArray();
                }
                else
                {
                    m_mutableGenesIndexes = RandomizationProvider.Current.GetInts(1, 0, genesLength);
                }
            }

            foreach (var i in m_mutableGenesIndexes)
            {
                if (i >= genesLength)
                {
                    throw new MutationException(this, "The chromosome has no gene on index {0}. The chromosome genes length is {1}.".With(i, genesLength));
                }

                if (RandomizationProvider.Current.GetDouble() <= probability)
                {
                    if (chromosome is ChromosomeDE && ((chromosome as ChromosomeDE).GInfo[i] is DoubleRange))
                    {
                        var gi     = (chromosome as ChromosomeDE).GInfo[i] as DoubleRange;
                        var center = (double)chromosome.GetGene(i).Value;
                        var radius = Math.Abs(gi.Right - gi.Left) * Radius;
                        chromosome.ReplaceGene(i, new Gene(gi.GetRandValue_Uniform(center - radius, center + radius)));
                        continue;
                    }

                    chromosome.ReplaceGene(i, chromosome.GenerateGene(i));
                }
            }
        }
        /// <summary>
        /// Selects a random gene in the solution candidate and replaces it with a random generated gene.
        /// </summary>
        /// <param name="chromosome">The solution candidate.</param>
        private void MutateByCharacterFlip(IChromosome chromosome)
        {
            int randIdx = RandomizationProvider.Current.GetInt(0, chromosome.Length);

            chromosome.GenerateGene(randIdx);
        }