基因表达式编程与笛卡尔遗传规划的区别

时间:2010-08-13 10:08:46

标签: genetic-programming evolutionary-algorithm

进化计算中令人讨厌的一点是,略有不同和重叠的概念倾向于选择截然不同的名称。我最近的困惑是因为基因表达编程似乎与笛卡尔遗传编程非常相似。

  1. (怎么样)这些根本不同的概念是什么?
  2. 我读过GP指令的间接编码是一种有效的技术(GEP和CGP都这样做)。是否已经达成某种共识,间接编码已经过时了经典树基GP?

3 个答案:

答案 0 :(得分:7)

好吧,似乎基因表达式编程(GEP)和笛卡尔遗传编程(CGP或我认为的经典遗传编程)之间存在一些差异,但差异可能会更加大肆宣传比它真的应该是。请注意,我从未使用过GEP,所以我的所有评论都是基于我对CGP的经验。

在CGP中,基因型和表型之间没有区别,换句话说 - 如果您正在查看CGP的“基因”,您也会查看它们的表达。这里没有编码,即表达式树就是基因本身。

GEP中,基因型被表达为表型,因此如果您正在查看基因,您将不会轻易知道表达式的样子。 GP的“发明家”CândidaFerreira撰写了really good paper并且有一些other resources试图对整个概念进行简短的概述。

Ferriera说这些好处是“显而易见的”,但我真的没有看到任何必然会使GEP比CGP更好的东西。显然GEP是多基因的,这意味着多个基因参与性状的表达(即表达树)。在任何情况下,适应度都是在表达的树上计算的,因此GEP似乎没有采取任何措施来增加适应度。作者声称GEP提高了达到适应度的速度(即在更少的世代中),但坦率地说,你可以通过选择不同的算法,不同的锦标赛结构,分裂人口分为部落,部落之间迁移标本,包括多样性进入适应性等等。

选择:

  • 随机
  • 轮盘赌轮
  • 前n
  • 取一半

锦标赛频率:

  • 每个纪元一次
  • 每个数据实例一次
  • 每一代一次。

锦标赛结构:

  • 取3,杀死1并将其替换为另外两个孩子。
  • 通过健身对比赛中的所有个体进行排序,杀死下半部分并将其替换为上半部分的后代(较低的是较差的健身,上部是更好的健身)。
  • 随机挑选比赛中的个人来交配并杀死多余的个人。

<强>部落
人口可以分成彼此独立发展的部落:

  • 定期迁移,部落中的个人将被转移到另一个部落
  • 这些部落在逻辑上是分开的,因此它们就像他们在不同环境中运行的独立群体一样。

多元化健身
将多样性纳入适应度,在此计算有多少个体具有相同的适应度值(因此可能具有相同的表型)并且您通过相应的值来惩罚其适应度:具有相同适应值的个体越多,对那些人。这样就可以鼓励具有独特表型的标本,因此人口的停滞会更少。

这些只是可能会对CGP性能产生很大影响的一些因素,当我说得非常重要时,我的意思是它与Ferriera的性能相同或更高。因此,如果Ferriera没有过多地修改这些想法,那么她本可以看到CGP的性能慢得多......特别是如果她没有采取任何措施来对抗停滞。因此,在阅读GEP的性能统计数据时我会小心,因为有时人们无法解释那里可用的所有“优化”。

答案 1 :(得分:2)

一般来说,GEP比GP更简单。假设您允许程序中包含以下节点:常量,变量,+, - ,*,/,if,... 对于每个具有GP的节点,您必须创建以下操作: - 随机化 - 变异 - 交叉 - 也可能是其他遗传算子

在GEP中,对于每个这样的节点,只需要执行一个操作:deserialize,它接受数组(如C或Java中的double),并返回节点。它类似于Java或Python等语言中的对象反序列化(不同之处在于编程语言中的反序列化使用字节数组,这里我们有数组数组)。即使这种“反序列化”操作也不必由程序员实现:它可以通过通用算法实现,就像在Java或Python反序列化中完成一样。

从一个角度来看,这种简单性可能会使搜索最佳解决方案不那么成功,但是从另一方面来说:程序员需要的工作量更少,更简单的算法可以更快地执行(更容易优化,更多的代码和数据适合CPU缓存,以及等等)。所以我会说GEP略胜一筹,但当然明确的答案取决于问题,对于许多问题,情况恰恰相反。

答案 2 :(得分:2)

这些答案似乎有些混乱,必须加以澄清。笛卡尔GP与经典GP(又名基于树的GP)和GEP不同。即使他们分享许多概念并从相同的生物机制中获取灵感,但个体(解决方案)的表现也各不相同。

CGP中,表示(基因型和表型之间的映射)是间接的,换句话说,并非CGP基因组中的所有基因都将在表型中表达(GEP和其他许多基因中也有这种概念) )。基因型可以在网格或节点数组中编码,结果程序图只是活动节点的表达。

GEP中,表示也是间接的,并且同样不是所有基因都将在表型中表达。在这种情况下的表示与treeGP或CGP有很大不同,但基因型也表示为程序树。在我看来,GEP是一个更优雅的表示,更容易实现,但也有一些缺陷,如:你必须找到适当的尾部和头部大小,这是特定的问题,mnltigenic版本是表达树之间的强制胶水,最后它有太多bloat

独立于某个特定问题域中哪个表示可能比另一个更好,它们是通用的,只要您可以编码就可以应用于任何域。