2016-07-12 31 views
1

我遵循an example关于Java中的遗传算法。虽然我理解这个应用程序的概念,但我不明白我将如何应用我选择的公式,并让遗传算法发现它是x(个体基因)的最高值。在Java中最大化功能

我尝试下面的代码,通过具有健身返回公式的值如下:

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的值,该值将返回最高的result。通过没有指定解决方案,只要它找到代表0的基因就会结束。

所以问题: 如何将一个公式应用到遗传算法中,所以它会查找公式最高的结果-x² + 7x

+0

“指定解决方案在开始时“ - 这是什么意思?什么时候开始? –

+0

@KevinHooke [The tutorial](http://www.theprojectspot.com/tutorial-post/creating-a-genenetic-algorithm-for-beginners/3)我在程序开始时使用了一个候选解决方案。程序找到该候选人后停止。我希望遗传算法在找到公式的最大结果或达到最大迭代时停止。 – Lars

+3

Re。 “当它找到最大结果时停止” - 你的代码是从哪里调用的?你没有在代码中显示任何迭代,所以是在循环中调用你的代码的其他东西?确定最大结果的逻辑在哪里? –

回答

1

通过“指定的解决方案”,你可能意味着在博客以下功能:

static int getMaxFitness() { 
    int maxFitness = solution.length; 
    return maxFitness; 
} 

这是你的情况下造成的麻烦。装聋作哑的解决方案:

static int getMaxFitness() { 
    return 12; 
} 

现在的算法会发现300011你只需要5位/基因检查031)或400100),因为它应该。

对于我们来看看终止条件更智能的解决方案:

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

谢谢你的回复。我的意思是指定一个候选解决方案是[this line](https://github.com/TisLars/genetic-algorithm/blob/master/src/Program.java#L12)。除了我的代码之外,我还需要添加这一行,并告诉算法“00011”是我想要找到的解决方案。或者我错过了什么?感谢回复。 – Lars

+0

@Lars你不需要设置一个解决方案,因为你替换了getFitness函数。只有在这里才能证明,通过这个适应度函数(计算与解相同的位数),人口确实会向候选解决方案发展。 – maraca

+0

来自我的这样一个迟到的反应,抱歉。这确实是完美的!你帮了我很多,我可以在我目前的项目中使用它。 – Lars