【问题标题】:Combining Survival of the Fittest with Genetic Algorithm?将适者生存与遗传算法相结合?
【发布时间】:2020-03-26 02:48:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 其他人可以以更全面的方式回答这个问题,但简短的回答是你的直觉是正确的,这绝对是在每个这样的算法中完成的。

标签: artificial-intelligence computer-science genetic-algorithm evolutionary-algorithm mutation


【解决方案1】:

根据设计,遗传算法通过不将基因包含在后代中来消除集合中最弱的解决方案。

遗传算法如何选择谁生谁死

摘要:假设算法正在选择哪些解决方案将被选择、组合和变异以供下一代使用。每个解决方案都放在一个飞镖板上,但更好的解决方案在飞镖板上占用更多空间,因此当算法抛出飞镖时,更有可能击中更合适的解决方案。事实上,它甚至可能不止一次遇到同一个解决方案。

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

然后重复此过程。

没有飞镖命中的解决方案会发生什么?这完全取决于您的语言和数据结构,但它们可能只是被垃圾收集的对象。

实际代码

这是我在处理 (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 提到他们理解飞镖盘的类比,并且想知道将飞镖盘上的坏飞镖完全擦掉是否有用。一开始挑选坏后代的机会很低,但是像这样的手动修剪也可以。

我可以看到这在您不希望解决方案具有非常糟糕的特征并且您不希望它们被放入下一组的情况下很有用。

【讨论】:

  • 确实可以认为是投掷飞镖的过程。但我的问题是,我们应该在我们产生新的后代之后有一个“杀死”功能,以消除可悲的生物,就像灭霸的意识形态!
  • 我还没有听说过这样做的方法,但我实际上知道你来自哪里。把飞镖板上的坏的一起擦掉吗?如果它们足够糟糕,那么它们被选中的机会一开始就很小,但我实际上认为你的方法真的很有趣!你应该试试看!如果你发现有明显的改进,绝对称它为灭霸方法 :)
猜你喜欢
  • 2012-07-07
  • 1970-01-01
  • 2015-12-08
  • 2014-07-24
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 2014-06-15
  • 2015-02-16
相关资源
最近更新 更多