Хорошо, есть 2 способа выбора колеса рулетки реализация: Обычное и Стохастическое принятие один.
Обычный алгоритм:
# there will be some amount of repeating organisms here.
mating_pool = []
all_organisms_in_population.each do |organism|
organism.fitness.times { mating_pool.push(organism) }
end
# [very_fit_organism, very_fit_organism, very_fit_organism, not_so_fit_organism]
return mating_pool.sample #=> random, likely fit, parent!
Стохастический прием алгоритм:
max_fitness_in_population = all_organisms_in_population.sort_by(:fitness)[0]
loop do
random_parent = all_organisms_in_population.sample
probability = random_parent.fitness/max_fitness_in_population * 100
# if random_parent's fitness is 90%,
# it's very likely that rand(100) is smaller than it.
if rand(100) < probability
return random_parent #=> random, likely fit, parent!
else
next #=> or let's keep on searching for one.
end
end
Вы можете выбрать любой, они будут возвращать идентичные результаты.
Полезные ресурсы:
http://natureofcode.com/book/chapter-9-the-evolution-of-code - понятная для новичков глава о генетических алгоритмах. объясняет выбор колеса рулетки как ведро с деревянными буквами (чем больше Вы вставляете - тем выше шанс выбрать алгоритм A, Обычный ).
https://en.wikipedia.org/wiki/Fitness_proportionate_selection - описывает алгоритм стохастического принятия .