【发布时间】:2013-12-21 06:57:23
【问题描述】:
据我所知,进化算法和遗传算法之间最大的区别之一是进化使用变异函数来生成新种群,而遗传算法使用交叉函数。
我发现了一个evolutionary algorithm,它试图通过这样的突变来生成目标字符串:
private static double newMutateRate(){
return (((double)perfectFitness - fitness(parent)) / perfectFitness * (1 - minMutateRate));
}
private static String mutate(String parent, double rate){
String retVal = "";
for(int i = 0;i < parent.length(); i++){
retVal += (rand.nextDouble() <= rate) ?
possibilities[rand.nextInt(possibilities.length)]:
parent.charAt(i);
}
return retVal;
}
我写了这个交叉函数来代替变异函数:
private static String crossOver(String parent)
{
String newChild = "";
for(int i = 0; i < parent.length(); i++)
{
if(parent.charAt(i) != target.charAt(i))
newChild += possibilities[rand.nextInt(possibilities.length)];
else
newChild += parent.charAt(i);
}
return newChild;
}
效果很好。 但我想知道它是否是一个有效的交叉函数。我觉得,根据我在遗传算法方面的经验,交叉函数应该产生比我所写的更多的随机种群,换句话说,确切地知道哪一点不改变似乎几乎是作弊。
【问题讨论】:
-
您第一段中的假设(“进化使用变异函数来产生新种群,而遗传使用交叉函数”)是错误的。不同之处在于遗传算法是进化算法的一个子类型,它明确使用“基因”来模拟个体的特征。阅读 this Wikipedia section 了解 EA 的比较。
-
@Junuxx 这个问题不是GA要解决的最实际的问题,而只是学习目的之一,因为您已经知道用于计算适应度的最佳目标字符串。
标签: java algorithm genetic-algorithm evolutionary-algorithm