为什么 GP 树中的所有节点都必须是同一类型?

人工智能 进化算法 基因编程 进化计算 tgp
2021-10-20 14:51:54

背景:我是进化算法、遗传算法和编程的初学者。我目前正在学习有关遗传算法和遗传编程的课程。

课程中介绍的概念之一是“闭包”,即 - 使用表示我们正在进化的遗传程序的表达式树 - 树中的所有节点都需要是相同的类型。作为一个实际的例子,讲师提到实现greater_than(a, b)两个整数a并且b不能返回类似true或的布尔值false(它可以返回,说,0而是1)。

他没有解释的是为什么整棵树需要在所有运算符中匹配。在我看来,这个要求会导致整个树(代表你的进化程序)由所有返回相同类型(比如,integer)的节点组成。

1个回答

在基于树的遗传编程 (TGP) 中,您有一个表示程序或函数的树。这棵树中的节点是函数,而边代表这些函数之间的交互。这棵树的叶子是你传递给这个函数的输入(或随机数)。进入节点的输入边表示输入,而输出边表示相关函数的输出。

因此,例如,考虑以下函数

F(X)=(X2)(1)=(是的),
在哪里是的=G(X)(请注意,这只是变量的更改,以便在下面更清楚地说明相应的树!)。

功能F将由以下树表示

sin(y)
  |
 g(x)
  |
  x

那么,我们如何阅读这个图表呢?本质上,我们是从下往上阅读的。所以,X首先传递给是的=G(X)=X2,然后传递给(是的). 在这种情况下,鉴于我们正在处理数学运算,您期望X成为一个数字,因为,否则,什么会X2或者(X2)意思是?

现在让我们考虑一个有 2 个输入的函数。

(2)F(X,是的)=X+是的,

相应的树将是

  +
 / \
x   y

在这种情况下,您自然会期望X是的也是数字。然而,实际情况可能并非如此。假设您正在开发 Python 函数,那么x + y即使xy是字符串,也可以很好地定义,也就是说,这将是一个连接操作。

因此,从这个意义上说,我们自然希望函数(树中的节点)能够获取具有正确类型的参数/参数,但在某些情况下,对于看似相同的函数,可能会有更多类型。

所以,一般来说,类型不一定需要强制执行!这取决于 TGP 的实施。

TGP 有一种特定的方法,其想法实际上是确保类型安全,即强类型(基于树的)遗传编程,其中函数的参数和返回值可以具有不同的数量和类型,但是,在这种情况下,只有与函数签名一致的函数才能与树中的该函数“连接”。

在弱类型 GP 中,不会检查类型,因此您最终可能会演变出形式的函数F(X)=(X), 在哪里X是一个字符串。当然,当您执行这些程序/功能时,程序可能会崩溃,但这是另一回事,如果您需要这种灵活性,您需要注意(即您需要确保您的个人可以被评估)。这种弱类型方法也可以被视为一种强类型方法,其中所有函数的参数和返回值都具有相同的类型。

DEAP是用于 GA 和 GP 的著名 Python 库,提供弱类型和强类型 GP,因此,如果您熟悉 Python,您可能希望从它开始。

为了更直接地总结和回答您的问题,在 TGP 中您需要所有函数的所有参数和返回值都具有相同的类型,这并不正确。