定义搜索空间和决策变量

为 AlphaEvolve 应用场景定义搜索空间和决策变量时,需要以代码形式正确表述问题,并提供一个可供进化启发法迭代和改进的有效基准解决方案。

此过程包括:

  • 提供目标上下文:为优化用例建立背景、领域规则和性能边界。

  • 提供清晰的基准:提供清晰且结构良好的代码,正确实现目标问题的基准解决方案。

  • 标记自由度:使用明确的 EVOLVE-BLOCK 注释为代码库添加注解,以标记智能体可以更改和探索的特定决策变量、逻辑结构或例程,从而找出性能更高的解决方案。

初始程序的结构

初始程序由两种主要块类型组成,它们决定了进化搜索的边界:

  1. 不可变代码块:样板代码、辅助函数和依赖项,用于限制搜索空间或执行不影响解决方案性能的任务(例如标准预处理步骤或数据处理例程)。

  2. 可变代码块 (EVOLVE-BLOCK):包含特定决策变量、逻辑结构或分析表达式的目标区域,智能体可以探索和更改这些区域。

    import numpy as np
    # Code to constrain the search space (Immutable)
    def def_preprocessing():
        """Feature engineering and preprocessing."""
        pass
    
    # EVOLVE-BLOCK-START
    # Mutable block: Provides degrees of freedom for AlphaEvolve to optimize
    def model_tuning():
        """Model tuning function: parametrized to take features."""
        pass
    # EVOLVE-BLOCK-END
    
    # Boilerplate code that does not impact solution performance (Immutable)
    def batch_predictions():
        """Inference function: batch predictions to test performance."""
        pass
    

EVOLVE-BLOCK 格式规则包括:

  • 独立行:EVOLVE-BLOCK-START 和 EVOLVE-BLOCK-END 注释标记必须单独出现在各自的行中。请勿在标记所在的行中放置代码或其他内容,但空格和注释前缀(例如 # 或 //)除外。
  • 需要可编辑的代码:开始标记和结束标记之间的区域必须至少包含一行可编辑的代码。仅包含空格、注释或文档字符串的代码块会被拒绝,并显示验证错误,因为 AlphaEvolve 没有可变逻辑可供演化。
  • 无嵌套:不支持嵌套的 evolve 代码块。

限制搜索空间的最佳实践

您如何安排不可变导入和放置 evolve 块,明确展示了 AlphaEvolve 的操作边界。

管理库导入和依赖项

AlphaEvolve 本身无法确定哪些外部库对您的生产环境有效。

允许开放式探索:如果任何机器学习或数学软件包都可以最大限度地提高指标,请将导入内容放在可变 EVOLVE-BLOCK 中。这让 AlphaEvolve 可以自由替换替代框架(例如将 sklearn 替换为 TensorFlow 或 xgboost)。

强制执行严格的工具链:如果所有模型都必须来自特定软件包,请在 evolve 代码块之外将该软件包声明为不可变导入。如果 AlphaEvolve 在搜索过程中需要该软件包中的其他内部模块,它仍然可以在其可变空间内本地导入这些模块,而不会违反全局约束。

避免搜索空间受到过度限制

在初始程序中或在用户提供的其他文本上下文中,尽可能多地将硬性约束条件制定为不可变的代码块。这样可以最大限度地降低智能体探索结构上不可行的解决方案的可能性。

但是,不要将搜索空间缩小到进化方法变得多余的程度。例如,强制 AlphaEvolve 仅使用单参数线性回归,可将问题简化为可通过标准网格搜索实用程序解析的狭窄配置空间。 相反,应在评估标准中将软约束用作负惩罚,以引导探索,而不是扼杀探索。

针对特定目标,策略性地放置方块

改变 EVOLVE-BLOCK 的范围会改变流水线的整个优化目标:

优化样本外 (OOS) 校准:如果您的目标是广泛的算法探索,请将该代码块封装在整个模型调优和初始化例程周围。

优化结构拟合:如果您想保留线性框架,但发现复杂的分析表达式或自定义数学转换,请将可变块严格隔离在特征转换逻辑周围,使下游模型架构保持固定且不可变。

保留模块化层次结构(HDL/Verilog 示例):优化结构化代码块配置时,请将 EVOLVE-BLOCK-START 和 EVOLVE-BLOCK-END 标记严格保留在模块定义边界内。这可以防止搜索启发式算法做出结构上无效的移动,例如尝试将单个完全包含的模块替换为多个未映射的浮动子模块。