Значение DEAP -пригодности потеряно из-за операции toolbox

#evolutionary-algorithm #deap

#эволюционный алгоритм #deap

Вопрос:

Я работал над созданием дорог путем максимизации конкретных свойств дороги. Я использую фреймворк DEAP для части эволюции. Мои дороги представлены в виде dicts. Я столкнулся с проблемой, когда соединял две дороги. В deap-tutorial указано, что параметр изменяется внутри операции toolbox: «Общее правило для операторов кроссовера заключается в том, что они соединяют только отдельных лиц, это означает, что перед объединением отдельных лиц должны быть сделаны независимые копии, если исходные лица должны быть сохранены или являются ссылками на других лиц.» Так что, когда я попытался скопировать и вставить решение в учебном пособии в сочетании с моей операцией кроссовера, я получаю либо элемент list, у которого нет значения fitness., либо операция toolbox не меняет путь на все. Есть ли что-то неправильное в том, как я регистрирую людей?

 creator.create("FitnessMax", base.Fitness, weights=(1.0, 1.0))
creator.create("Individual", list, fitness=creator.FitnessMax)
toolbox = base.Toolbox()
toolbox.register("getInd", getRandomTrack)
toolbox.register("individual", tools.initRepeat, creator.Individual,
             toolbox.getInd, n=1)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("evaluate", evalTest)
toolbox.register("mutate", mutateTestCase)
toolbox.register("mate", tools.cross)
toolbox.register("select", tools.selNSGA2)  
  

Операция кроссовера пока просто загружает сохраненный dict, потому что проблема заключается в том, что toolbox не видит его как отдельного пользователя:

 def cross(ind1, ind2):
    with open('c:/Users/****/.asfaultenv/output/final 
    /test_0004.json') as f                 
        ind2 = json.load(f)
    with open('c:/Users/****/.asfaultenv/output/final
    /test_0004.json') as f
        ind1 = json.load(f)
return (ind1), (ind2)
  

И вот цикл, который должен загружать отдельных пользователей и соединять их:

 # Clone the selected individuals
offspring = [toolbox.clone(ind) for ind in pop]
# I've also used the approach beneath
# offspring = list(map(toolbox.clone, pop))

for child1, child2 in zip(offspring[::2], offspring[1::2]):
    toolbox.mate(child1, child2)
    if child1 is not None:
        del child1.fitness.values
    if child2 is not None:
        del child2.fitness.values
  

Как я упоминал выше, таким образом, дочерними элементами никак не манипулируют, и когда я пытаюсь сделать что-то вроде этого:

 child1, child2 = toolbox.mate(child1, child2)
  

Тогда я получу сообщение об ошибке: у объекта ‘list’ нет атрибута ‘fitness’

Спасибо, что нашли время.

Ответ №1:

Ваша cross функция должна возвращать объекты, которые имеют тип individual . В вашем примере вы возвращаете объекты, которые имеют тип, возвращаемый json.load .