Class: GeneGenie::GenePool

Inherits:
Object
  • Object
show all
Defined in:
lib/gene_genie/gene_pool.rb

Overview

Since:

  • 0.0.1

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(template:, fitness_evaluator:, gene_factory:, size: 10, mutator: NullMutator.new, selector: ProportionalSelector.new) ⇒ GenePool

Returns a new instance of GenePool.

Since:

  • 0.0.1



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

Since:

  • 0.0.1



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_fitnessObject

Since:

  • 0.0.1



96
97
98
# File 'lib/gene_genie/gene_pool.rb', line 96

def average_fitness
  @average_fitness ||= total_fitness / @pool.size
end

#bestObject

Since:

  • 0.0.1



57
58
59
# File 'lib/gene_genie/gene_pool.rb', line 57

def best
  @best ||= @pool.max_by(&:fitness)
end

#best_everObject

Since:

  • 0.0.1



73
74
75
# File 'lib/gene_genie/gene_pool.rb', line 73

def best_ever
  @best_ever ||= best
end

#best_fitnessObject

Since:

  • 0.0.1



61
62
63
# File 'lib/gene_genie/gene_pool.rb', line 61

def best_fitness
  best.fitness
end

#evolveObject

Since:

  • 0.0.1



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

#generationObject

Since:

  • 0.0.1



92
93
94
# File 'lib/gene_genie/gene_pool.rb', line 92

def generation
  @generation
end

#genesObject

Since:

  • 0.0.1



108
109
110
# File 'lib/gene_genie/gene_pool.rb', line 108

def genes
  @pool
end

#register_listener(listener) ⇒ Object

Since:

  • 0.0.1



49
50
51
# File 'lib/gene_genie/gene_pool.rb', line 49

def register_listener(listener)
  @listeners << listener
end

#sizeObject

Since:

  • 0.0.1



53
54
55
# File 'lib/gene_genie/gene_pool.rb', line 53

def size
  @pool.size
end

#total_fitnessObject

Since:

  • 0.0.1



100
101
102
# File 'lib/gene_genie/gene_pool.rb', line 100

def total_fitness
  @total_fitness ||= fitness_values.reduce(:+)
end

#total_normalised_fitnessObject

Since:

  • 0.0.1



104
105
106
# File 'lib/gene_genie/gene_pool.rb', line 104

def total_normalised_fitness
  @total_normalised_fitness ||= normalised_fitness_values.reduce(:+)
end

#worstObject

Since:

  • 0.0.1



65
66
67
# File 'lib/gene_genie/gene_pool.rb', line 65

def worst
  @worst ||= @pool.min_by(&:fitness)
end

#worst_fitnessObject

Since:

  • 0.0.1



69
70
71
# File 'lib/gene_genie/gene_pool.rb', line 69

def worst_fitness
  worst.fitness
end