Какова важность инвалидной пригодности в DEAP?

Я только начинаю использовать DEAP. Раньше я использовал ГА на основе Matlab, который после скрещивания и мутации отбирал лучших особей с заданным размером, а затем обновлял популяцию. Но мне довольно сложно понять, почему в DEAP после процедуры кроссовера и мутации требуется оценка особей с недопустимой приспособленностью:

invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
    ind.fitness.values = fit

Я пытался удалить этот код, но, похоже, алгоритм никогда не сойдется. И даже я не видел, чтобы они могли обновлять популяцию/потомство, так для чего они нужны. Заранее спасибо!!!


person Zhida Deng    schedule 22.06.2017    source источник


Ответы (1)


После нескольких тестов оценка особей с действительной приспособленностью предназначена для оценки приспособленности особей после процедур скрещивания и мутации. Мы можем видеть из этого кода:

# Apply crossover and mutation on the offspring
for child1, child2 in zip(offspring[::2], offspring[1::2]):
    if random.random() < CXPB:
        toolbox.mate(child1, child2)
        del child1.fitness.values
        del child2.fitness.values

for mutant in offspring:
    if random.random() < MUTPB:
        toolbox.mutate(mutant)
        del mutant.fitness.values

значение приспособленности тех особей, которые подверглись кроссоверу и мутации, удаляются с помощью del. Таким образом, invalid_ind = [ind for ind in offspring if not ind.fitness.valid] используется для выбора этих лиц для повторной оценки, что может значительно сократить объем вычислений. Более того, мы также можем переоценить все потомство, используя:

fitnesses = map(toolbox.evaluate, offspring)
for ind, fit in zip(offspring, fitnesses):
    ind.fitness.values = fit

как уже говорилось, это может увеличить вычислительную нагрузку. В заключение, эта переоценка необходима для определения пригодности для каждого человека и подготовки к операции выбора в offspring = toolbox.select(pop, len(pop)), которая основана на значении пригодности отдельных лиц.

person Zhida Deng    schedule 23.06.2017
comment
Я также использую nsga2 и Deap, но я не очень хорошо понимаю недопустимую пригодность. это значение функции, которая не достигла цели функции? и именно поэтому он называется инвалидом? - person CodeIK; 29.09.2020