2012-07-20 33 views
2

我實現了與jenes庫(Tutorial 5: ObjectChromosome‎)一起提供的Java示例。我發現人羣中的個體都是一樣的(即沒有隨機化發生);重複同一人羣中的個人

我添加以下代碼OCProblem類ga.evolve();後打印每個個體在羣體:

ga.evolve(); 
Population pop= ga.getCurrentPopulation(); 
ArrayList population_test= pop.getIndividuals(); 

for(int n=0; n < population_test.size(); n++){ 
    Individual<ObjectChromosome> individual=(Individual<ObjectChromosome>) population_test.get(n); 
    ObjectChromosome chrom = individual.getChromosome(); 

    int i1 = (Integer)chrom.getValue(0); 
    int i2 = (Integer)chrom.getValue(1); 
    double i3= (double)chrom.getValue(2); 
    boolean i4= (boolean)chrom.getValue(3); 
    Color i5= (Color)chrom.getValue(4); 

    System.out.println("[ "+ i1+" , "+ i2+" , "+ i3+" , "+ i4+" , "+ i5+" ] "); 
} 

輸出是令人震驚的個體被複制! 這是從前面的代碼

教程5的輸出:查找最接近目標的顏色的順序。 [6, ,20,0.5623470035526044,false,(RED)] [6,,0.5623470035526044,false,(RED)] [6,20,0.5623470035526044, false,(RED)] [6,20,0.5623470035526044, ,(RED)] [6 ,20,0.5623470035526044,false,(RED)] [6,20 ,0.5623470035526044,false,(RED)] [6,20,0.5623470035526044, false,(RED)] [6, 20,0.5623470035526044,假的,(RED)] [6 ,20,0.5623470035526044,假的,(RED)] [6,20 ,0.5623470035526044,假的,(RED)

有誰知道爲什麼隨機方法在jenes庫中doesn'在人口上工作?

回答

0

免責聲明: 我對遺傳算法,特別是這個圖書館沒有絲毫的(也許有些)想法。

不過,我會大膽猜測:

1)每個循環中,您可以:

ObjectChromosome chrom = individual.getChromosome(); 

的那麼開心地丟棄這些信息,使用命名模板未在定義一些變量此範圍:

int i1 = (Integer)template.getValue(0); 

等等

2)這個猜測有點超出了我眼前的知識:檢查所有人羣。所有標本進化爲具有相同的遺傳指紋是否真的不可能?

+0

我編輯了帖子中的代碼「我的壞,我錯誤地複製了代碼」。不幸的是這不是問題。我相信這是隨機化方法中的一些事情,因爲當我調試和跟蹤代碼時,我總是有這些重複的個體。無論如何感謝您的評論:) – Abreal 2012-07-20 15:14:24

0

顯然,突變率太低(如果我正確理解它們的API,則爲2%)。如果你改變這一行:

ga.addStage(new SimpleMutator(0.02));

爲了這樣的事情:

ga.addStage(新SimpleMutator(0.2));

這會增加突變率。它應該解決問題。至於爲什麼他們在教程中有這種方式,我不知道,但我認爲教程與他們的最新版本有點過時。