DEAP - ценность фитнеса, потерянная в результате работы панели инструментов - PullRequest
0 голосов
/ 15 марта 2019

Я работал над созданием дорог путем максимизации специфических свойств дороги.Я использую DEAP Framework для эволюции.Мои дороги представлены как диктовки.Я столкнулся с проблемой, пока я соединяю две дороги.В глухом учебнике утверждается, что параметр изменяется внутри операции панели инструментов: «Общее правило для операторов кроссовера состоит в том, что они объединяют только отдельных лиц, это означает, что независимые копии должны быть сделаны до объединения отдельных лиц, если исходные лица имеютбыть сохранены или являются ссылками на других лиц.Поэтому, когда я попытался скопировать и вставить решение в учебнике в сочетании с моей операцией кроссовера, я получил либо элемент списка, у которого нет fitness.value, либо операция набора инструментов вообще не меняет пути.Что-то не так с тем, как я регистрирую людей?

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)  

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

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'

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

...