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

Java 结合终止条件的钟表匠遗传算法,java,genetic-algorithm,watchmaker,Java,Genetic Algorithm,Watchmaker,使用停滞(numGenerations,true)终止钟表制造商的进化 我希望numGenerations取决于进化的进展情况。如果我有一个腐烂的人口(低健身),那么我想退出早。如果人口表现良好,我想给它更多的时间 我该怎么做 我阅读了用户手册,研究了上的示例,查看了API,并在web上搜索。没有看到这个主题被特别提到。我不熟悉Java和遗传算法,所以我很容易错过一些东西 如果种群中的最佳适应度得分在一定数量的连续世代内没有改善,停滞终止条件只会中止进化。它从一开始就不会在固定数量的世代之后停止

使用停滞(numGenerations,true)终止钟表制造商的进化

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

我该怎么做


我阅读了用户手册,研究了上的示例,查看了API,并在web上搜索。没有看到这个主题被特别提到。我不熟悉Java和遗传算法,所以我很容易错过一些东西

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


如果您想要一些不同的东西,您可能需要编写自己的
TerminationCondition
。它只是一个将
PopulationData
作为参数的单一方法,这样您就可以在每一代结束时基于此做出决策。您只需要能够根据平均值和/或最佳适应度以及到目前为止的世代数来定义“腐烂种群”。

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


如果您想要一些不同的东西,您可能需要编写自己的
TerminationCondition
。它只是一个将
PopulationData
作为参数的单一方法,这样您就可以在每一代结束时基于此做出决策。您只需要能够根据平均值和/或最佳适应度以及到目前为止的世代数来定义“腐烂种群”。

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


如果您想要一些不同的东西,您可能需要编写自己的
TerminationCondition
。它只是一个将
PopulationData
作为参数的单一方法,这样您就可以在每一代结束时基于此做出决策。您只需要能够根据平均值和/或最佳适应度以及到目前为止的世代数来定义“腐烂种群”。

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


如果您想要一些不同的东西,您可能需要编写自己的
TerminationCondition
。它只是一个将
PopulationData
作为参数的单一方法,这样您就可以在每一代结束时基于此做出决策。您只需要能够根据平均值和/或最佳适应度以及到目前为止的代数来定义“腐烂种群”。

重新阅读API时,我发现可以向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;
}
在我的例子中,目标每次都以固定的数量递增。尺寸和停滞随着目标立方体的增加而增加。这样,一个特定的群体变得越好,投入的时间就越多。不确定这是不是最好的方法,但对于这个问题,它得到了我想要的答案


哦,顺便说一句,我的程序看起来不像我上面粘贴的程序。我是一个相当差劲的程序员,我的代码比这更难看。只是想说明这个想法的要点。

重新阅读API时,我发现可以向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;
}
在我的例子中,目标每次都以固定的数量递增。尺寸和停滞随着目标立方体的增加而增加。这样,一个特定的群体变得越好,投入的时间就越多。不确定这是不是最好的方法,但对于这个问题,它得到了我想要的答案

哦,顺便说一句,我的程序看起来不像我上面粘贴的程序。我是个相当差劲的人