Skip to main content
QUICK REVIEW

[论文解读] Fast Generation of Big Random Binary Trees

William B. Langdon|arXiv (Cornell University)|Jan 13, 2020
Evolutionary Algorithms and Applications参考文献 16被引用 4
一句话总结

本文提出了一种高度优化的 C++ 实现 random_tree(),可在 O(n) 时间和空间内生成大规模随机二叉树,在 3.60GHz CPU 上每秒可生成超过 1800 万个节点。该方法使用 Knuth 的洗牌算法随机化节点与叶节点的序列,再通过格路重排将其映射为合法的二叉树结构,从而实现对高达十亿节点的树的高效生成,适用于遗传编程实验。

ABSTRACT

random_tree() is a linear time and space C++ implementation able to create trees of up to a billion nodes for genetic programming and genetic improvement experiments. A 3.60GHz CPU can generate more than 18 million random nodes for GP program trees per second.

研究动机与目标

  • 解决现有随机树生成方法在遗传编程(GP)实验中扩展至超大尺寸树时效率低下的问题。
  • 实现大规模随机树(最多可达十亿个节点)的生成,以支持极端进化运行下的 GP 系统测试。
  • 通过优化树生成算法以适配现代并行硬件,提升大规模 GP 与遗传改进工作负载的性能。
  • 在保持计算效率的同时,确保对树空间的均匀采样,适用于初始种群构建与子树变异操作。

提出的方法

  • 使用 Knuth 的 Fisher-Yates 洗牌算法随机化包含 n+1 个叶节点和 n 个二元函数的确定性列表,生成均匀随机排列。
  • 通过格路重排将随机序列转换为始终满足栈深度约束的合法二叉树结构。
  • 采用 Iba 的线性时间算法,将重排后的序列映射为具有 n 个内部节点和 n+1 个叶节点的满二叉树。
  • 通过顺序使用 GPquick 的 SETNODE 宏逐个分配节点,随机选择叶节点或二元函数,生成最终的 GP 程序。
  • 通过分离树构建与标签分配阶段来优化性能,尽管指出若合并两阶段可获得更好的缓存效率。
  • 使用 Park-Miller PRNG 进行伪随机数生成,同时承认由于种子空间受限带来的局限性。

实验结果

研究问题

  • RQ1能否高效生成高达十亿个节点的随机二叉树,以支持大规模遗传编程实验?
  • RQ2如何在不产生不可接受的计算成本的前提下,实现对树空间的大规模均匀采样?
  • RQ3通过为现代高速处理器重新设计线性时间树生成算法,可获得多大的性能提升?
  • RQ4大规模随机二叉树的实际深度在多大程度上符合 Flajolet 和 Odlyzko 分析所预测的理论值?

主要发现

  • 新的 random_tree() 实现可在 3.60GHz CPU 上实现每秒生成超过 1800 万个随机节点,支持快速构建十亿节点规模的树。
  • 通过在 Intel i7-4790 CPU 上使用对数-对数图进行基准测试,确认该算法随树大小呈线性扩展。
  • 大规模随机二叉树的平均深度与 Flajolet 理论极限高度吻合,近似为 √(2π|size|),当树节点数超过 32,000 时误差小于 2%。
  • 该实现受限于 32 位整数大小,当尝试生成接近 20 亿个节点的树时会出现段错误。
  • 尽管使用的 PRNG 种子空间有限,但生成的树在典型 GP 应用中仍表现出足够的随机性。
  • 该方法可通过用统计特性相似的随机生成程序替代演化所得程序,实现对 GP 系统在超大规模树上的高效测试。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。