我实现了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,20 ,0.5623470035526044,false,(RED)] [6,20,0.5623470035526044, false,(RED)] [6,20,0.5623470035526044,false,(RED)] [6 ,20,0.5623470035526044,false,(RED)] [6,20 ,0.5623470035526044,false,(RED)] [6,20,0.5623470035526044, false,(RED)] [6,20,0.5623470035526044,false,(RED)] [6 ,20,0.5623470035526044,false,(RED)] [6,20 ,0.5623470035526044,false,(RED)]
有谁知道为什么jenes库中的随机方法对人口不起作用?
答案 0 :(得分:0)
声明: 我对遗传算法,特别是这个库没有丝毫(好吧,也许是一些)想法。
然而,我会猜测:
1)你得到的每个循环:
ObjectChromosome chrom = individual.getChromosome();
然后高兴地使用一些名为 template 的变量丢弃此信息,该变量未在此范围内定义:
int i1 = (Integer)template.getValue(0);
等...
2)这个猜测有点超出了我的直接知识:检查所有人群。是否真的不可能将所有标本进化成具有相同的遗传指纹?
答案 1 :(得分:0)
显然,突变率太低(如果我正确理解他们的API,则为2%)。如果您更改此行:
ga.addStage(new SimpleMutator(0.02));
对于这样的事情:
ga.addStage(new SimpleMutator(0.2));
这会增加突变率。它应该解决问题。至于为什么他们在教程中有这种方式,我不知道,但我认为该教程与他们的最新版本有点过时。