Artificial intelligence 将适者生存与遗传算法相结合?
我正在实现我心爱的“遗传算法”。很明显,在每次选择、交叉和变异的迭代之后,种群数量都会大量增加。 但生物体也会死亡,对吗? 然而,在我们都知道的算法中没有这样的规定 所以我的问题是,我们为什么不干脆从种群本身中剔除一些适应性较低的生物体(并合并适者生存理论)?为什么要承担他们的负担并浪费资源(在我们的例子中是内存) 另外,我所有的想法都是基于彼得·诺维格(Peter Norvig)的人工智能书中给出的算法的3页解释,所以我的问题可能已经被解决了。我需要知道这些事情Artificial intelligence 将适者生存与遗传算法相结合?,artificial-intelligence,computer-science,genetic-algorithm,evolutionary-algorithm,mutation,Artificial Intelligence,Computer Science,Genetic Algorithm,Evolutionary Algorithm,Mutation,我正在实现我心爱的“遗传算法”。很明显,在每次选择、交叉和变异的迭代之后,种群数量都会大量增加。 但生物体也会死亡,对吗? 然而,在我们都知道的算法中没有这样的规定 所以我的问题是,我们为什么不干脆从种群本身中剔除一些适应性较低的生物体(并合并适者生存理论)?为什么要承担他们的负担并浪费资源(在我们的例子中是内存) 另外,我所有的想法都是基于彼得·诺维格(Peter Norvig)的人工智能书中给出的算法的3页解释,所以我的问题可能已经被解决了。我需要知道这些事情 另外,这是我在这个平台上的第一
另外,这是我在这个平台上的第一个问题,所以社区,请不要对我苛刻 通过设计,遗传算法只需在后代中不包含它们的基因,就可以消除集合中最弱的解 遗传算法如何选择谁生谁死 摘要:假设算法正在选择下一代要选择、组合和变异的解决方案。每个解决方案都放在省道板上,但更好的解决方案会占用省道板上更多的空间,因此当算法抛出省道时,它更有可能找到更合适的解决方案。事实上,它甚至可能多次碰到同一个解决方案 一旦它从镖靶板上得到了它的“解决方案集”(通常与原始集的总体大小相同,但可能包含来自多个击中同一解决方案的镖的副本),您就可以获取该集,并通过随机切换解决方案的部分来“变异”它们。然后,您可以在一个非常性感的过程中“配对”解决方案,在新的一代中,您将随机解决方案的一部分,并将它们组合成最终的生成集 然后重复此过程 没有飞镖命中的解决方案会发生什么?这完全取决于您的语言和数据结构,但它们可能只是被垃圾收集的对象 实际代码 下面是我在processing(Java)中编写的一些代码,它模拟了掷镖过程 我只是把生物称为花车列表,但它们可以是任何东西
ArrayList规范化(ArrayList inputArray){
浮点数和=0;
ArrayList outputArray=新的ArrayList();
for(int i=0;ifitTotal&&fitIndex
工作原理
此代码包含两种方法;规格化方法和拾取方法
normalize方法获取每个解决方案的适应度级别,并将其“规格化”为一个数组,其中每个适应度级别除以总适应度。这将导致每个健身水平占总健身水平的百分比。它们加起来就是一个
然后,pick方法将采用此规范化数组以及父解决方案数组(必须与适应度级别的顺序相同),并选择一个随机数0-1,该数字将与特定的适应度级别匹配,算法将“选择”要复制的父解决方案
您会注意到,适合度更高的解决方案被“挑选”的几率更高
这种“挑选”方法应该在下一代中对你想要的每一种生物体重复
编辑
OP提到,他们理解飞镖板的类比,并想知道是否有必要将不好的飞镖板完全抹去。从一开始,挑选坏后代的机会很低,但是像这样的手工修剪也会奏效
我可以看到,如果你不希望解决方案具有某些非常糟糕的特性,并且你不希望它们被放入下一个集合中,那么这一点非常有用。其他人可以用更全面的方式回答这一问题,但简短的回答是,你的直觉是正确的,这在每一个这样的算法中都是绝对正确的。事实上,这可以看作是掷镖的过程。但我的问题是,在我们生产出新的泉水之后,我们应该有一个“杀死”功能,以消灭可怜的生物体,就像塔诺斯的思想一样!我还没有听说过这样的方法,但我确实知道你是从哪里来的。把飞镖板上的坏飞镖一起擦掉?如果它们足够糟糕,那么一开始被选中的可能性很小,但我认为你的方法真的很有趣!你应该试试看!如果你发现一个明显的改进,一定要称之为Thanos方法:)
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);
}
}