在jenetics中有几种为EvolutionStream设置终止限制的可能性,参见文档。
这些限制通常直接适用于stream。
Phenotype<IntegerGene,Double> result = engine.stream()
.limit(Limits.bySteadyFitness(10))
.collect(EvolutionResult.toBestPhenotype());或
Phenotype<IntegerGene,Double> result = engine.stream()
.limit(Limits.byFixedGeneration(10))
.collect(EvolutionResult.toBestPhenotype());或者组合在一起,请参见示例
Phenotype<IntegerGene,Double> result = engine.stream()
.limit(Limits.bySteadyFitness(10))
.limit(Limits.byFixedGeneration(10))
.collect(EvolutionResult.toBestPhenotype());在我的优化问题中,我想让用户决定给问题分配哪些限制。我不知道预先设置的限制。可能是多重限制。因此,我必须在运行时分配限制类型。
我试图通过以下方式创建EvolutionStream对象
EvolutionStream<IntegerGene, Double> evolutionStream = engine.stream();并指定evolutionStream的限制
Stream<EvolutionResult<IntegerGene, Double>> limit = evolutionStream.limit(Limits.byFixedGeneration(10));结果是一个流,它不知道EvolutionStream特定的限制方法。因此,如果定义了多个限制,我就不能应用它。试着投
evolutionStream = (EvolutionStream<IntegerGene, Double>)evolutionStream.limit(Limits.byFixedGeneration(10));导致错误:
java.lang.ClassCastException: class java.util.stream.SliceOps$1 cannot be cast to class io.jenetics.engine.EvolutionStream (java.util.stream.SliceOps$1 is in module java.base of loader 'bootstrap'; io.jenetics.engine.EvolutionStream is in unnamed module of loader 'app')那么,是否有一种方法可以正确地应用流生成器之外的多个限制?
发布于 2020-12-07 14:17:04
EvolutionStream.limit(Predicate)方法确实返回一个EvolutionStream。
EvolutionStream<IntegerGene, Double> stream = engine.stream();
stream = stream
.limit(Limits.byFixedGeneration(10))
.limit(Limits.bySteadyFitness(5))
.limit(Limits.byExecutionTime(Duration.ofMillis(100)));所以你给出的例子看上去不错,应该有效。但是EvolutionStream.limit(Predicate)方法是给出一个EvolutionStream的唯一方法。
另一种选择是,初始化EvolutionStream的方法从外部获取Predicate。
@SafeVarargs
static EvolutionStream<IntegerGene, Double>
newStream(final Predicate<? super EvolutionResult<IntegerGene, Double>>... limits) {
final Engine<IntegerGene, Double> engine = Engine
.builder(a -> a.gene().allele().doubleValue(), IntegerChromosome.of(0, 100))
.build();
EvolutionStream<IntegerGene, Double> stream = engine.stream();
for (var limit : limits) {
stream = stream.limit(limit);
}
return stream;
}
final var stream = newStream(
Limits.byFixedGeneration(100),
Limits.byExecutionTime(Duration.ofMillis(1000)),
Limits.bySteadyFitness(10)
);https://stackoverflow.com/questions/65182184
复制相似问题