Module io.jenetics.ext
Package io.jenetics.ext.engine
Class ConcatEngine<G extends Gene<?,G>,C extends Comparable<? super C>>
java.lang.Object
io.jenetics.ext.engine.ConcatEngine<G,C>
- Type Parameters:
G
- the gene typeC
- the fitness type
- All Implemented Interfaces:
EvolutionStreamable<G,
C>
The
An essential part, when concatenating evolution engines, is to make sure your
engines are creating limited evolution streams. This is what
the
ConcatEngine
lets you concatenate two (or more) evolution
Engine
, with different configurations, and let it
use as one engine EvolutionStreamable
.
+----------+ +----------+
| ES | | ES |
+-------+----+ | +-------+----+ |
(Start) | +-----+ Start | +-----+
------>| Engine 1 |------------>| Engine 2 |----------->
| | Result | | Result
+------------+ +------------+
The sketch above shows how the engine concatenation works. In this example,
the evolution stream of the first engine is evaluated until it terminates.
The result of the first stream is then used as start input of the second
evolution stream, which then delivers the final result.
Concatenating evolution engines might be useful, if you want to explore your search space with random search first and then start the real GA search.
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 =
ConcatEngine.of(
engine1.limit(50),
engine2.limit(() -> Limits.bySteadyFitness(30)))
.stream()
.collect(EvolutionResult.toBestGenotype());
System.out.println(result + ": " +
problem.fitness().apply(problem.codec().decode(result)));
EvolutionStreamable.limit(Supplier)
and
EvolutionStreamable.limit(long)
methods are for. Limiting an engine
means, that this engine will surely create only streams, which are limited
with the predicate/generation given to the engine. If you have limited your
engines, it is no longer necessary to limit your final evolution stream, but
you are still able to do so.- Since:
- 4.1
- Version:
- 4.1
- See Also:
-
Constructor Summary
ConstructorDescriptionConcatEngine
(List<? extends EvolutionStreamable<G, C>> engines) Create a new concatenating evolution engine with the given list of engines. -
Method Summary
Modifier and TypeMethodDescriptionstatic <G extends Gene<?,
G>, C extends Comparable<? super C>>
ConcatEngine<G, C> of
(EvolutionStreamable<G, C>... engines) Create a new concatenating evolution engine with the given array of engines.stream
(EvolutionInit<G> init) Create a new, possibly infinite, evolution stream with the given initial value.stream
(Supplier<EvolutionStart<G, C>> start) Create a new, possibly infinite, evolution stream with the given evolution start.
-
Constructor Details
-
ConcatEngine
Create a new concatenating evolution engine with the given list of engines.- Parameters:
engines
- the engines which are concatenated to one engine- Throws:
NullPointerException
- if theengines
or one of its elements isnull
-
-
Method Details
-
stream
Description copied from interface:EvolutionStreamable
Create a new, possibly infinite, evolution stream with the given evolution start. If an emptyPopulation
is given, the engine's genotype factory is used for creating the population. The given population might be the result of another engine, and this method allows to start the evolution with the outcome of a different engine. The fitness function is replaced by the one defined for this engine.- Parameters:
start
- the data the evolution stream starts with- Returns:
- a new infinite evolution stream
-
stream
Description copied from interface:EvolutionStreamable
Create a new, possibly infinite, evolution stream with the given initial value. If an emptyPopulation
is given, the engines genotype factory is used for creating the population. The given population might be the result of another engine, and this method allows to start the evolution with the outcome of a different engine. The fitness function is replaced by the one defined for this engine.- Parameters:
init
- the data the evolution stream is initialized with- Returns:
- a new infinite evolution stream
-
of
@SafeVarargs public static <G extends Gene<?,G>, ConcatEngine<G,C extends Comparable<? super C>> C> of(EvolutionStreamable<G, C>... engines) Create a new concatenating evolution engine with the given array of engines.- Type Parameters:
G
- the gene typeC
- the fitness type- Parameters:
engines
- the engines which are concatenated to one engine- Returns:
- a new concatenating evolution engine
- Throws:
NullPointerException
- if theengines
or one of its elements isnull
-