Class: MetaheuristicAlgorithms::GeneticAlgorithm
- Inherits:
-
Object
- Object
- MetaheuristicAlgorithms::GeneticAlgorithm
- Includes:
- BaseAlgorithmModule, Helper
- Defined in:
- lib/metaheuristic_algorithms/genetic_algorithm.rb
Instance Method Summary collapse
-
#initialize(function_wrapper, number_of_variables: 1, objective: :maximization) ⇒ GeneticAlgorithm
constructor
A new instance of GeneticAlgorithm.
- #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')) ⇒ Object
Methods included from Helper
Methods included from BaseAlgorithmModule
#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: BigDecimal('2'), crossover_probability: BigDecimal('0.95'), mutation_probability: BigDecimal('0.05')) ⇒ Object
22 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 |
# File 'lib/metaheuristic_algorithms/genetic_algorithm.rb', line 22 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')) 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) initialize_population(population_size) (0...maximum_number_of_generations).each do |generation_index| @population_copy = deep_clone_population (0...population_size).each do |individual_index| if bigdecimal_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 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 |