JGAP Does not Preserve Fittest Individual

131 Views Asked by At

I'm trying JGAP for a genetic algorithm task. I've used their example:

    // 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();

When I print that:

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

I see that it is false. Do I miss anything?

1

There are 1 best solutions below

0
On

JGAP uses by default NaturalSelectors. That means that each chromosome has a probability to be selected for the next step proportional to the fitness value of it's chromosome. Have the highest possibility of be selected doesn't ensure to be selected for future generations.

JGAP allows you to preserve always the best chromosome in a deterministic maner using the following command in the Configuration setup. A generic example:

Configuration.setPreservFittestIndividual(boolean a_preserveFittest);

In your case you should write something like this:

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

I wish it helps you. For more information you could see the JGAP v3.6 API Here