我正在学习语法进化,但我似乎无法掌握的一件事是如何使用从语法进化而来的字符串来解决实际问题。是转换成神经网络还是转换成方程,或者其他什么?它如何接收输入并打印输出?
语法进化(GE)区分了基因型和表型(基因型-表型区别),这意味着进化的基因型本身并不是一个解决方案,但它映射到一个解决方案。
突变和交叉是在基因型上进行的,但为了评估适应性,应首先将基因型转化为表型。在语法进化中,这意味着生成符合所选语法的字符串。然后,该解决方案字符串应该被执行,并评估执行结果以估计解决方案的适用性。
这很大程度上取决于GE系统的实施。
如果它用某种真实的编程语言生成解决方案,则应使用相应的工具链来编译和/或执行它们,使用一些测试输入运行,并对输出进行评估以估计适应性。
如果 GE 系统能够在内部执行解决方案,则不涉及外部工具链。根据语法(而不是非结构化文本)生成类似语法树的结构可能会很方便,因为执行这样的结构非常容易。
存在一整类所谓的树遍历解释器——性能不是超级好,但实现起来相当简单。通常这样的解释器首先解析源文本并构建语法树,然后执行它;但在GE系统中可以直接生成语法树,因此不涉及解析。
我在alogos包中实现了语法进化(GE)和其他一些语法引导的遗传编程算法。这些文档包含如何使用这些方法来解决各个领域的优化问题的示例。
该包允许使用 BNF 或 EBNF 中的上下文无关语法定义搜索空间。搜索目标可以用目标函数定义,该目标函数获取语法语言的候选字符串作为输入,并需要返回一个反映其适应度的数值作为输出。