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, Я что-то пропустил?

1 ответ

JGAP использует по умолчанию NaturalSelectors, Это означает, что у каждой хромосомы есть вероятность быть выбранной для следующего шага, пропорциональной значению пригодности ее хромосомы. Иметь наибольшие шансы быть избранным не гарантирует, что тебя выберут для будущих поколений.

JGAP позволяет всегда сохранять лучшую хромосому в детерминированном виде, используя следующую команду в Configuration настроить. Типичный пример:

Configuration.setPreservFittestIndividual(boolean a_preserveFittest);

В вашем случае вы должны написать что-то вроде этого:

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

Я желаю, чтобы это помогло вам. Для получения дополнительной информации вы можете увидеть API JGAP v3.6 Здесь

Другие вопросы по тегам