我正在使用Jenetics库来解决ga问题。我将官方示例扩展为使用多个这样的染色体:

    List<BitChromosome> arr = new ArrayList<>();
    arr.add(BitChromosome.of(16, 0.5));
    arr.add(BitChromosome.of(16, 0.5));
    arr.add(BitChromosome.of(16, 0.5));
    Factory<Genotype<BitGene>> gtf = Genotype.of(arr);


并将eval函数更改为恰好具有8 1s和8 0s:

    private static int eval(Genotype<BitGene> gt) {
    return 10 - Math.abs(gt.getChromosome()
            .as(BitChromosome.class)
            .bitCount()-8);


其他部分保持不变:

    // 3.) Create the execution environment.
    Engine<BitGene, Integer> engine = Engine
            .builder(Test1::eval, gtf)
            .build();

    // 4.) Start the execution (evolution) and
    //     collect the result.
    Genotype<BitGene> result = engine.stream()
            .limit(100)
            .collect(EvolutionResult.toBestGenotype());


我期望ga产生3条染色体,从而最大化该评估功能,但我得到:

[01110010|00010111,01000000|00000100,10011101|01110110]


如您所见,只有第一个结果满足条件。我如何扩展该示例,以便所有染色体都能最大化评估功能?

最佳答案

看完健身功能后,这正是我所期望的。您仅使用第一条染色体来计算适应度。 Genotype.getChromosome()方法返回第一条染色体。这是Genotype.getChromosome(0)的快捷方式。健身功能中不考虑其他两个染色体。

08-08 00:34