Class CyclicEngine<G extends Gene<?,​G>,​C extends Comparable<? super C>>

  • Type Parameters:
    G - the gene type
    C - the fitness type
    All Implemented Interfaces:
    EvolutionStreamable<G,​C>

    public final class CyclicEngine<G extends Gene<?,​G>,​C extends Comparable<? super C>>
    extends Object
    The CyclicEngine lets you concatenate two (or more) evolution Engine, with different configurations, and let it use as one engine EvolutionStreamable. If the last evolution stream terminates, it's final result is fed back to first engine.
     
                      +----------+               +----------+
                      |       ES |               |       ES |
              +------------+     |       +------------+     |
      (Start) |            |-----+ Start |            |-----+
     ---+---->|  Engine 1  |------------>|  Engine 2  | --------+
        ^     |            | Result      |            |         |
        |     +------------+             +------------+         |
        |                                                       |
        +------------------------------<------------------------+
                                  Result
     
    The CyclicEngine allows to do an broad search-fine search-cycle as long as you want.
    final Problem<double[], DoubleGene, Double> problem = Problem.of( v -> Math.sin(v[0])*Math.cos(v[1]), Codecs.ofVector(DoubleRange.of(0, 2*Math.PI), 2) ); final Engine<DoubleGene, Double> engine1 = Engine.builder(problem) .minimizing() .alterers(new Mutator<>(0.2)) .selector(new MonteCarloSelector<>()) .build(); final Engine<DoubleGene, Double> engine2 = Engine.builder(problem) .minimizing() .alterers( new Mutator<>(0.1), new MeanAlterer<>()) .selector(new RouletteWheelSelector<>()) .build(); final Genotype<DoubleGene> result = CyclicEngine.of( engine1.limit(50), engine2.limit(() -> Limits.bySteadyFitness(30))) .stream() .limit(Limits.bySteadyFitness(1000)) .collect(EvolutionResult.toBestGenotype()); System.out.println(result + ": " + problem.fitness().apply(problem.codec().decode(result)));
    When using a CyclicEnginePool, you have to limit the final evolution stream, additionally to the defined limits on the used partial engines.
    Since:
    4.1
    Version:
    4.1
    See Also:
    ConcatEngine