time-series - 在遗传算法中改变符号表达式树的最佳方法
问题描述
我在 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)我应该如何实施这种机制?通过递归机制?还是以某种方式建立树形索引并随机选择一个要变异的巢?
提前致谢
解决方案
在进化算法中,重要的是通过重复变异,您可以将每个表达式树转换为任何其他表达式树。
在您的情况下,您需要执行以下 4 件事:
- 将所有数字更改为某个随机量。
- 单独查看每个数字并以很小的机会更改它
x
或用新的随机表达式替换它(最好只有深度 1 以防止表达式变得庞大)。 - 查看所有变量并以很小的机会将其更改为随机数或新的随机表达式(最好再次深度为 1)。
- 随机删除一些表达式。
1、2、3只改变叶子,不需要你建树,但可以通过线性遍历字符串来实现。
通过一些简化 4. 也可以在不创建树的情况下实现:
除了删除随机表达式之外,仅删除仅包含数字(如['mul', 4, 5]
)的表达式就足够了,因为与进程 1、2、3 一起,表达式树仍然可以转换为其他所有可能的树。删除仅包含数字的表达式非常容易,因为您只需计算表达式:['mul', 4, 5]
= 4*5
= 20
。
此修改版本的另一个优点是您不会更改输出,而只会更改树的结构。
但要小心,不要替换所有只包含数字的表达式。为未来的突变提供更深的结构可能很有用。
推荐阅读
- node.js - 使用 NodeJS 在 Outlook 中创建日历事件
- python - 不同数据类型的Django admin list_display与null
- python - Pygame 将元素按顺序绘制到屏幕上
- azure-active-directory - Azure HDI 群集删除重新创建问题?
- tinymce - PHP旋转后TinyMCE显示具有错误宽度和高度的图像
- python - 如何实现将字符串解析为元组的函数?
- c# - 在哪里为测试和实时配置 HttpClient
- mysql - 为什么没有在 MySQL 中锁定 READ COMMITTED
- plot - mpf.plot - 连接两点的延长线
- python - 导入 stix2,ModuleNotFoundError: No module named 'six.moves.collections_abc'