首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jenetics:我如何在每一步访问进化结果(或统计数据)?

Jenetics:我如何在每一步访问进化结果(或统计数据)?
EN

Stack Overflow用户
提问于 2018-03-22 11:49:47
回答 1查看 671关注 0票数 2

我正在开发一个基于Jenetics框架(链接到jenetics.io)的优化引擎。我有一个进化引擎的定义如下:

代码语言:javascript
复制
final Thread engineStream = new Thread(() -> {
final MinMax<EvolutionResult<DoubleGene, Double>> best = MinMax.of();

_scannerEngine.stream()
    .limit(byPopulationConvergence(convergenceCriterion))
    .limit(result -> !Thread.currentThread().isInterrupted())                              
    .limit(maxGenerations)
    .peek(best).forEach(evolutionResult -> {
        waiting();
        if (callback != null) {
            callback.accept(evolutionResult, best.getMax());
        }
        final String generationCounter = String.valueOf(evolutionResult.getGeneration());
       _callingInstance.doOnAlgorithmCallback(new String("****** finished generation: " + generationCounter + " ****"));
    });
}

engineStream.start();

目前,我正在完成一个进化周期(通过人口进行一次迭代),通过以下方式向我的UI发送消息:

代码语言:javascript
复制
peek(best).forEach(
    ...
    _callingInstance.doOnAlgorithmCallback(...)
)

我想要做的是在执行每个适应度步骤之后,将演化的当前状态(理想的一些统计数据包含当前的适应度平均值、最小值、最大值等)推到,这样用户就可以看到优化过程的当前状态。

有什么想法吗?

根据Franz Wilhelmst tter的建议最后执行:

代码语言:javascript
复制
final Thread engineStream = new Thread(() -> {
    final MinMax<EvolutionResult<DoubleGene, Double>> best = MinMax.of();

    try {
        _scannerEngine.stream() //
        // stop stream if fitness average across the population is smaller than % of best fitness
        .limit(byFitnessConvergence(5, 20, convergence%)) //
        .limit(interrupted -> !Thread.currentThread().isInterrupted()) //
        .limit(_geneticScanParameters.getMaxGenerationsLimit()) // maximum number of generations
        .peek(best) //
        .peek(_statistics) //
        .forEach(evolutionResult -> {
            waiting();
            if (callback != null) {
                MessageLogger.logError(getClass(), best.getMax().toString());
                if (_geneticScanParameters.getOptimizationStrategy() == Optimize.MAXIMUM) {
                    callback.accept(evolutionResult, best.getMax());
                } else if (_geneticScanParameters.getOptimizationStrategy() == Optimize.MINIMUM) {
                    callback.accept(evolutionResult, best.getMin());
                }
            }
            MessageLogger.log(getClass(), _statistics.toString());
            final String generationCounter = String.valueOf(evolutionResult.getGeneration());
            _callingInstance.doOnAlgorithmCallback(new String("****** finished generation: " + generationCounter + " ****"));
        });

        MessageLogger.log(getClass(), "\n" + _statistics.toString());
    } catch (final Exception ex) {
    MessageLogger.logError(getClass(), Thread.currentThread(), ex);
    }
    _callingInstance.doOnAlgorithmFinished();
});
engineStream.start();
_engineStream = engineStream;

请注意,我使用的约定是"_variable“是类属性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-22 12:18:14

为此,您可以使用EvolutionStatistics类。

代码语言:javascript
复制
final Engine<DoubleGene, Double> engine = ...
final EvolutionStatistics<Double, DoubleMomentStatistics> statistics =
    EvolutionStatistics.ofNumber();

final Phenotype<DoubleGene, Double> result = engine.stream()
    .limit(bySteadyFitness(7))
    .limit(100)
    .peek(statistics)
    .collect(toBestPhenotype());

System.println(statistics);

如果您更新peek方法中的类,您将得到一些额外的统计信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49427940

复制
相关文章

相似问题

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