Использование библиотеки Jenetics - PullRequest
0 голосов
/ 02 декабря 2018

Предполагая, что я хочу использовать библиотеку Genetics для решения проблемы, и я хочу сказать, 20 поколений.Однако я хочу применить Elitism для первых 10 поколений и отключить его для остальных поколений.Как мне это сделать?

1 Ответ

0 голосов
/ 03 декабря 2018

Вы можете сделать это с помощью ConcatEngine, доступного в модуле io.jenetics.ext.

import io.jenetics.DoubleGene;
import io.jenetics.EliteSelector;
import io.jenetics.MeanAlterer;
import io.jenetics.Mutator;
import io.jenetics.RouletteWheelSelector;
import io.jenetics.engine.Engine;
import io.jenetics.engine.EvolutionResult;
import io.jenetics.engine.EvolutionStreamable;
import io.jenetics.engine.Limits;
import io.jenetics.engine.Problem;

import io.jenetics.ext.engine.ConcatEngine;

public class Elite {
    public static void main(final String[] args) {
        // Your problem definition.
        final Problem<double[], DoubleGene, Double> problem = null;

        // Evolution Engine with elitism selector.
        final Engine<DoubleGene, Double> eliteEngine = Engine.builder(problem)
            .minimizing()
            .selector(new EliteSelector<>())
            .build();

        // Evolution Engine with RouletteWheelSelector.
        final Engine<DoubleGene, Double> remainingEngine = Engine.builder(problem)
            .minimizing()
            .selector(new RouletteWheelSelector<>())
            .build();

        // Concatenation of the two engine.
        final EvolutionStreamable<DoubleGene, Double> engine = ConcatEngine.of(
            eliteEngine.limit(10),
            remainingEngine.limit(() -> Limits.bySteadyFitness(30))
        );

        final EvolutionResult<DoubleGene, Double> result = engine.stream()
            .collect(EvolutionResult.toBestEvolutionResult());

        System.out.println(result);
    }
}
...