Python DEAP,如果在X世代之后健身没有增加,如何阻止进化?

时间:2017-03-10 17:31:08

标签: python genetic-algorithm deap

我想在适应性不增加时停止遗传算法。

我在python中使用DEAP库。

通常,我有以下日志文​​件:

const stuff = 'a,b,c';

// Nested Array
// React is fine with it and automatically assigns keys
// Sample data: [[a, <br />], [b, <br />], [c, <br />]]
const Foo = () => <div>{stuff.split(',').map(itm => [itm, <br />])}</div>;

// Flat Array
// React warns me that I should assign a key to each element in array
// Sample data: [a, <br />, b, <br />, c, <br />]
const Bar = () => <div>{stuff.split(',').map(itm => [itm, <br />]).reduce((a, b) => a.concat(b), [])}</div>;

我最初设置ngen = 200,但正如您所看到的,适应度函数在第22代达到局部最大值。所以我想在发生这种情况时停止遗传算法。

2 个答案:

答案 0 :(得分:1)

def main():
    random.seed(64)
    pop = toolbox.population(n=100)
    CXPB, MUTPB = 0.5, 0.2
    print "Start of evolution"
    fitnesses = list(map(toolbox.evaluate, pop))
    for ind, fit in zip(pop, fitnesses):
        ind.fitness.values = fit
    print "  Evaluated %i individuals" % len(pop)
    fits = [ind.fitness.values[0] for ind in pop]
    g = 0
    while max(fits) < 0.67 and g < 1000000:
        g = g + 1
        print "-- Generation %i --" % g
        offspring = toolbox.select(pop, len(pop))
        offspring = list(map(toolbox.clone, 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
        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
        pop[:] = offspring
        fits = [ind.fitness.values[0] for ind in pop]
        print "fitness-- ",max(fits)
    print "-- End of (successful) evolution --"
    best_ind = tools.selBest(pop, 1)[0]
    triangle_to_image(best_ind).save('best.jpg')

这将在达到所需的适应性值时终止代码或超过特定数量的世代

您可以设置以下方式:当健身一段时间未改变时,它会停止,即当达到局部最大值并卡在此处时

第12行 当健身度超过0.67时,此示例停止运行 然后保存结果

这是当您不使用名人堂之类的方法时要做的 不知道该怎么做,如果你也找到它告诉我

答案 1 :(得分:0)

老实说,我最近也在研究这个问题。 经过我最近在这里完成的研究,我发现了:

  1. 有一个实现CMA-ES算法的DEAP示例。它包含停止条件(Python DEAP, how to stop the evolution when the fitness doesn't increase after X generations?
  2. 有一篇论文值得阅读:https://heal.heuristiclab.com/system/files/diss%20gkr2.pdf
  3. 上述解决方案实现了Issue中提到的内容:https://github.com/DEAP/deap/issues/271

我还没有尝试过以上任何一种方法,但是我非常确定它会起作用。