【问题标题】:What are the differences between genetic algorithms and genetic programming?遗传算法和遗传编程有什么区别?
【发布时间】:2011-04-18 17:04:51
【问题描述】:

我想对遗传算法和遗传编程之间的区别做一个简单的解释(不用太多编程术语)。示例也将不胜感激。

显然,在遗传编程中,解决方案是计算机程序。另一方面,遗传算法将解决方案表示为一串数字。还有其他区别吗?

【问题讨论】:

标签: terminology genetic-algorithm genetic-programming


【解决方案1】:

遗传算法 (GA) 是模仿自然进化过程的搜索算法,其中每个个体都是一个候选解决方案:个体通常是“原始数据”(以任何已定义的编码格式) .

遗传编程 (GP) 被认为是 GA 的一种特殊情况,其中每个人都是一个计算机程序(不仅仅是“原始数据”)。 GP 探索算法搜索空间进化计算机程序以执行定义的任务。

【讨论】:

  • “个人是原始数据”到底是什么意思? “原始数据”是什么意思?个人如何成为“原始数据”?此外,您所说的“算法搜索空间”是什么意思?
  • @nbro 它们实际上是原始数据。如果没有执行它们的程序,它们只是数字或对象的序列。就像神经网络的权重一样。
【解决方案2】:

遗传编程和遗传算法非常相似。它们都用于通过比较每个候选者在多代潜在候选者群体中的适应度来演化问题的答案。

每一代,通过随机改变(突变)或交换其他候选者的部分(交叉)来找到新的候选者。从总体中删除最不“适合”的候选人。

结构差异

它们之间的主要区别在于算法/程序的表示。

遗传算法表示为动作和值的列表,通常是字符串。例如:

1+x*3-5*6

必须为此编码编写解析器,以了解如何将其转换为函数。生成的函数可能如下所示:

function(x) { return 1 * x * 3 - 5 * 6; }

解析器还需要知道如何处理无效状态,因为变异和交叉操作不关心算法的语义,例如可以生成以下字符串:1+/3-2*。需要决定一种方法来处理这些无效状态。

遗传程序表示为动作和值的树结构,通常是嵌套数据结构。下面是相同的示例,以树的形式显示:

      -
   /     \
  *       *
 / \     / \
1   *   5   6
   / \
  x   3

还必须为这种编码编写解析器,但遗传编程不会(通常)产生无效状态,因为变异和交叉操作在树的结构内工作。

实际差异

遗传算法

  • 本质上具有固定长度,这意味着生成的函数具有有限的复杂性
  • 通常会产生无效状态,因此需要以非破坏性方式处理这些状态
  • 通常依赖于运算符优先级(例如,在我们的示例中,乘法发生在减法之前),这可能被视为一种限制

基因程序

  • 本质上具有可变长度,这意味着它们更灵活,但通常会变得越来越复杂
  • 很少产生无效状态,这些通常可以丢弃
  • 使用显式结构完全避免运算符优先级

【讨论】:

    【解决方案3】:

    为了简单起见,(在我看来)遗传编程是遗传算法的一种应用。遗传算法用于通过计算机程序创建另一种解决方案。

    【讨论】:

    • 直观地遗传编程似乎是遗传算法的一个子集。但有趣的是,形式上的 GP 比 GA 更通用,因为 GP(理论上)能够进化任何程序——包括遗传算法。
    • @Tom:这不成立,因为遗传算法根本不一定是程序。遗传算法可以在硅或(显然)有机物中实现。 GP 无法创建其中任何一个。
    • 遗传算法根据定义是一种算法。遗传编程可以进化该算法的逻辑。该逻辑的实现是一个不同的问题。
    • 好吧,理论上 GP 可以在给定一组适当的函数和终端的情况下进化任何算法 - 包括 GA 算法。让我们暂时忽略进化出如此复杂的事物的可能性.. ;-) 当然,GP 本身就是 GA 的应用。
    【解决方案4】:

    实用答案:

    遗传算法是在使用人口并将人口的世代进化到更好的状态时。 (例如,人类是如何从动物进化为人类的,通过生养和获得更好的基因)

    GP 是在通过已知问题的定义生成代码时更好地解决问题。 (GP通常会给出很多if/else语句,这将解释解决方案)

    【讨论】:

    • 抱歉,这是错误的:在任何一种情况下,您都将使用一组解决方案以及一个适应度函数来判断个体的质量,以(希望)选择它们并在下一代。
    【解决方案5】:

    上面有很多好的部分答案。正如 Koza 在他关于该主题的开创性文本中所说,“[如果 GA 是解决问题的最佳解决方案,那么 GP 将进化出 GA 来解决它]。”简单地说,GP 是一种遗传算法,它进化出由成本函数评估的程序。基因组是一个程序而不是成本函数恕我直言的输入集合这一事实是实质性的差异。

    https://en.wikipedia.org/wiki/Genetic_programming

    【讨论】:

      【解决方案6】:

      遗传编程比遗传算法强大得多。遗传算法的输出是一个量,而遗传编程的输出是另一个计算机程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-22
        • 2015-09-21
        • 2011-12-08
        • 2011-05-04
        • 2012-07-07
        • 2012-06-02
        • 2018-07-30
        • 1970-01-01
        相关资源
        最近更新 更多