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

Combining Survival of the Fittest with Genetic Algorithm?

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

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

此外,我所有的想法都是基于 Peter Norvig 的 AI 书中给出的算法的 3 页解释,所以也许我的问题已经得到解决。我需要了解这些事件。

另外这是我在这个平台上的第一个问题,所以社区,请不要对我苛刻!

遗传算法通过设计,通过简单地不在后代中包含它们的基因来消除集合中最弱的解决方案。

遗传算法如何Select谁生谁死

摘要:假设算法正在选择要为下一代选择、组合和变异哪些解决方案。每个方案都放在飞镖盘上,但较好的方案在飞镖盘上占用的space多,所以当算法扔飞镖时,更有可能命中更合适的方案。事实上,它甚至可能不止一次命中相同的解决方案。

一旦它从飞镖板上获得了它的解决方案集(通常与原始集的人口规模相同,但可能包含来自多个飞镖击中相同解决方案的重复项),您就可以使用这个集,并通过以下方式“变异”它们随机切换部分解决方案。然后,您可以在一个非常性感的过程中“交配”解决方案,在这个过程中,您可以在新一代中获取部分随机解决方案,并将它们组合起来形成最终的生成集。

然后重复此过程。

没有飞镖命中的解会怎样?这完全取决于您的语言和数据结构,但它们可能 objects 只是被垃圾收集。

实际代码

这是我在处理 (Java) 中编写的一些代码,用于模拟 dart-throwing 过程

我只是将生物体称为浮点数数组列表,但它们可以是任何东西

 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); 
   }
  }

工作原理

这段代码包含两个方法;规范化方法和选择方法。

归一化方法采用每个解决方案的适应度水平,并将其“归一化”到一个数组中,其中每个适应度水平除以总数。这将导致每个健康水平占总健康水平的百分比。他们将全部加起来。

然后 pick 方法将接受这个规范化数组,以及 parent 个解决方案的数组(必须与健身水平相同),并选择一个随机数 0-1,这数字将匹配特定的健身水平,算法将“选择”parent 进行复制。

您会注意到,适应度水平较高的解决方案被“选中”的机会较高

对于你想要的下一代的每个生物体,都应该重复这种“挑选”方法。

编辑

OP 提到他们理解飞镖盘的类比,并且想知道将坏的从飞镖盘上完全擦掉是否有用。一开始选出不良后代的机会很低,但像这样的手动修剪也可以。

我认为这在存在您不希望解决方案具有的非常糟糕的特征并且您不希望将它们放入其中的情况下很有用下一组。