【问题标题】:Best way to mutate an symbolic expression tree in genetic algorithm在遗传算法中变异符号表达式树的最佳方法
【发布时间】:2020-07-13 04:34:31
【问题描述】:

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

['avg', ['diff', 'x', ['avg', 'pi', 24.90887042555513]], ['sqrt', ['max', ['mul', ['diff', 53.79502493321837, 'E'],[ 'MUL',0.5144978394070354,46.36225530228578],44.34745373778043],[ 'SQRT',[ '差异',[ '平均',20.424103573006004,67.68047383230076],[ 'DIV',35.70761733351755,76.63350676737794] ], 6.6143363501814605]]]

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

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

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

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

提前致谢

【问题讨论】:

    标签: time-series regression genetic-algorithm symbolic-math genetic-programming


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 2017-10-10
      • 2015-03-01
      • 2011-06-11
      • 2015-06-08
      • 2017-03-05
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      相关资源
      最近更新 更多