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