最大化 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;
}

现在算法会找到300011你只需要5bits/genes来检查031)或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;
  }
}