使用 python DEAP 库和 NSGA2 解决多 objective 优化问题
Solving a multi-objective optimization problem using python DEAP library with NSGA2
我想使用 NSGA-II 的 DEAP library. Since i am new in DEAP, i used this example 作为我自己问题的模板来解决多 objective 优化问题。在例子中,第59行,tools.selNSGA2
函数被注册到toolbox
对象,之后,用作toolbox.select
:
toolbox.register("select", tools.selNSGA2)
然后在main函数中,第96行,tools.selTournamentDCD
函数,用于select offspring,但是我不知道它是做什么的。此外,我在提出 NSGA-II 的 paper 中找不到任何相关信息。
以下代码是示例的主要功能:
def main(seed=None):
random.seed(seed)
NGEN = 250
MU = 100
CXPB = 0.9
pop = toolbox.population(n=MU)
# Evaluate the individuals with an invalid fitness
invalid_ind = [ind for ind in pop if not ind.fitness.valid]
fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
# This is just to assign the crowding distance to the individuals
# no actual selection is done
pop = toolbox.select(pop, len(pop))
# Begin the generational process
for gen in range(1, NGEN):
# Vary the population
offspring = tools.selTournamentDCD(pop, len(pop))
offspring = [toolbox.clone(ind) for ind in offspring]
for ind1, ind2 in zip(offspring[::2], offspring[1::2]):
if random.random() <= CXPB:
toolbox.mate(ind1, ind2)
toolbox.mutate(ind1)
toolbox.mutate(ind2)
del ind1.fitness.values, ind2.fitness.values
# Evaluate the individuals with an invalid fitness
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
# Select the next generation population
pop = toolbox.select(pop + offspring, MU)
return pop, logbook
我的问题: tools.selTournamentDCD
函数是 NSGA-II 算法的一部分吗?在 DEAP 中必须使用 tools.selTournamentDCD
来创建后代吗?你能告诉我什么时候应该使用这个功能吗?它有什么作用?
提前致谢
这是一篇论文,您可以在其中查看有关 NSGA-II 的详细信息(这是 DEAP 引用的一篇)https://link.springer.com/chapter/10.1007/3-540-45356-3_83
我还是这个库的新手,但我认为你不是被迫使用 tools.selTournamentDCD
我认为您可以使用其他选择或 pre-selection 运算符,例如
selRandom
或 selRoulette
我想使用 NSGA-II 的 DEAP library. Since i am new in DEAP, i used this example 作为我自己问题的模板来解决多 objective 优化问题。在例子中,第59行,tools.selNSGA2
函数被注册到toolbox
对象,之后,用作toolbox.select
:
toolbox.register("select", tools.selNSGA2)
然后在main函数中,第96行,tools.selTournamentDCD
函数,用于select offspring,但是我不知道它是做什么的。此外,我在提出 NSGA-II 的 paper 中找不到任何相关信息。
以下代码是示例的主要功能:
def main(seed=None):
random.seed(seed)
NGEN = 250
MU = 100
CXPB = 0.9
pop = toolbox.population(n=MU)
# Evaluate the individuals with an invalid fitness
invalid_ind = [ind for ind in pop if not ind.fitness.valid]
fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
# This is just to assign the crowding distance to the individuals
# no actual selection is done
pop = toolbox.select(pop, len(pop))
# Begin the generational process
for gen in range(1, NGEN):
# Vary the population
offspring = tools.selTournamentDCD(pop, len(pop))
offspring = [toolbox.clone(ind) for ind in offspring]
for ind1, ind2 in zip(offspring[::2], offspring[1::2]):
if random.random() <= CXPB:
toolbox.mate(ind1, ind2)
toolbox.mutate(ind1)
toolbox.mutate(ind2)
del ind1.fitness.values, ind2.fitness.values
# Evaluate the individuals with an invalid fitness
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
# Select the next generation population
pop = toolbox.select(pop + offspring, MU)
return pop, logbook
我的问题: tools.selTournamentDCD
函数是 NSGA-II 算法的一部分吗?在 DEAP 中必须使用 tools.selTournamentDCD
来创建后代吗?你能告诉我什么时候应该使用这个功能吗?它有什么作用?
提前致谢
这是一篇论文,您可以在其中查看有关 NSGA-II 的详细信息(这是 DEAP 引用的一篇)https://link.springer.com/chapter/10.1007/3-540-45356-3_83
我还是这个库的新手,但我认为你不是被迫使用 tools.selTournamentDCD
我认为您可以使用其他选择或 pre-selection 运算符,例如
selRandom
或 selRoulette