Class: Biopsy::FitnessAssignment
- Inherits:
-
Object
- Object
- Biopsy::FitnessAssignment
- Defined in:
- lib/biopsy/optimisers/spea2.rb
Overview
Individual
Class Method Summary collapse
- .distance_between_points(individual_one, individual_two) ⇒ Object
- .distance_to_origin(coordinates) ⇒ Object
- .find_distance_to_kth_point(generation_hash) ⇒ Object
- .map_points_distance(generation) ⇒ Object
- .run(generation) ⇒ Object
- .score_density(generation) ⇒ Object
- .score_raw_fitness(generation) ⇒ Object
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 |