/// <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) { 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()); } }
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)); } } }
/// <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)); } }
/// <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); }