class GeneGenie::ProportionalSelector

A proportional gene selection algorithm. Genes are picked in proportion to thier normalised score.

Public Instance Methods

call(pool) click to toggle source
# File lib/gene_genie/selector/proportional_selector.rb, line 5
def call(pool)
  [pick_one(pool), pick_one(pool)]
end

Private Instance Methods

normalised_fitness(gene,pool) click to toggle source
# File lib/gene_genie/selector/proportional_selector.rb, line 24
def normalised_fitness(gene,pool)
  gene.fitness -
    pool.worst_fitness + 1
end
pick_one(pool) click to toggle source
# File lib/gene_genie/selector/proportional_selector.rb, line 11
def pick_one(pool)
  proportional_index = rand(total_normalised_fitness(pool))
  total = 0
  pool.genes.each_with_index do |gene, index|
    total += normalised_fitness(gene,pool)
    return gene if total >= proportional_index || index == (pool.size - 1)
  end
end
total_normalised_fitness(pool) click to toggle source
# File lib/gene_genie/selector/proportional_selector.rb, line 20
def total_normalised_fitness(pool)
  pool.genes.map { |gene| normalised_fitness(gene,pool) }.reduce(:+)
end