Java中函数的最大化
我学习了Java中的遗传算法。虽然我理解此应用程序的概念,但我不明白如何应用我选择的公式,让遗传算法通过Java中函数的最大化,java,algorithm,genetic-algorithm,maximize,Java,Algorithm,Genetic Algorithm,Maximize,我学习了Java中的遗传算法。虽然我理解此应用程序的概念,但我不明白如何应用我选择的公式,让遗传算法通过x(一个个体的基因)找到它的最高值 我尝试了以下代码,让适应度返回公式的值,如下所示: static int getFitness(Individual individual) { int fitness = 0; Integer x = Integer.parseInt(individual.toString(), 2); fitness = calculateFo
x
(一个个体的基因)找到它的最高值
我尝试了以下代码,让适应度返回公式的值,如下所示:
static int getFitness(Individual individual) {
int fitness = 0;
Integer x = Integer.parseInt(individual.toString(), 2);
fitness = calculateFormula(x);
return fitness;
}
public static int calculateFormula(int x) {
int result = (-x * x) + (7 * x);
return result;
}
但是在我遵循的教程中,您应该在开始时指定一个解决方案。但当我这样做时,它将搜索该解决方案,而不是返回最高
结果的x
的值。通过不指定解决方案,它将在找到代表0
的基因时结束
因此,问题是:
我如何将公式应用到遗传算法中,使其能够查找公式的最高结果-x²+7x
?通过“指定解决方案”,您可能指的是博客中的以下函数:
static int getMaxFitness() {
int maxFitness = solution.length;
return maxFitness;
}
这会给你带来麻烦。愚蠢的解决方案:
static int getMaxFitness() {
return 12;
}
现在,算法将找到3
(00011
您只需要5位/基因即可检查0
到31
)或4
(00100
)
对于更智能的解决方案,我们必须查看终止标准:
int generationCount = 0;
while(myPop.getFittest().getFitness() < FitnessCalc.getMaxFitness()){
generationCount++;
System.out.println("Generation: "+generationCount+" Fittest: "+myPop.getFittest().getFitness());
myPop = Algorithm.evolvePopulation(myPop);
}
int generationCount=0;
而(myPop.getFittest().getFitness()
当X代没有改进时,您可以停止寻找解决方案:
int bestFitness = Integer.MIN_VALUE;
Individual bestIndividual = null;
int noImprovementCount = 0;
for (int generationCount = 1;; generationCount++) {
System.out.println("Generation: "+generationCount+" Fittest: "+myPop.getFittest().getFitness());
myPop = Algorithm.evolvePopulation(myPop);
if (bestFitness < myPop.getFittest().getFitness()) {
bestIndividual = myPop.getFittest();
bestFitness = bestIndividual.getFitness();
noImprovementCount = 0;
} else if (++noImprovementCount == 5) { // X = 5
break;
}
}
int-bestFitness=Integer.MIN\u值;
个人最佳个人=空;
int noImprovementCount=0;
for(int generationCount=1;generationCount++){
System.out.println(“Generation:+generationCount+”Fittest:+myPop.getFittest().getFittest());
myPop=算法.进化人口(myPop);
if(bestFitness
“在开始时指定解决方案”-这是什么意思?在什么的开始?我跟踪的@KevinHooke在项目开始时使用了候选解决方案。程序在找到候选人后停止。我喜欢让遗传算法在找到公式的最大结果或达到最大迭代次数时停止。“找到最大结果时停止”-从何处调用代码?您的代码中没有如图所示的任何迭代,那么是否有其他东西在循环中调用您的代码?确定最大结果的逻辑在哪里?这对于GA来说是一个非常烦人的函数。由于包装,它返回的值到处都是。基因上彼此接近的输入在适应性上相差很远,这真的很糟糕。FWIW你可以很容易地用蛮力来解决这个问题,optima是-1161827623和1161827630,除非我在这里遗漏了什么…这看起来更像是一个微积分问题,用一个导数来解决非常简单…谢谢你的回答。我指定候选解决方案的意思是。在您添加到我的代码后,我仍然需要添加这一行,并告诉算法“00011”是我想要找到的解决方案。还是我遗漏了什么?谢谢您的回复。@Lars就我所知,您不需要设置解决方案,因为您替换了getFitness函数。这只是为了表明,通过这个适应度函数(计算与解决方案相同的比特数),人口确实会朝着候选解决方案发展。对不起,我的反应太晚了。这真是太完美了!你帮了我这么多,我可以让它在我目前的项目中工作。