首页 > 解决方案 > 在遗传算法中改变符号表达式树的最佳方法

问题描述

我在 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 ]]]

什么是随机变异的好方法?

1) 我应该只专门改变一个随机节点吗?或使用概率来决定发生突变的次数、是否发生突变以及何时发生突变?

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

3)我应该如何实施这种机制?通过递归机制?还是以某种方式建立树形索引并随机选择一个要变异的巢?

提前致谢

标签: time-seriesregressiongenetic-algorithmsymbolic-mathgenetic-programming

解决方案


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

在您的情况下,您需要执行以下 4 件事:

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

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

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

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

此修改版本的另一个优点是您不会更改输出,而只会更改树的结构。

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


推荐阅读