我正在使用一系列教程,用javascript构建我的第一个遗传算法。
我正在为该调度教程http://www.codeproject.com/KB/recipes/GaClassSchedule.aspx#Chromosome8构建一个稍微简单的结构,但是我遇到了育种问题。
我有60个个体,现在我选择前两个个体进行育种,然后再随机选择几个其他个体与前两个进行育种,这样我最终不会得到相当少的 parent 吗很快?
我认为,如果我在接下来的20个结果中均获得前两个结果,则在解决方案方面不会取得太大进展。
那是对的吗?有一种普遍接受的方法可以做到这一点吗?
最佳答案
我在Javascript here中有一个遗传算法样本。
您的方法存在的一个问题是,您通过始终与前2个个体交配来杀死种群中的多样性。这永远不会很好用,因为它的过于贪婪,实际上您实际上将击败拥有遗传算法的目的。
这就是我与 eliteism 进行交配的方式(这意味着我保留了一部分未改变的最合适的人,并随机交配其余所有人),然后让代码开始讨论:
// save best guys as elite population and shove into temp array for the new generation
for(var e = 0; e < ELITE; e++) {
tempGenerationHolder.push(fitnessScores[e].chromosome);
}
// randomly select a mate (including elite) for all of the remaining ones
// using double-point crossover should suffice for this silly problem
// note: this should create INITIAL_POP_SIZE - ELITE new individualz
for(var s = 0; s < INITIAL_POP_SIZE - ELITE; s++) {
// generate random number between 0 and INITIAL_POP_SIZE - ELITE - 1
var randInd = Math.floor(Math.random()*(INITIAL_POP_SIZE - ELITE));
// mate the individual at index s with indivudal at random index
var child = mate(fitnessScores[s].chromosome, fitnessScores[randInd].chromosome);
// push the result in the new generation holder
tempGenerationHolder.push(child);
}
它的注释相当好,但是如果您需要任何其他指针,请询问(并且here是github存储库,或者您可以在上面的URL上执行查看源代码)。我多次使用这种方法(精英主义),对于基本情况,通常效果很好。
希望这可以帮助。