我正在尝试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 :(得分:0)
JGAP默认使用NaturalSelectors
。这意味着每条染色体都有可能被选择用于下一步与其染色体的适合度值成比例。被选中的最高可能性并不能确保为后代选择。
JGAP允许您使用Configuration
设置中的以下命令以确定性方式始终保留最佳染色体。一般例子:
Configuration.setPreservFittestIndividual(boolean a_preserveFittest);
在你的情况下,你应该写这样的东西:
...
conf.setFitnessFunction(myFunc);
conf.setPreservFittestIndividual(true);
...
我希望它可以帮到你。有关详细信息,请参阅JGAP v3.6 API Here