首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jenetics:在stream()之外设置EvolutionStream限制

jenetics:在stream()之外设置EvolutionStream限制
EN

Stack Overflow用户
提问于 2020-12-07 12:58:58
回答 1查看 109关注 0票数 1

jenetics中有几种为EvolutionStream设置终止限制的可能性,参见文档

这些限制通常直接适用于stream

代码语言:javascript
复制
Phenotype<IntegerGene,Double> result = engine.stream()
    .limit(Limits.bySteadyFitness(10))
    .collect(EvolutionResult.toBestPhenotype());

代码语言:javascript
复制
Phenotype<IntegerGene,Double> result = engine.stream()
    .limit(Limits.byFixedGeneration(10))
    .collect(EvolutionResult.toBestPhenotype());

或者组合在一起,请参见示例

代码语言:javascript
复制
Phenotype<IntegerGene,Double> result = engine.stream()
    .limit(Limits.bySteadyFitness(10))
    .limit(Limits.byFixedGeneration(10))
    .collect(EvolutionResult.toBestPhenotype());

在我的优化问题中,我想让用户决定给问题分配哪些限制。我不知道预先设置的限制。可能是多重限制。因此,我必须在运行时分配限制类型。

我试图通过以下方式创建EvolutionStream对象

代码语言:javascript
复制
EvolutionStream<IntegerGene, Double> evolutionStream = engine.stream();

并指定evolutionStream的限制

代码语言:javascript
复制
Stream<EvolutionResult<IntegerGene, Double>> limit = evolutionStream.limit(Limits.byFixedGeneration(10));

结果是一个,它不知道EvolutionStream特定的限制方法。因此,如果定义了多个限制,我就不能应用它。试着投

代码语言:javascript
复制
evolutionStream = (EvolutionStream<IntegerGene, Double>)evolutionStream.limit(Limits.byFixedGeneration(10));

导致错误:

代码语言:javascript
复制
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')

那么,是否有一种方法可以正确地应用流生成器之外的多个限制?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-07 14:17:04

EvolutionStream.limit(Predicate)方法确实返回一个EvolutionStream

代码语言:javascript
复制
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

代码语言:javascript
复制
@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)
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65182184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档