结合终止条件的钟表匠遗传算法

时间:2014-04-29 13:53:47

标签: java genetic-algorithm watchmaker

使用Stagnation(numGenerations,true)终止Watchmaker中的进化。

我希望numGenerations取决于进化的表现。如果我有一个腐烂的人口(低健身),那么我想提前纾困。如果人口表现良好,我想给它更多时间。

我该怎么做?

我阅读了用户手册,通过http://watchmaker.uncommons.org/上的示例,查看了API,并在网上搜索。没有具体说明这个主题。我是Java和遗传算法的新手,所以我很容易错过一些东西。

2 个答案:

答案 0 :(得分:1)

如果群体中的最佳健康分数在一定数量的连续世代中没有改善,则Stagnation终止条件仅中止进化。它从一开始就经过一定数量的世代后没有停止(因为你会使用GenerationCount条件),它只会在进化似乎已经停止进展时开始。因此,如果你的人口表现良好(我认为这意味着适应性继续提高),就不太可能触发停滞状态。

如果你想要不同的东西,你可能需要自己编写TerminationCondition。它只是一个将PopulationData作为参数的方法,以便您可以在每一代结束时根据该方法做出决策。你只需要能够定义"烂人口"到目前为止,在平均和/或最佳适应度和世代数方面。

答案 1 :(得分:1)

重读API我发现可以向engine.evolvePopulation()提供多个TerminationConditions。这让我写了一个递归函数,只要健身继续改善就会继续运行。

process (Parameters params) {

    result = engine.evolvePopulation(params.size, 0, 
               new Stagnation(params.stagnation, true), 
               new TargetFitness(params.target, true));

    if (result.get(0).getFitness() >= params.target)
        process(params.increase());

    return;
}

在我的情况下,目标每次都会增加一个固定的数量。作为目标立方体的函数,尺寸和停滞度增加。这样,特定人口越多,投入的时间就越多。不确定这是最好的方法,但对于这个问题,它得到了我正在寻找的答案。

哦顺便说一下,我的程序看起来并不像我上面粘贴的那样。我是一个非常糟糕的程序员,而且我的代码比这更糟糕。只是想表明这个想法的要点。