class Evolvable::Mutation

Attributes

probability[RW]
rate[RW]

Public Class Methods

new(probability: nil, rate: nil) click to toggle source
# File lib/evolvable/mutation.rb, line 7
def initialize(probability: nil, rate: nil)
  @probability = probability || (rate ? 1 : 0.03)
  @rate = rate || 0
end

Public Instance Methods

call(population) click to toggle source
# File lib/evolvable/mutation.rb, line 15
def call(population)
  return population if probability.zero?

  population.instances.each do |instance|
    mutate_instance(instance) if rand <= probability
  end
  population
end

Private Instance Methods

mutate_gene(instance, gene_index) click to toggle source
# File lib/evolvable/mutation.rb, line 35
def mutate_gene(instance, gene_index)
  gene = instance.genes[gene_index]
  mutant_gene = gene.class.new
  instance.genes[gene_index] = mutant_gene
end
mutate_instance(instance) click to toggle source
# File lib/evolvable/mutation.rb, line 26
def mutate_instance(instance)
  genes_count = instance.genes.count
  return if genes_count.zero?

  return mutate_gene(instance, rand(genes_count)) if rate.zero?

  genes_count.times { |index| mutate_gene(instance, index) if rand <= rate }
end