Class: PetriDish::World

Inherits:
Object
  • Object
show all
Defined in:
lib/petri_dish/world.rb

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.configurationObject (readonly)

Returns the value of attribute configuration.



16
17
18
# File 'lib/petri_dish/world.rb', line 16

def configuration
  @configuration
end

.end_condition_reachedObject (readonly)

Returns the value of attribute end_condition_reached.



16
17
18
# File 'lib/petri_dish/world.rb', line 16

def end_condition_reached
  @end_condition_reached
end

.metadataObject

Returns the value of attribute metadata.



15
16
17
# File 'lib/petri_dish/world.rb', line 15

def 
  
end

Class Method Details

.run(members:, configuration: Configuration.new, metadata: Metadata.new) ⇒ Object



18
19
20
21
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
# File 'lib/petri_dish/world.rb', line 18

def run(
  members:,
  configuration: Configuration.new,
  metadata: .new
)
  configuration.generation_start_callback&.call(.generation_count)

  end_condition_reached = false
  max_generation_reached = false

  if .generation_count.zero?
    configuration.logger.info "Run started."
    .start
  end

  configuration.logger.info(.to_json)

  if .generation_count >= configuration.max_generations
    configuration.max_generation_reached_callback&.call
    max_generation_reached = true
  end

  elitism_count = (configuration.population_size * configuration.elitism_rate).round
  elite_members = members.sort_by(&:fitness).last(elitism_count)

  new_members = (configuration.population_size - elitism_count).times.map do
    child_member = configuration.crossover_function.call(configuration.parents_selection_function.call(members))

    configuration.mutation_function.call(child_member).tap do |mutated_child|
      if .highest_fitness < mutated_child.fitness
        .set_highest_fitness(mutated_child.fitness)
        configuration.highest_fitness_callback&.call(mutated_child)

        configuration.logger.info(.to_json)
      end

      if configuration.end_condition_function.call(mutated_child)
        configuration.end_condition_reached_callback&.call(mutated_child)
        end_condition_reached = true
      end
    end
  end

  .increment_generation
  run(members: (new_members + elite_members), configuration: configuration, metadata: ) unless end_condition_reached || max_generation_reached
end