Artificial intelligence 将适者生存与遗传算法相结合?

Artificial intelligence 将适者生存与遗传算法相结合?,artificial-intelligence,computer-science,genetic-algorithm,evolutionary-algorithm,mutation,Artificial Intelligence,Computer Science,Genetic Algorithm,Evolutionary Algorithm,Mutation,我正在实现我心爱的“遗传算法”。很明显,在每次选择、交叉和变异的迭代之后,种群数量都会大量增加。 但生物体也会死亡,对吗? 然而,在我们都知道的算法中没有这样的规定 所以我的问题是,我们为什么不干脆从种群本身中剔除一些适应性较低的生物体(并合并适者生存理论)?为什么要承担他们的负担并浪费资源(在我们的例子中是内存) 另外,我所有的想法都是基于彼得·诺维格(Peter Norvig)的人工智能书中给出的算法的3页解释,所以我的问题可能已经被解决了。我需要知道这些事情 另外,这是我在这个平台上的第一

我正在实现我心爱的“遗传算法”。很明显,在每次选择、交叉和变异的迭代之后,种群数量都会大量增加。 但生物体也会死亡,对吗? 然而,在我们都知道的算法中没有这样的规定

所以我的问题是,我们为什么不干脆从种群本身中剔除一些适应性较低的生物体(并合并适者生存理论)?为什么要承担他们的负担并浪费资源(在我们的例子中是内存)

另外,我所有的想法都是基于彼得·诺维格(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); 
   }
  }