最大化 Java 中的函数
Maximize function in Java
我关注 an example 关于 Java 中的遗传算法。虽然我理解这个应用程序的概念,但我不明白我将如何应用我选择的公式并让遗传算法找到它与 x
(个体基因)的最高值。
我尝试了下面的代码,通过使适应度 return 公式的值如下:
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
的值,它将 return 最高 result
。通过不指定解决方案,它将在找到代表 0
.
的基因时结束
那么问题来了:
我如何将公式应用于遗传算法,以便它寻找公式 -x² + 7x
?
的最高结果
"specifying a solution"你可能指的是博客中的以下功能:
static int getMaxFitness() {
int maxFitness = solution.length;
return maxFitness;
}
这对你的情况造成了麻烦。愚蠢的解决方案:
static int getMaxFitness() {
return 12;
}
现在算法会找到3
(00011
你只需要5bits/genes来检查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);
}
当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;
}
}
我关注 an example 关于 Java 中的遗传算法。虽然我理解这个应用程序的概念,但我不明白我将如何应用我选择的公式并让遗传算法找到它与 x
(个体基因)的最高值。
我尝试了下面的代码,通过使适应度 return 公式的值如下:
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
的值,它将 return 最高 result
。通过不指定解决方案,它将在找到代表 0
.
那么问题来了:
我如何将公式应用于遗传算法,以便它寻找公式 -x² + 7x
?
"specifying a solution"你可能指的是博客中的以下功能:
static int getMaxFitness() {
int maxFitness = solution.length;
return maxFitness;
}
这对你的情况造成了麻烦。愚蠢的解决方案:
static int getMaxFitness() {
return 12;
}
现在算法会找到3
(00011
你只需要5bits/genes来检查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);
}
当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;
}
}