进化计算中相当烦人的一点是,略有不同和重叠的概念往往会选择截然不同的名称。因此,我最近的困惑是基因表达编程似乎与笛卡尔基因编程非常相似。
- (如何)这些是根本不同的概念吗?
- 我读过 GP 指令的间接编码是一种有效的技术(GEP 和 CGP 都这样做)。是否已经达成某种共识,间接编码已经过时了经典的树基 GP?
进化计算中相当烦人的一点是,略有不同和重叠的概念往往会选择截然不同的名称。因此,我最近的困惑是基因表达编程似乎与笛卡尔基因编程非常相似。
好吧,似乎基因表达编程 (GEP) 和笛卡尔基因编程(CGP 或我认为的经典基因编程)之间存在一些差异,但这种差异可能比实际应该被夸大了。请注意,我从未使用过 GEP,所以我所有的评论都是基于我使用 CGP 的经验。
在 CGP 中,基因型和表型之间没有区别,换句话说 - 如果您正在查看 CGP 的“基因”,那么您也在查看它们的表达。这里没有编码,即表达树就是基因本身。
在GEP中,基因型被表达为表型,因此如果您正在查看基因,您将不会轻易知道表达将是什么样子。GP 的“发明者”Cândida Ferreira 写了一篇非常好的论文,还有一些其他资源试图对整个概念进行简短的概述。
Ferriera 说好处是“显而易见的”,但我真的没有看到任何东西会使 GEP 比 CGP 更好。显然,GEP 是多基因的,这意味着多个基因参与了一个性状的表达(即表达树)。无论如何,适应度是在表达的树上计算的,所以 GEP 似乎没有做任何事情来增加适应度。作者声称 GEP 提高了达到适应度的速度(即在更少的世代中),但坦率地说,您可以看到与 CGP 相比的显着性能变化,只是通过使用不同的选择算法、不同的锦标赛结构、拆分种群进入部落,标本在部落之间迁移,包括多样性进入适应度等。
选择:
比赛频率:
比赛结构:
部落
一个人口可以分成彼此独立发展的部落:
多样性适应
度 将多样性融入适应度,计算有多少个体具有相同的适应度值(因此可能具有相同的表型),然后按比例值惩罚他们的适应度:具有相同适应度值的个体越多,对这些人的处罚。通过这种方式,将鼓励具有独特表型的标本,因此种群的停滞将大大减少。
这些只是可以极大影响 CGP 性能的一些因素,当我说很大时,我的意思是它与 Ferriera 的性能相同或更高。因此,如果 Ferriera 没有过多地修改这些想法,那么她可能会看到 CGP 的性能要慢得多……尤其是如果她不采取任何措施来对抗停滞不前。所以在阅读 GEP 的性能统计数据时我会小心,因为有时人们无法考虑所有可用的“优化”。
这些答案似乎有些混乱,必须澄清。笛卡尔 GP 与经典 GP(又名基于树的 GP)和 GEP 不同。尽管它们共享许多概念并从相同的生物学机制中汲取灵感,但个体(解决方案)的表示方式却各不相同。
在CGP中,表示(基因型和表型之间的映射)是间接的,换句话说,并非 CGP 基因组中的所有基因都将在表型中表达(这一概念也在 GEP 和许多其他中发现)。基因型可以在网格或节点阵列中编码,生成的程序图仅是活动节点的表达。
在GEP中,表示也是间接的,同样并非所有基因都会在表型中表达。这种情况下的表示与 treeGP 或 CGP 有很大不同,但基因型也表示为程序树。在我看来,GEP 是一种更优雅的表示,更易于实现,但也存在一些缺陷,例如:您必须找到针对特定问题的合适的尾部和头部大小,多基因版本有点像表达式树之间的强制粘合,最后它有太多的臃肿。
无论在某些特定问题域中哪种表示可能比另一种更好,它们都是通用的,只要您可以对其进行编码,就可以应用于任何领域。
一般来说,GEP 比 GP 更简单。假设您在程序中允许以下节点:常量、变量、+、-、*、/、if、... 对于每个具有 GP 的此类节点,您必须创建以下操作: - 随机化 - 变异 - 交叉 - 和可能还有其他遗传算子
在 GEP 中,每个这样的节点只需要实现一个操作:反序列化,它接受数字数组(如 C 或 Java 中的双精度数),并返回节点。它类似于 Java 或 Python 等语言中的对象反序列化(不同之处在于编程语言中的反序列化使用字节数组,这里我们有数字数组)。甚至这种“反序列化”操作也不必由程序员实现:它可以通过通用算法实现,就像在 Java 或 Python 反序列化中所做的那样。
从一个角度来看,这种简单性可能会使搜索最佳解决方案不太成功,但从另一方面来看:需要程序员的工作更少,更简单的算法可能执行得更快(更容易优化,更多代码和数据适合 CPU 缓存,等等) . 所以我会说 GEP 稍微好一点,但肯定的答案当然取决于问题,而对于许多问题,情况可能正好相反。