在遗传算法中变异符号表达式树的最佳方法

Best way to mutate an symbolic expression tree in genetic algorithm

我正在为 python 中的时间序列预测创建 GA。假设我有一个大的符号表达式树,如下所示:

['avg', ['diff', 'x', ['avg', 'pi', 24.90887042555513]], ['sqrt', [ 'max', ['mul', ['diff', 53.79502493321837, 'e'], ['mul', 0.5144978394070354, 46.36225530228578]], 44.34745373778043], ['sqrt', ['diff', ['avg', 20.424103573006004, 67.68047383230076], ['div', 35.70761733351755, 76.63350676737794]], 6.6143363501814605=]][=10

随机变异有什么好方法?

1) 我应该只具体变异一个随机节点吗?或使用概率来决定有多少,是否以及何时发生突变?

2) 我应该通过添加分支来变异,还是只添加一个单独的值(叶节点)

3) 我应该如何实施这个机制?通过递归机制?或者以某种方式随机构建树形索引 select 一个要变异的巢?

提前致谢

在进化算法中,重要的是通过重复变异,您可以将每个表达式树转换为任何其他表达式树。

在你的情况下,需要你做以下 4 件事:

  1. 将所有数字随机更改。
  2. 单独查看每个数字,并有很小的机会将其更改为 x 或用新的随机表达式替换它(最好只有深度 1,以防止表达式变得巨大)。
  3. 查看所有变量并将其更改为随机数或新的随机表达式(最好还是深度为 1)。
  4. 随机删除一些表达式。

1、2、3只改变叶子,不需要你建树,但可以通过线性遍历字符串实现。

经过一些简化 4. 也可以在不创建树的情况下实现:

不需要删除随机表达式,只删除只包含数字的表达式(如['mul', 4, 5])就足够了,因为与过程1,2,3一起,表达式树仍然可以转换为每个其他可能的树。删除仅包含数字的表达式非常容易,因为您只需计算表达式:['mul', 4, 5] = 4*5 = 20.

这个修改版本的另一个优点是你不改变输出,而只改变你的树的结构。

但要小心,不要替换所有只包含数字的表达式。为将来的突变提供更深层次的结构可能很有用。