首页 > 解决方案 > 使用带有 NSGA2 的 python DEAP 库解决多目标优化问题

问题描述

我想使用DEAP 库解决多目标优化问题。因为我是 DEAP 的新手,所以我使用这个NSGA-II 示例作为我自己问题的模板。在示例中,在第 59 行,tools.selNSGA2函数被注册到toolbox对象,之后,用作toolbox.select

toolbox.register("select", tools.selNSGA2)

然后在主函数中,在第 96 行,tools.selTournamentDCD函数用于选择后代,但我不知道它是做什么的。我在提出NSGA-II的论文中也找不到任何关于它的信息。

以下代码是示例的主要功能:

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.selTournamentDCDNSGA-II 算法的一部分吗?tools.selTournamentDCD在 DEAP 中创建后代是否必须使用?你能告诉我什么时候应该使用这个功能,它有什么作用?

提前致谢

标签: pythonoptimizationgenetic-algorithmdeap

解决方案


在这篇论文中,您可以查看有关 NSGA-II 的详细信息(这是 DEAP 引用的一篇)https://link.springer.com/chapter/10.1007/3-540-45356-3_83

我仍然是使用这个库的新手,但我认为你不会被迫使用tools.selTournamentDCD

我认为您可以使用其他选择或预选运算符,例如 selRandomorselRoulette


推荐阅读