进化计算中令人讨厌的一点是,略有不同和重叠的概念倾向于选择截然不同的名称。我最近的困惑是因为基因表达编程似乎与笛卡尔遗传编程非常相似。
答案 0 :(得分:7)
好吧,似乎基因表达式编程(GEP)和笛卡尔遗传编程(CGP或我认为的经典遗传编程)之间存在一些差异,但差异可能会更加大肆宣传比它真的应该是。请注意,我从未使用过GEP,所以我的所有评论都是基于我对CGP的经验。
在CGP中,基因型和表型之间没有区别,换句话说 - 如果您正在查看CGP的“基因”,您也会查看它们的表达。这里没有编码,即表达式树就是基因本身。
在GEP中,基因型被表达为表型,因此如果您正在查看基因,您将不会轻易知道表达式的样子。 GP的“发明家”CândidaFerreira撰写了really good paper并且有一些other resources试图对整个概念进行简短的概述。
Ferriera说这些好处是“显而易见的”,但我真的没有看到任何必然会使GEP比CGP更好的东西。显然GEP是多基因的,这意味着多个基因参与性状的表达(即表达树)。在任何情况下,适应度都是在表达的树上计算的,因此GEP似乎没有采取任何措施来增加适应度。作者声称GEP提高了达到适应度的速度(即在更少的世代中),但坦率地说,你可以通过选择不同的算法,不同的锦标赛结构,分裂人口分为部落,部落之间迁移标本,包括多样性进入适应性等等。
选择:
锦标赛频率:
锦标赛结构:
<强>部落强>
人口可以分成彼此独立发展的部落:
多元化健身
将多样性纳入适应度,在此计算有多少个体具有相同的适应度值(因此可能具有相同的表型)并且您通过相应的值来惩罚其适应度:具有相同适应值的个体越多,对那些人。这样就可以鼓励具有独特表型的标本,因此人口的停滞会更少。
这些只是可能会对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。
独立于某个特定问题域中哪个表示可能比另一个更好,它们是通用的,只要您可以编码就可以应用于任何域。