2012-07-20 57 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));

这会增加突变率。它应该解决问题。至于为什么他们在教程中有这种方式,我不知道,但我认为教程与他们的最新版本有点过时。