Пропорциональный выбор фитнеса, когда некоторые приспособления равны 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).

Другие вопросы по тегам