Class: Biopsy::MatingHandler

Inherits:
Object
  • Object
show all
Defined in:
lib/biopsy/optimisers/spea2.rb

Overview

ArchiveGeneration

Instance Method Summary collapse

Constructor Details

#initialize(population_size, probability_of_cross, parameter_ranges, mutation_rate) ⇒ MatingHandler

Returns a new instance of MatingHandler.



230
231
232
233
234
235
# File 'lib/biopsy/optimisers/spea2.rb', line 230

def initialize(population_size, probability_of_cross, parameter_ranges, mutation_rate)
  @probability_of_cross = probability_of_cross
  @parameter_ranges = parameter_ranges
  @population_size = population_size
  @mutation_rate = mutation_rate
end

Instance Method Details

#binary_tournament(archive) ⇒ Object



243
244
245
246
247
248
249
250
251
252
# File 'lib/biopsy/optimisers/spea2.rb', line 243

def binary_tournament(archive)
  individual_one = rand(archive.size)
  individual_two = rand(archive.size)
  individual_two = rand(archive.size) while individual_one == individual_two
  if archive[individual_one].fitness > archive[individual_two].fitness
    return archive[individual_one]
  else
    return archive[individual_two]
  end
end

#crossover(parent_one, parent_two) ⇒ Object



277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/biopsy/optimisers/spea2.rb', line 277

def crossover(parent_one, parent_two)
  return {:parameters => parent_one.parameters} if rand >= @probability_of_cross
  # create the hash if parameter_ranges that can be passed to the +:Individual:+ class
  child_parameters = {}
  parent_one.parameters.each do |parent_one_key, parent_one_value|
    if rand < 0.5
      child_parameters[parent_one_key.to_sym] = parent_one_value
    else
      child_parameters[parent_one_key.to_sym] = parent_two.parameters[parent_one_key.to_sym]
    end
  end
  return {:parameters => child_parameters}
end

#mate(parent_one, parent_two) ⇒ Object



272
273
274
275
276
# File 'lib/biopsy/optimisers/spea2.rb', line 272

def mate(parent_one, parent_two)
  child = self.crossover(parent_one, parent_two)
  child = self.mutation(child)
  return child
end

#mutation(child) ⇒ Object



290
291
292
293
294
295
# File 'lib/biopsy/optimisers/spea2.rb', line 290

def mutation child
  child[:parameters].each do |key, value|
    child[:parameters][key.to_sym] = @parameter_ranges[key.to_sym].sample(1)[0] if rand < @mutation_rate
  end
  return child
end

#reproduce(selected_to_mate) ⇒ Object



253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
# File 'lib/biopsy/optimisers/spea2.rb', line 253

def reproduce selected_to_mate
  # loop through selected
  # mate first with last
  # mate index 1 with index 2
  # mate index 2 with index 1
  # mate index 3 with index 4
  children = []
  selected_to_mate.each_with_index do |parent_one, index|
    if index == selected_to_mate.size+1
      parent_two = selected_to_mate[0]
    elsif index.modulo(2) == 1
      parent_two = selected_to_mate[index-1]
    else
      parent_two = selected_to_mate[index+1]
    end
    children << self.mate(parent_one, parent_two)
  end
  return children
end

#run(selected_to_mate) ⇒ Object



236
237
238
239
# File 'lib/biopsy/optimisers/spea2.rb', line 236

def run selected_to_mate
  new_population = reproduce(selected_to_mate)
  return new_population
end

#select_mating_population(archive) ⇒ Object



240
241
242
# File 'lib/biopsy/optimisers/spea2.rb', line 240

def select_mating_population archive
  Array.new(@population_size) {self.binary_tournament(archive)}
end