1

我正在为遗传算法任务尝试 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。我想念什么吗?

4

1 回答 1

0

JGAP 默认使用NaturalSelectors. 这意味着每个染色体都有可能被选择用于下一步,与其染色体的适应度值成正比。被选中的可能性最高,并不能保证被子孙选中。

JGAP 允许您在Configuration设置中使用以下命令以确定性方式始终保留最佳染色体。一个通用的例子:

Configuration.setPreservFittestIndividual(boolean a_preserveFittest);

在您的情况下,您应该编写如下内容:

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

我希望它对你有帮助。有关更多信息,您可以在此处查看 JGAP v3.6 API

于 2016-04-20T09:23:38.070 回答