Class: Biopsy::FitnessAssignment

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

Overview

Individual

Class Method Summary collapse

Class Method Details

.distance_between_points(individual_one, individual_two) ⇒ Object



131
132
133
134
135
136
137
# File 'lib/biopsy/optimisers/spea2.rb', line 131

def self.distance_between_points(individual_one, individual_two)
	if (individual_one.score - individual_two.score) < 0
		return (individual_one.score - individual_two.score)*-1
	else
		return (individual_one.score - individual_two.score)
	end
end

.distance_to_origin(coordinates) ⇒ Object



127
128
129
130
# File 'lib/biopsy/optimisers/spea2.rb', line 127

def self.distance_to_origin coordinates
	# coordinates is a hash of coordinates
	return rand(coordinates)
end

.find_distance_to_kth_point(generation_hash) ⇒ Object



177
178
179
180
181
182
183
184
185
186
187
# File 'lib/biopsy/optimisers/spea2.rb', line 177

def self.find_distance_to_kth_point generation_hash
	kth_point = Math.sqrt(generation_hash.length).round(0)
	generation_hash.each do |key, value|
		sorted_distances_array = value[1].sort_by {|k,v| v}
		(1..sorted_distances_array.length).each do |num|
			if num == (kth_point-1)
				value[0].distance_to_kth_point = sorted_distances_array[num][1]
			end
		end
	end
end

.map_points_distance(generation) ⇒ Object



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/biopsy/optimisers/spea2.rb', line 147

def self.map_points_distance generation
	generation_clone = generation.clone
	generation_hash = {}
	generation_length = generation.length
	(1..generation_length).each do |num|
		generation_hash[num.to_s] = [generation_clone.pop, {}]
	end
	generation_hash.each do |key, value|
		(1..generation_length).each do |num|
			next if key.to_i == num or generation_hash[key][1].has_key?(num.to_s)
			generation_hash[key][1][num.to_s] = distance_between_points(generation_hash[key][0], generation_hash[num.to_s][0])
			generation_hash[num.to_s][1][key] = distance_between_points(generation_hash[key][0], generation_hash[num.to_s][0])
		end
	end
	return generation_hash
end

.run(generation) ⇒ Object



120
121
122
123
124
125
126
# File 'lib/biopsy/optimisers/spea2.rb', line 120

def self.run generation
	self.score_raw_fitness(generation)
	self.score_density(generation)
	generation.each do |individual|
		individual.fitness = individual.density + individual.raw_fitness
	end
end

.score_density(generation) ⇒ Object



138
139
140
141
142
143
144
145
146
# File 'lib/biopsy/optimisers/spea2.rb', line 138

def self.score_density generation
	generation_hash = map_points_distance(generation)

	find_distance_to_kth_point(generation_hash)

	generation_hash.each do |key,value|
		value[0].density = (1.to_f/(value[0].distance_to_kth_point+2))
	end
end

.score_raw_fitness(generation) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/biopsy/optimisers/spea2.rb', line 163

def self.score_raw_fitness generation
	generation.sort! { |a, b| a.distance_to_origin <=> b.distance_to_origin }.reverse!
	counter = 0
	previous_distance = +1.0/0.0
	generation.each do |individual|
		if previous_distance > individual.distance_to_origin
			individual.raw_fitness = counter
		else
			individual.raw_fitness = counter - 1
		end
		previous_distance = individual.distance_to_origin
		counter += 1
	end
end