Class: EvoSynth::Mutations::BinaryMutation

Inherits:
Object
  • Object
show all
Defined in:
lib/evosynth/operators/mutations/binary_mutation.rb

Overview

This mutations flips each gene in the genome of a given individual using the given flip function (a lambda) with a given probability and returns a mutated individual. To use this mutation the flip_function has to return the negation/inverse of a given gene. This mutations is based on BINAERE-MUTATION (Weicker 2007, page 59).

Constant Summary collapse

DEFAULT_PROBABILITY =

the default mutation probability

0.1

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(flip_function, probability = DEFAULT_PROBABILITY) ⇒ BinaryMutation

:call-seq: BinaryMutation.new(Lambda) -> BinaryMutation BinaryMutation.new(Lambda, Float) -> BinaryMutation (overrides default probability)

Returns a new BinaryMutation. In the first form, the default mutation probability BinaryMutation::DEFAULT_PROBABILITY (0.1) is used. In the second it creates a BinaryMutation with the given probability.

custom_flip_function = lambda { |gene| EvoSynth.rand(42 * gene) }
BinaryMutation.new(custom_flip_function)
BinaryMutation.new(EvoSynth::Mutations::Functions::FLIP_BOOLEAN, 0.01)


57
58
59
60
# File 'lib/evosynth/operators/mutations/binary_mutation.rb', line 57

def initialize(flip_function, probability = DEFAULT_PROBABILITY)
  @flip_function = flip_function
  @probability = probability
end

Instance Attribute Details

#flip_functionObject

This function (lambda) is used to flip each gene



40
41
42
# File 'lib/evosynth/operators/mutations/binary_mutation.rb', line 40

def flip_function
  @flip_function
end

#probabilityObject

Each gene is flipped with this probability (should be between 0 and 1)



36
37
38
# File 'lib/evosynth/operators/mutations/binary_mutation.rb', line 36

def probability
  @probability
end

Instance Method Details

#mutate(individual) ⇒ Object

:call-seq: mutate(Individual) -> Individual

Returns the mutation (with the given flip function) of a given individual.

m = BinaryMutation.new
m.mutate(a_individual)   #=> a_new_individual


70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/evosynth/operators/mutations/binary_mutation.rb', line 70

def mutate(individual)
  mutated = individual.deep_clone
  genome = mutated.genome

  genome.size.times do |index|
    if @flip_function.arity == 1
      genome[index] = @flip_function.call(genome[index]) if EvoSynth.rand <= @probability
    else
      genome[index] = @flip_function.call if EvoSynth.rand <= @probability
    end
  end

  mutated
end

#to_sObject

:call-seq: to_s -> string

Returns description of this mutation

m = BinaryMutation.new(0.01)
m.to_s                   #=> "binary mutation <probability: 0.01>"


93
94
95
# File 'lib/evosynth/operators/mutations/binary_mutation.rb', line 93

def to_s
  "binary mutation <probability: #{@probability}>"
end