根据设计,遗传算法通过不将基因包含在后代中来消除集合中最弱的解决方案。
遗传算法如何选择谁生谁死
摘要:假设算法正在选择哪些解决方案将被选择、组合和变异以供下一代使用。每个解决方案都放在一个飞镖板上,但更好的解决方案在飞镖板上占用更多空间,因此当算法抛出飞镖时,更有可能击中更合适的解决方案。事实上,它甚至可能不止一次遇到同一个解决方案。
一旦它从飞镖板上获得了它的解决方案集(通常与您的原始集的人口规模相同,但可能包含来自多个飞镖击中相同解决方案的重复项),您获取该集,并通过随机切换“变异”它们解决方案的一部分。然后,您可以在一个非常有趣的过程中“配对”解决方案,在这个过程中,您在新一代中获取部分随机解决方案,并将它们组合成最终的生成集。
然后重复此过程。
没有飞镖命中的解决方案会发生什么?这完全取决于您的语言和数据结构,但它们可能只是被垃圾收集的对象。
实际代码
这是我在处理 (Java) 中编写的一些代码,用于模拟飞镖投掷过程
我只是称有机体 ArrayLists of floats,但它们可以是任何东西
ArrayList<Float> normalize(ArrayList<Float> inputArray){
float sum = 0;
ArrayList<Float> outputArray = new ArrayList<Float>();
for(int i = 0; i < inputArray.size(); i++){
sum += inputArray.get(i);
}
for(int i = 0; i < inputArray.size(); i++){
outputArray.add(inputArray.get(i)/sum);
}
return outputArray;
}
ArrayList<Float> pick(ArrayList<ArrayList> parents, ArrayList<Float> fitness){
float searchVal = random(0, 1);
float fitTotal = 0;
int fitIndex = 0;
while(searchVal > fitTotal && fitIndex < fitness.size()){
fitTotal += fitness.get(fitIndex);
fitIndex++;
}
if(fitIndex != 0){
return parents.get(fitIndex-1);
}
else{
return parents.get(0);
}
}
工作原理
这段代码包含两个方法;一个 normalize 方法和一个 pick 方法。
normalize 方法获取每个解决方案的适应度水平,并将其“标准化”成一个数组,其中每个适应度水平除以总数。这将导致每个健身水平占总数的百分比。它们加起来就是一。
pick 方法随后将接受这个标准化数组以及父解决方案数组(必须与 FITNESS LEVELS 的顺序相同),并选择一个 0-1 的随机数,该数字将匹配特定的适应度水平和算法将“挑选”该父代进行繁殖。
您会注意到,适应度越高的解决方案被“挑选”的机会就越高
这种“挑选”方法应该针对您想要的下一代生物重复。
编辑
OP 提到他们理解飞镖盘的类比,并且想知道将飞镖盘上的坏飞镖完全擦掉是否有用。一开始挑选坏后代的机会很低,但是像这样的手动修剪也可以。
我可以看到这在您不希望解决方案具有非常糟糕的特征并且您不希望它们被放入下一组的情况下很有用。