Пропорциональный выбор фитнеса, когда некоторые приспособления равны 0
У меня есть вопрос о том, что делать с фитнесом (фитнесом?), Который равен 0 при получении пропорциональных вероятностей фитнеса. Если контейнер для членов отсортирован сначала по наивысшей пригодности, то выполните код, подобный следующему:
for all members of population
sum += fitness of this individual
end for
for all members of population
probability = sum of probabilities + (fitness / sum)
sum of probabilities += probability
end for
loop until new population is full
do this twice
number = Random between 0 and 1
for all members of population
if number > probability but less than next probability then you have been selected
end for
end
create offspring
end loop
Моя проблема, с которой я сталкиваюсь, проходя вручную одну итерацию со случайно сгенерированными членами, состоит в том, что у меня пригодность некоторого члена равна 0, но при получении вероятности этих членов она сохраняет ту же вероятность, что и у последнего ненулевого члена. Есть ли способ, которым я могу отделить ненулевые вероятности от нулевых вероятностей? Я думал, что даже если бы я сортировал на основе наивысшей пригодности, последний ненулевой член имел бы такую же вероятность, как и нулевые вероятности.
1 ответ
Рассмотрим этот пример:
individual fitness(i) probability(i) partial_sum(i)
1 10 10/20 = 0.50 0.50
2 3 3/20 = 0.15 0.5+0.15 = 0.65
3 2 2/20 = 0.10 0.5+0.15+0.1 = 0.75
4 0 0/20 = 0.00 0.5+0.15+0.1+0.0 = 0.75
5 5 5/20 = 0.25 0.5+0.15+0.1+0.0+0.25 = 1.00
------
Sum 20
Сейчас если number = Random between [0;1[
мы собираемся выбрать индивидуальный i
если:
individual condition
1 0.00 <= number < partial_sum(1) = 0.50
2 0.50 = partial_sum(1) <= number < partial_sum(2) = 0.65
3 0.65 = partial_sum(2) <= number < partial_sum(3) = 0.75
4 0.75 = partial_sum(3) <= number < partial_sum(4) = 0.75
5 0.75 = partial_sum(4) <= number < partial_sum(5) = 1.00
Если человек имеет фитнес 0
(например, I4) его нельзя выбрать из-за его условия выбора (например, I4 имеет ассоциированное условие 0.75 <= number < 0.75
).