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