Class: GeneticAlgorithm
- Inherits:
-
Object
- Object
- GeneticAlgorithm
- Defined in:
- lib/gga4r.rb
Constant Summary collapse
- VERSION =
'0.9.3'
Class Method Summary collapse
-
.populate_from_file(filename, prop = {}) ⇒ Object
Returns a GeneticAlgorithm object with the generations loaded from given files and with properties prop.
Instance Method Summary collapse
-
#best_fit ⇒ Object
Returns an array with the best fitted individuals for last generation.
-
#best_fitted(n) ⇒ Object
Returns an array with the best fitted n individuals from the population (might include local optima).
-
#best_fitted_derated(n) ⇒ Object
Returns an array with the best fitted n individuals from the population (might include local optima) Uses a distance-derated fitness metric.
-
#evolve(num_steps = 1) ⇒ Object
Evolves the actual generation num_steps steps (1 by default).
-
#initialize(in_pop, prop = {}) ⇒ GeneticAlgorithm
constructor
Must be initialized with a Array of chromosomes To be a chomosome the object must implement the next methods: - fitness - recombine - mutate - distance (only for multi-modal optimization) Accepts the next properties: - max_population: maximum number of individuals that are allowed to form a generation.
-
#save_population(filename) ⇒ Object
Saves into filename and in yaml format the generation that matchs with given generation number ( by default from last generation ).
Constructor Details
#initialize(in_pop, prop = {}) ⇒ GeneticAlgorithm
Must be initialized with a Array of chromosomes To be a chomosome the object must implement the next methods:
- fitness
- recombine
- mutate
- distance (only for multi-modal optimization)
Accepts the next properties:
- max_population: maximum number of individuals that are allowed to form a generation.
- logger: logger to write messages if given.
- multi_recombination: set to true if the result of a chromosome's #recombination method
returns an array. Default to false
- multi_modal: set to true to use a multi-modal algorithm using deterministic crowding and a distance-derated fitness.
- share_radius: in multi-modal optimization, determines the niche radius for derated fitness calculation.
19 20 21 22 23 24 25 26 27 |
# File 'lib/gga4r.rb', line 19 def initialize(in_pop, prop = {}) @max_population = prop[:max_population] @logger = prop[:logger] || Logger.new('/dev/null') @population = in_pop @multi_recombination = prop[:multi_recombination] || false @generations = [] @multi_modal = prop[:multi_modal] || false @share_radius = prop[:share_radius] or 3 end |
Class Method Details
.populate_from_file(filename, prop = {}) ⇒ Object
Returns a GeneticAlgorithm object with the generations loaded from given files and with properties prop. Files must contain the chromosomes in YAML format.
48 49 50 |
# File 'lib/gga4r.rb', line 48 def self.populate_from_file(filename, prop = {}) GeneticAlgorithm.new(YAML.load(File.open(filename, 'r')), prop) end |
Instance Method Details
#best_fit ⇒ Object
Returns an array with the best fitted individuals for last generation
30 31 32 |
# File 'lib/gga4r.rb', line 30 def best_fit @population.max_by(&:fitness) end |
#best_fitted(n) ⇒ Object
Returns an array with the best fitted n individuals from the population (might include local optima)
35 36 37 |
# File 'lib/gga4r.rb', line 35 def best_fitted(n) @population.uniq.sort_by{|c| -c.fitness}.first(n) end |
#best_fitted_derated(n) ⇒ Object
Returns an array with the best fitted n individuals from the population (might include local optima) Uses a distance-derated fitness metric
41 42 43 |
# File 'lib/gga4r.rb', line 41 def best_fitted_derated(n) @population.uniq.sort_by{|c| -(derated_fitness(c,@population))}.first(n) end |
#evolve(num_steps = 1) ⇒ Object
Evolves the actual generation num_steps steps (1 by default).
63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/gga4r.rb', line 63 def evolve(num_steps = 1) num_steps.times do |t| @population = selection(@population) new_gen = @population.map { |chromosome| chromosome.dup } if !@multi_modal @population += recombination(new_gen) + mutation(new_gen) else @population = deterministic_crowding(@population) @population = mutation(@population) end end end |
#save_population(filename) ⇒ Object
Saves into filename and in yaml format the generation that matchs with given generation number ( by default from last generation ).
54 55 56 57 58 |
# File 'lib/gga4r.rb', line 54 def save_population(filename) f = File.new(filename, "w") f.write(@population.to_yaml) f.close end |