在基于树的遗传编程 (TGP) 中,您有一个表示程序或函数的树。这棵树中的节点是函数,而边代表这些函数之间的交互。这棵树的叶子是你传递给这个函数的输入(或随机数)。进入节点的输入边表示输入,而输出边表示相关函数的输出。
因此,例如,考虑以下函数
F( × )=罪(X2)=罪(是) ,(1)
在哪里是的= g( × )(请注意,这只是变量的更改,以便在下面更清楚地说明相应的树!)。
功能F将由以下树表示
sin(y)
|
g(x)
|
x
那么,我们如何阅读这个图表呢?本质上,我们是从下往上阅读的。所以,X首先传递给是的= g( x ) =X2,然后传递给罪(是). 在这种情况下,鉴于我们正在处理数学运算,您期望X成为一个数字,因为,否则,什么会X2或者罪(X2)意思是?
现在让我们考虑一个有 2 个输入的函数。
F( x , y)= x + y,(2)
相应的树将是
+
/ \
x y
在这种情况下,您自然会期望X和是的也是数字。然而,实际情况可能并非如此。假设您正在开发 Python 函数,那么x + y
即使x
和y
是字符串,也可以很好地定义,也就是说,这将是一个连接操作。
因此,从这个意义上说,我们自然希望函数(树中的节点)能够获取具有正确类型的参数/参数,但在某些情况下,对于看似相同的函数,可能会有更多类型。
所以,一般来说,类型不一定需要强制执行!这取决于 TGP 的实施。
TGP 有一种特定的方法,其想法实际上是确保类型安全,即强类型(基于树的)遗传编程,其中函数的参数和返回值可以具有不同的数量和类型,但是,在这种情况下,只有与函数签名一致的函数才能与树中的该函数“连接”。
在弱类型 GP 中,不会检查类型,因此您最终可能会演变出形式的函数F( x ) =罪( × ), 在哪里X是一个字符串。当然,当您执行这些程序/功能时,程序可能会崩溃,但这是另一回事,如果您需要这种灵活性,您需要注意(即您需要确保您的个人可以被评估)。这种弱类型方法也可以被视为一种强类型方法,其中所有函数的参数和返回值都具有相同的类型。
DEAP是用于 GA 和 GP 的著名 Python 库,提供弱类型和强类型 GP,因此,如果您熟悉 Python,您可能希望从它开始。
为了更直接地总结和回答您的问题,在 TGP 中您需要所有函数的所有参数和返回值都具有相同的类型,这并不正确。