2017-11-09 6 views
0

私はJeneticsライブラリを使用してgaの問題を解決しています。Jeneticsを使用して1つの染色体のみが良好な結果を示します

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); 

そして正確に8 1と8 0持ってeval機能を変更します:

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()); 

私は、この評価関数を最大化する3つの染色体を生成することを期待していましたが、私は得ています:

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

ご覧のとおり、最初の結果のみが条件を満たしています。すべての染色体が評価関数を最大にするように、この例をどのように拡張できますか?

答えて

1

これは、私がフィットネス機能を見たときに期待していたものです。あなたはフィットネスを計算するために最初の染色体のみを使用しています。 Genotype.getChromosome()メソッドは最初の染色体を返します。 Genotype.getChromosome(0)のショートカットです。他の2つの染色体は、あなたのフィットネス機能で考慮されていません。

関連する問題