class Algorithms::GeneticAlgorithm::Engine

Attributes

best_solution[R]

Public Class Methods

new(population) click to toggle source
# File lib/algorithms/genetic_algorithm/genetic_algorithm.rb, line 24
def initialize(population)
  @population = population
  @best_solution = population.max_by(&:score)
end

Public Instance Methods

run(iterations, min_size: 100, generate_retry: 10) click to toggle source
# File lib/algorithms/genetic_algorithm/genetic_algorithm.rb, line 29
def run(iterations, min_size: 100, generate_retry: 10)
  @population = generate_until_minimum(@population, min_size)
  iterations.times do
    @population = @population.map do |solution|
      generate_new_solution(solution, @population, generate_retry)
    end
    @best_solution = (@population + [@best_solution]).max_by(&:score)
  end
end

Private Instance Methods

generate_new_solution(solution, population, generate_retry) click to toggle source
# File lib/algorithms/genetic_algorithm/genetic_algorithm.rb, line 59
def generate_new_solution(solution, population, generate_retry)
  generate_retry.times do
    new_solution = if rand < 0.5
                     solution.mutate
                   else
                     solution.crossover(population.sample)
                   end
    return new_solution if new_solution.valid?
  end
  solution
end
generate_until_minimum(population, min_size) click to toggle source
# File lib/algorithms/genetic_algorithm/genetic_algorithm.rb, line 41
def generate_until_minimum(population, min_size)
  while population.size <= min_size
    new_solutions = []
    population.each_with_index do |solution, idx|
      if idx % 2 == 0
        new_solution = solution.mutate
        new_solutions << new_solution if new_solution.valid?
      else
        other_solution = population.reject.with_index { |_, i| i == idx }.sample
        new_solution = solution.crossover(other_solution)
        new_solutions << new_solution if new_solution.valid?
      end
    end
    population += new_solutions
  end
  population
end