我正在为遗传算法任务尝试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
。我想念什么吗? 最佳答案
JGAP默认使用NaturalSelectors
。这意味着每个染色体都有与下一步染色体的适应度值成正比的下一步选择概率。被选择的可能性最高并不能确保为子孙后代选择。
JGAP允许您在Configuration
设置中使用以下命令,始终以确定性方式保留最佳染色体。通用示例:
Configuration.setPreservFittestIndividual(boolean a_preserveFittest);
在您的情况下,您应该这样写:
...
conf.setFitnessFunction(myFunc);
conf.setPreservFittestIndividual(true);
...
希望对您有帮助。有关更多信息,您可以查看JGAP v3.6 API Here