Les algorithmes génétiques démystifiés 18
On continue la transformation en code orienté objet de l’algorithme génétique sur le paradoxe du singe savant.
D’abord la classe Evaluator, dont le rôle est d’évaluer la population:
class Evaluator
def initialize(search_value, population)
@search_value = search_value
@population = population
end
def evaluate
@population.each {|individual| score(individual) }
fitness
end
private
def score(individual)
score = 0
individual.chromosome.split('').each_with_index do |character, index|
score += 1 if @search_value[index] == character
end
individual.score = score
end
def fitness
total = @population.inject(0) {|sum, individual| sum + individual.score }
size = @population.size
@population.each do |individual|
individual.fitness = individual.score.to_f / total * size
end
end
endOn voit le découpage entre score et fitness, dont on a parlé hier.
Ensuite, voici la classe GeneticAlgorithm:
class GeneticAlgorithm
def initialize(generations, population, search_value, mutation_rate)
@generations = generations
@population = population
@search_value = search_value
@mutation_rate = mutation_rate
@crossover = Crossover.new(search_value.size, mutation_rate)
end
def run
@generations.times do |generation|
Evaluator.new(@search_value, @population).evaluate
best = @population.best
display(generation, best)
exit if best.score == @search_value.size
next_generation
end
end
private
def display(generation, best)
puts "----------------------"
puts "Gen: #{generation}"
puts "Best: #{best.chromosome}"
end
def next_generation
pool = MatingPool.new(@population)
population_size = @population.size
@population.clear
population_size.times do
@population << @crossover.two_point(pool.random, pool.random)
end
end
endLa méthode run remplace la fonction principale qu’on avait dans nos
scripts jusqu’ici. En écrivant l’article, je vois que la méthode display
me dérange : elle ne repose sur aucun membre, elle serait donc mieux dans
une classe à part entière.
Voilà, c’est un peu court en explication comme article et je m’en excuse
mais aujourd’hui je suis très préssé. La prochaine fois on parle des classes
MatingPool, Crossover et Mutator.
À demain.
/ / / / / / / / / /
« Les algorithmes génétiques démystifiés 17: Orienté Objet ---//---
Les algorithmes génétiques démystifiés 19 »