代码之家  ›  专栏  ›  技术社区  ›  Allan

如何使用jenetics绘制遗传算法中不同世代的适应度

  •  0
  • Allan  · 技术社区  · 7 年前

    一般来说,您将如何打印或绘制使用jenetics库创建的每一代人的健康分数?

    我自己的代码更具体:

    private static double clashes(final Genotype<EnumGene<Integer>> gt) {
            // Calculate the path distance.
    
    
    
                    final int[] intTriplets=gt.getChromosome().stream().mapToInt(EnumGene<Integer>::getAllele).toArray();
                    ArrayList<Triplet> triplets=new ArrayList<Triplet>();
                    for(int i=0;i<intTriplets.length;i++)
                    {
                        Triplet e=intToTriplet.get(intTriplets[i]);
                        triplets.add(e);
                    }
                    double clashes=returnScore(triplets);
    
            return (clashes);
    
    
    
    public static void main(String[] args) {
            final Engine<EnumGene<Integer>, Double> engine = Engine
                .builder(
                    GA::clashes,
                    PermutationChromosome.ofInteger(REQUIREMENTS))
                .optimize(Optimize.MINIMUM)
                            .offspringFraction(0.75)//0.6 standaard
                            .survivorsSelector (new TournamentSelector <>(7) )  //standaard new TournamentSelector <>(3)
                            .offspringSelector (new RouletteWheelSelector <>() )  //standaard new TournamentSelector <>(3)
                .maximalPhenotypeAge(40)//standaard 70
                .populationSize(1000)
    
                           //.selector(new TournamentSelector<>(5))
                .alterers(
                    new SwapMutator<>(0.02),
                    new PartiallyMatchedCrossover<>(0.7))
                .build();
    

    我注意到可能存在过早收敛,因为尽管将稳态适应度限制设置为200,但我只获得有限的世代数。 所以我想弄清楚在哪一代人左右,身体素质得分的变化接近0,并打印出每一代人中最佳元素的身体素质得分。

    1 回复  |  直到 5 年前
        1
  •  0
  •   Franz Wilhelmstötter    7 年前

    你可以在进化过程中用 Stream.peek 方法: java EvolutionResult<EnumGene<Integer>, Double> stream = engine.stream() .limit(100) .peek(er -> System.out.println(er.getBestPhenotype())) .collect(EvolutionResult.toBestEvolutionResult()); 这将为每一代打印出最佳表型。

    推荐文章