Class: MetaheuristicAlgorithms::GeneticAlgorithm

Inherits:
Object
  • Object
show all
Includes:
BaseAlgorithmModule, Helper
Defined in:
lib/metaheuristic_algorithms/genetic_algorithm.rb

Instance Method Summary collapse

Methods included from Helper

#bigdecimal_rand

Methods included from BaseAlgorithmModule

#gaussian, #get_decision_variable_value_by_randomization

Constructor Details

#initialize(function_wrapper, number_of_variables: 1, objective: :maximization) ⇒ GeneticAlgorithm

Returns a new instance of GeneticAlgorithm.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/metaheuristic_algorithms/genetic_algorithm.rb', line 7

def initialize(function_wrapper, number_of_variables: 1, objective: :maximization)
  @function_wrapper = function_wrapper
  @number_of_variables = number_of_variables
  @objective_method_name = case objective
                             when :maximization
                               :max
                             when :minimization
                               :min
                           end        

  ## Decided to use decimal number representation and convert it to binary number by unpack method
  ## because it is difficult to initialize variable within the given range
  # @string_length_in_bits = 16
end

Instance Method Details

#search(population_size: 20, maximum_number_of_generations: 100, number_of_mutation_sites: 2, crossover_probability: 0.95, mutation_probability: 0.05) ⇒ Object

def search(population_size: 20, maximum_number_of_generations: 100, number_of_mutation_sites: BigDecimal(‘2’), crossover_probability: BigDecimal(‘0.95’), mutation_probability: BigDecimal(‘0.05’))



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/metaheuristic_algorithms/genetic_algorithm.rb', line 23

def search(population_size: 20, maximum_number_of_generations: 100, number_of_mutation_sites: 2, crossover_probability: 0.95, mutation_probability: 0.05)

  population_size = population_size.to_i unless population_size.kind_of?(Integer)
  maximum_number_of_generations = maximum_number_of_generations.to_i unless maximum_number_of_generations.kind_of?(Integer)
  # number_of_mutation_sites = BigDecimal(number_of_mutation_sites.to_s) unless number_of_mutation_sites.kind_of?(BigDecimal)
  # crossover_probability = BigDecimal(crossover_probability.to_s) unless crossover_probability.kind_of?(BigDecimal)
  # mutation_probability = BigDecimal(mutation_probability.to_s) unless mutation_probability.kind_of?(BigDecimal)
  number_of_mutation_sites = number_of_mutation_sites.to_i unless number_of_mutation_sites.kind_of?(Integer)
  crossover_probability = crossover_probability.to_f unless crossover_probability.kind_of?(Float)
  mutation_probability = mutation_probability.to_f unless mutation_probability.kind_of?(Float)      

  initialize_population(population_size)

  maximum_number_of_generations.times do |generation_index|

    @population_copy = deep_clone_population

    population_size.times do |individual_index|

      # if bigdecimal_rand < crossover_probability
      if rand < crossover_probability

        # Crossover pair:
        crossover_pair_1_index = generate_random_index(population_size)
        crossover_pair_2_index = generate_random_index(population_size)     

        crossover(crossover_pair_1_index, crossover_pair_2_index)

      end

      # if bigdecimal_rand < mutation_probability
      if rand < mutation_probability

        mutation_individual_index = generate_random_index(population_size)

        mutate(mutation_individual_index, number_of_mutation_sites)

      end

    end

  end

  objective_function_value = @population_fitness.send(@objective_method_name)
  decision_variable_values = @population[@population_fitness.index(objective_function_value)]

  { best_decision_variable_values: decision_variable_values, best_objective_function_value: objective_function_value }

end