Define el espacio de búsqueda y las variables de decisión

Definir el espacio de búsqueda y las variables de decisión para un caso de uso de AlphaEvolve requiere una formulación adecuada del problema como código y proporcionar una solución de referencia en funcionamiento sobre la que la heurística evolutiva pueda iterar y mejorar.

Este proceso incluye lo siguiente:

  • Proporcionar el contexto objetivo: Establece los antecedentes, las reglas de dominio y los límites de rendimiento para el caso de uso de optimización.

  • Proporcionar un modelo de referencia limpio: Proporciona un código claro y bien estructurado que implemente correctamente una solución de referencia para el problema objetivo.

  • Etiqueta los grados de libertad: Anota la base de código con comentarios EVOLVE-BLOCK explícitos para marcar las variables de decisión, las estructuras lógicas o las rutinas específicas que el agente puede mutar y explorar para identificar soluciones de mayor rendimiento.

Estructura de un programa inicial

Un programa inicial se compone de dos tipos de bloques principales que determinan los límites de la búsqueda evolutiva:

  1. Bloques de código inmutables: Código estándar, funciones auxiliares y dependencias que restringen el espacio de búsqueda o ejecutan tareas que no afectan el rendimiento de la solución (como pasos de procesamiento previo estándar o rutinas de manejo de datos).

  2. Bloques de código mutables (EVOLVE-BLOCK): Son las regiones objetivo que contienen variables de decisión, estructuras lógicas o expresiones analíticas específicas que el agente puede explorar y mutar.

    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
    

Las reglas de formato de EVOLVE-BLOCK incluyen lo siguiente:

  • Líneas independientes: Los marcadores de comentarios EVOLVE-BLOCK-START y EVOLVE-BLOCK-END deben aparecer solos en sus propias líneas. No coloques código ni otro contenido en la misma línea que un marcador, excepto los espacios en blanco y los prefijos de comentario (como # o //).
  • Se requiere código editable: La región entre los marcadores de inicio y finalización debe contener al menos una línea de código editable. Los bloques que solo contienen espacios en blanco, comentarios o cadenas de documentación se rechazan con un error de validación porque no hay una lógica mutable para que AlphaEvolve evolucione.
  • Sin anidamiento: No se admiten los bloques evolve anidados.

Prácticas recomendadas para restringir el espacio de búsqueda

La forma en que organizas tus importaciones inmutables y colocas tus bloques de evolución muestra explícitamente los límites operativos de AlphaEvolve.

Administra las importaciones y dependencias de bibliotecas

AlphaEvolve no puede determinar de forma inherente qué bibliotecas externas son válidas para tu entorno de producción.

Para permitir la exploración abierta, si cualquier paquete matemático o de aprendizaje automático es aceptable para maximizar tu métrica, coloca las importaciones dentro de la EVOLVE-BLOCK mutable. Esto le da a AlphaEvolve la libertad de sustituir frameworks alternativos (como reemplazar sklearn por TensorFlow o xgboost).

Para aplicar cadenas de herramientas estrictas, si todos los modelos deben provenir de un paquete específico, declara ese paquete como una importación inmutable fuera del bloque evolve. Si AlphaEvolve requiere módulos internos adicionales de ese paquete durante la búsqueda, puede importarlos de forma local dentro de su espacio mutable sin infringir la restricción global.

Evita un espacio de búsqueda demasiado restringido

Formula tantas restricciones estrictas como sea posible como bloques de código inmutables en el programa inicial o dentro del contexto de texto adicional proporcionado por el usuario. Esto minimiza las posibilidades de que el agente explore soluciones estructuralmente inviables.

Sin embargo, no reduzcas el espacio de búsqueda hasta el punto en que un enfoque evolutivo se vuelva redundante. Por ejemplo, forzar a AlphaEvolve a usar solo regresiones lineales de un solo parámetro reduce el problema a un espacio de configuración estrecho que podría analizarse con utilidades de búsqueda de cuadrícula estándar. En su lugar, usa restricciones flexibles como penalizaciones negativas en tus criterios de evaluación para guiar la exploración sin limitarla.

Ubicación estratégica de bloques para objetivos específicos

Variar el alcance de tu EVOLVE-BLOCK cambia todo el objetivo de optimización de tu canalización:

Optimizar la calibración fuera de la muestra (OOS): Si tu objetivo es el descubrimiento algorítmico amplio, une el bloque alrededor de toda la rutina de inicialización y ajuste del modelo.

Optimiza el ajuste estructural: Si quieres conservar un marco de trabajo lineal, pero descubrir expresiones analíticas complejas o transformaciones matemáticas personalizadas, aísla tu bloque mutable estrictamente alrededor de la lógica de transformación de atributos, manteniendo la arquitectura del modelo downstream fija e inmutable.

Preserva la jerarquía modular (ejemplos de HDL/Verilog): Cuando optimices las configuraciones de bloques de código estructurales, mantén las etiquetas EVOLVE-BLOCK-START y EVOLVE-BLOCK-END estrictamente dentro de los límites de definición del módulo. Esto evita que la heurística de búsqueda realice movimientos estructuralmente no válidos, como intentar reemplazar un solo módulo contenido de forma limpia por varios submódulos flotantes no asignados.