You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenetics框架技术问询:如何在每一步访问进化结果或统计数据

在Jenetics进化过程中逐步访问进化结果/统计数据的方法

嘿,看你已经基于Jenetics搭好了进化引擎的基础框架,要在进化过程的每一步获取进化结果或者统计数据其实很直接,咱们结合你现有的代码来拆解可行的方案:

1. 利用peek()扩展中间处理逻辑

你代码里已经用到了peek(best),其实peek()就是Stream API里专门用来在流元素处理前执行副作用操作的中间方法——刚好对应进化过程的每一步!你可以直接在peek()里加入自定义的访问/统计逻辑,保留原有MinMax逻辑的同时,获取每一代的EvolutionResult:

final MinMax<EvolutionResult<DoubleGene, Double>> best = MinMax.of();

_scannerEngine.stream()
    .limit(byPopulationConvergence(convergenceCriterion))
    .limit(result -> !Thread.currentThread().isInterrupted())
    .limit(maxGenerations)
    .peek(evolutionResult -> {
        // 保留你原本的最优结果追踪逻辑
        best.accept(evolutionResult);
        
        // 在这里实现每一步的自定义访问/统计!
        final int currentGen = evolutionResult.getGeneration();
        final double currentBestFitness = evolutionResult.getBestFitness();
        final Population<DoubleGene, Double> currentPopulation = evolutionResult.getPopulation();
        
        // 示例:打印当前世代的关键信息
        System.out.printf("Generation %d | Best Fitness: %.4f | Population Size: %d%n",
            currentGen, currentBestFitness, currentPopulation.size());
        
        // 也可以把数据存入自定义的统计收集器
        yourCustomStatsTracker.record(evolutionResult);
    })
    .forEach(evolutionResult -> {
        waiting();
        // 你的后续业务逻辑
    });

2. 用Jenetics自带的EvolutionStatistics做结构化统计

如果你需要的是标准化的进化统计数据(比如平均适应度、方差、最优值变化趋势等),Jenetics已经内置了EvolutionStatistics类,能自动帮你收集这些指标,结合peek()使用非常省心:

// 初始化适合数值型适应度的统计器
final EvolutionStatistics<Double, DoubleMomentStatistics> stats = EvolutionStatistics.ofNumber();

_scannerEngine.stream()
    .limit(byPopulationConvergence(convergenceCriterion))
    .limit(result -> !Thread.currentThread().isInterrupted())
    .limit(maxGenerations)
    .peek(stats) // 让统计器自动收集每一代的数据
    .peek(evolutionResult -> {
        // 随时可以访问结构化的统计结果
        System.out.println("=== Current Evolution Stats ===");
        System.out.println(stats);
        
        // 也可以提取更细粒度的统计值
        final DoubleMomentStatistics fitnessStats = stats.getFitnessStatistics();
        System.out.printf("Average Fitness: %.4f | Fitness Variance: %.4f%n",
            fitnessStats.getMean(), fitnessStats.getVariance());
    })
    .forEach(...);

3. 在forEach()中直接访问(适合最终处理)

如果你需要在每一步的最终处理环节访问结果,forEach()的参数本身就是当前的EvolutionResult,可以直接在这里操作:

.forEach(evolutionResult -> {
    waiting();
    
    // 在这里同样可以获取当前进化结果
    if (evolutionResult.getBestFitness() < someThreshold) {
        System.out.println("Target reached at generation: " + evolutionResult.getGeneration());
        // 甚至可以提前中断引擎
        Thread.currentThread().interrupt();
    }
});

小提示:EvolutionResult能拿到的核心数据

每一代的EvolutionResult包含了你可能需要的所有关键信息:

  • getGeneration():当前世代数
  • getBestFitness():当前种群的最优适应度
  • getBestPhenotype():当前最优个体的表型
  • getPopulation():当前完整种群
  • getDuration():当前世代的执行耗时

内容的提问来源于stack exchange,提问作者WolfiG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:25:08