0

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

我希望 numGenerations 取决于进化的进展情况。如果我有一个腐烂的人口(低健康度),那么我想早点退出。如果人口表现良好,我想给它更多时间。

我该怎么做?

我阅读了用户手册,浏览了http://watchmaker.uncommons.org/上的示例,查看了 API,并在网络上进行了搜索。没有看到这个主题专门解决。我是 Java 和遗传算法的新手,所以我很容易错过一些东西。

4

2 回答 2

2

重读 API 我发现多个 TerminationCondition 可以提供给 engine.evolvePopulation()。这让我可以编写一个递归函数,只要适应度继续提高,它就会继续运行。

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;
}

在我的例子中,目标每次都会增加一个固定的量。尺寸和停滞随着目标立方体的增加而增加。这样,特定人群变得越好,投入的时间就越多。不确定这是最好的方法,但对于这个问题,它得到了我正在寻找的答案。

哦,顺便说一句,我的程序看起来并不像我上面粘贴的那样。我是一个非常糟糕的程序员,我的代码比这更难看。只是试图展示这个想法的要点。

于 2014-05-30T21:14:02.470 回答
1

Stagnation只有当种群中的最佳适应度得分在一定数量的连续世代中没有提高时,终止条件才会中止进化。它不会在从一开始的固定数量的世代之后中断(因为您将使用该GenerationCount条件),它仅在进化似乎停止取得进展时才开始。因此,如果您的人口表现良好(我认为您的意思是健康状况正在持续改善),则不太可能触发停滞状态。

如果您想要不同的东西,您可能需要编写自己的TerminationCondition. 它只是一个以PopulationData为参数的方法,以便您可以在每一代结束时根据它做出决策。您只需要能够根据平均和/或最佳适应度以及迄今为止的世代数来定义“腐烂的人口”。

于 2014-04-30T10:41:11.400 回答