如何在遗传编程中实现循环结构?

我一直在尝试使用遗传编程,最近开始思考如何实现循环结构。

对于for循环,我可以想到三个参数:

  • 开始:计数器的起始值
  • 结束:计数器的上限
  • 表达式:在计数器小于结束值时执行的表达式

棘手的部分是表达式,因为除非将计数器以某种方式注入其中,否则它在每次迭代中都会生成相同的值。因此,我可以允许计数器的符号出现在表达式中,但这样如何防止它出现在for循环之外呢?

另一个问题是使用表达式的结果。我可以有一个for循环来求和结果,另一个循环将它们相乘,但这限制性太强,似乎不太合适。我希望有一个通用的解决方案,而不是针对每个操作符的解决方案。

那么,有人知道在遗传编程中实现循环的好方法吗?


回答:

嗯,这确实很棘手。遗传编程(原始的Koza风格GP)最适合功能式编程,即没有内部执行状态,每个节点都是一个返回(可能还接受)值的函数,就像lisp一样。当节点是某个循环时,这就成了一个问题——不清楚节点应该返回什么。

你也可以将循环节点设计为二元节点。一个参数是一个布尔表达式,它将在每次循环前被调用,如果返回true,则执行循环。第二个参数将是循环表达式。

你已经提到的问题是无法更改循环表达式。你可以通过引入某种内部状态或变量的概念来解决这个问题。但这又会带来其他问题,比如需要定义变量的数量。一个变量可以通过一组函数来实现,例如一个设置器(一个参数,无返回值,或者可以返回该参数)和一个获取器(无参数,返回变量的值)。

关于处理循环结果的方式,你可以从GP转向强类型GP,或简称STGP。这本质上是带有类型的GP。你的循环可以有效地成为一个返回值列表(例如数字)的函数,你可以有其他函数接受这样的列表并计算其他值…

还有另一种GP算法(我最喜欢的),称为语法进化(或GE),它使用上下文无关语法来生成程序。它可以用来编码类型信息,就像在STGP中一样。你还可以定义语法,使其能够生成经典的c-like for和while循环。它的某些扩展,如动态定义函数,可以用来动态实现变量。

如果有任何不清楚的地方,请在回答中评论,我会尽力澄清。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注