Class: GeneGenie::GenePool
- Inherits:
-
Object
- Object
- GeneGenie::GenePool
- Defined in:
- lib/gene_genie/gene_pool.rb
Overview
Class Method Summary collapse
-
.build(template, fitness_evaluator) ⇒ Object
build a GenePool with a reasonable set of defaults.
Instance Method Summary collapse
- #average_fitness ⇒ Object
- #best ⇒ Object
- #best_ever ⇒ Object
- #best_fitness ⇒ Object
- #evolve ⇒ Object
- #generation ⇒ Object
- #genes ⇒ Object
-
#initialize(template:, fitness_evaluator:, gene_factory:, size: 10, mutator: NullMutator.new, selector: ProportionalSelector.new) ⇒ GenePool
constructor
A new instance of GenePool.
- #register_listener(listener) ⇒ Object
- #size ⇒ Object
- #total_fitness ⇒ Object
- #total_normalised_fitness ⇒ Object
- #worst ⇒ Object
- #worst_fitness ⇒ Object
Constructor Details
#initialize(template:, fitness_evaluator:, gene_factory:, size: 10, mutator: NullMutator.new, selector: ProportionalSelector.new) ⇒ GenePool
Returns a new instance of GenePool.
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/gene_genie/gene_pool.rb', line 9 def initialize(template:, fitness_evaluator:, gene_factory:, size: 10, mutator: NullMutator.new, selector: ProportionalSelector.new) unless (template.instance_of? Array) && (template[0].instance_of? Hash) fail ArgumentError, 'template must be an array of hashes of ranges' end unless fitness_evaluator.respond_to?(:fitness) fail ArgumentError, 'fitness_evaluator must respond to fitness' end @template = template @fitness_evaluator = fitness_evaluator @mutator = mutator @selector = selector @pool = gene_factory.create(size) @generation = 0 @listeners = [] end |
Class Method Details
.build(template, fitness_evaluator) ⇒ Object
build a GenePool with a reasonable set of defaults. You only need to specily the minimum no. of parameters
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/gene_genie/gene_pool.rb', line 33 def self.build(template, fitness_evaluator) unless (template.instance_of? Array) && (template[0].instance_of? Hash) fail ArgumentError, 'template must be an array of hashes of ranges' end gene_mutator = NudgeMutator.new(template, 0.01) gene_factory = GeneFactory.new(template, fitness_evaluator) template_evaluator = TemplateEvaluator.new(template) size = template_evaluator.recommended_size GenePool.new(template: template, fitness_evaluator: fitness_evaluator, gene_factory: gene_factory, size: size, mutator: gene_mutator) end |
Instance Method Details
#average_fitness ⇒ Object
96 97 98 |
# File 'lib/gene_genie/gene_pool.rb', line 96 def average_fitness @average_fitness ||= total_fitness / @pool.size end |
#best ⇒ Object
57 58 59 |
# File 'lib/gene_genie/gene_pool.rb', line 57 def best @best ||= @pool.max_by(&:fitness) end |
#best_ever ⇒ Object
73 74 75 |
# File 'lib/gene_genie/gene_pool.rb', line 73 def best_ever @best_ever ||= best end |
#best_fitness ⇒ Object
61 62 63 |
# File 'lib/gene_genie/gene_pool.rb', line 61 def best_fitness best.fitness end |
#evolve ⇒ Object
77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/gene_genie/gene_pool.rb', line 77 def evolve old_best_fitness = best.fitness new_pool = [] size.times do new_pool << select_genes_combine_and_mutate end @pool = new_pool update_stats @generation += 1 @listeners.each { |l| l.call(self) } best.fitness > old_best_fitness end |
#generation ⇒ Object
92 93 94 |
# File 'lib/gene_genie/gene_pool.rb', line 92 def generation @generation end |
#genes ⇒ Object
108 109 110 |
# File 'lib/gene_genie/gene_pool.rb', line 108 def genes @pool end |
#register_listener(listener) ⇒ Object
49 50 51 |
# File 'lib/gene_genie/gene_pool.rb', line 49 def register_listener(listener) @listeners << listener end |
#size ⇒ Object
53 54 55 |
# File 'lib/gene_genie/gene_pool.rb', line 53 def size @pool.size end |
#total_fitness ⇒ Object
100 101 102 |
# File 'lib/gene_genie/gene_pool.rb', line 100 def total_fitness @total_fitness ||= fitness_values.reduce(:+) end |
#total_normalised_fitness ⇒ Object
104 105 106 |
# File 'lib/gene_genie/gene_pool.rb', line 104 def total_normalised_fitness @total_normalised_fitness ||= normalised_fitness_values.reduce(:+) end |
#worst ⇒ Object
65 66 67 |
# File 'lib/gene_genie/gene_pool.rb', line 65 def worst @worst ||= @pool.min_by(&:fitness) end |
#worst_fitness ⇒ Object
69 70 71 |
# File 'lib/gene_genie/gene_pool.rb', line 69 def worst_fitness worst.fitness end |