2016-04-02 64 views
1

我正在嘗試遺傳算法任務的JGAP。我用自己的例子:JGAP不保存適合測試個人

// Start with a DefaultConfiguration, which comes setup with the 
    // most common settings. 
    // ------------------------------------------------------------- 
    Configuration conf = new DefaultConfiguration(); 

    // Set the fitness function we want to use, which is our 
    // MinimizingMakeChangeFitnessFunction that we created earlier. 
    // We construct it with the target amount of change provided 
    // by the user. 
    // ------------------------------------------------------------ 
    int targetAmount = TARGET_AMOUNT_OF_CHANGE; 
    FitnessFunction myFunc = new MinimizingMakeChangeFitnessFunction(targetAmount); 

    conf.setFitnessFunction(myFunc); 

    // Now we need to tell the Configuration object how we want our 
    // Chromosomes to be setup. We do that by actually creating a 
    // sample Chromosome and then setting it on the Configuration 
    // object. As mentioned earlier, we want our Chromosomes to 
    // each have four genes, one for each of the coin types. We 
    // want the values of those genes to be integers, which represent 
    // how many coins of that type we have. We therefore use the 
    // IntegerGene class to represent each of the genes. That class 
    // also lets us specify a lower and upper bound, which we set 
    // to sensible values for each coin type. 
    // -------------------------------------------------------------- 
    Gene[] sampleGenes = new Gene[4]; 

    sampleGenes[0] = new IntegerGene(conf, 0, 3); // Quarters 
    sampleGenes[1] = new IntegerGene(conf, 0, 2); // Dimes 
    sampleGenes[2] = new IntegerGene(conf, 0, 1); // Nickels 
    sampleGenes[3] = new IntegerGene(conf, 0, 4); // Pennies 

    Chromosome sampleChromosome = new Chromosome(conf, sampleGenes); 

    conf.setSampleChromosome(sampleChromosome); 

    // Finally, we need to tell the Configuration object how many 
    // Chromosomes we want in our population. The more Chromosomes, 
    // the larger the number of potential solutions (which is good 
    // for finding the answer), but the longer it will take to evolve 
    // the population each round. We'll set the population size to 
    // 500 here. 
    // -------------------------------------------------------------- 
    conf.setPopulationSize(30000); 

    Genotype population = Genotype.randomInitialGenotype(conf); 

    for (int i = 0; i < MAX_ALLOWED_EVOLUTIONS; i++) { 
     population.evolve(); 
    } 

    IChromosome bestSolutionSoFar = population.getFittestChromosome(); 

當我打印:

System.out.println(population.getConfiguration().isPreserveFittestIndividual()); 

我看到它是false。我錯過了什麼嗎?

回答

0

JGAP默認使用NaturalSelectors。這意味着每一條染色體都有一個選擇的概率,用於下一步與其染色體的適應值成正比。選擇的最高可能性不能保證爲後代選擇。

JGAP允許您使用Configuration設置中的以下命令,以確定性的方式始終保留最佳染色體。一個普通的例子:

Configuration.setPreservFittestIndividual(boolean a_preserveFittest); 

在你的情況,你應該寫這樣的事情:

... 
conf.setFitnessFunction(myFunc); 
conf.setPreservFittestIndividual(true); 
... 

我希望它可以幫助你。欲瞭解更多信息,您可以看到JGAP v3.6 API Here