Optimización Numérica

Optimización Numérica

Este notebook ofrece un tutorial paso a paso sobre cómo utilizar EvoX para optimizar la función Ackley mediante el algoritmo Particle Swarm Optimization (PSO). Tanto el algoritmo PSO como el problema de optimización Ackley están integrados como componentes predefinidos dentro del framework EvoX.

Primero, debemos importar todos los módulos necesarios, incluyendo PSO (algoritmo), Ackley (problema) y StdWorkflow & EvalMonitor (workflow).

import torch

from evox.algorithms import PSO
from evox.problems.numerical import Ackley
from evox.workflows import StdWorkflow, EvalMonitor

Aquí, instanciamos el algoritmo PSO. Especificamos las siguientes configuraciones:

  • pop_size: El tamaño del enjambre de partículas (población).
  • lb y ub: Los límites inferior y superior para cada dimensión en el espacio de búsqueda.
  • Los demás parámetros son todos por defecto. Por favor, consulte la API detallada.
# Define the algorithm
algorithm = PSO(pop_size=100, lb=-32 * torch.ones(10), ub=32 * torch.ones(10))

A continuación, elegimos la función Ackley dentro de los problemas numéricos de EvoX.

# Define the problem
problem = Ackley()

Creamos una instancia de EvalMonitor para realizar el seguimiento de la información necesaria durante el procedimiento de optimización.

# Define the monitor
monitor = EvalMonitor()

La clase StdWorkflow proporciona un proceso estandarizado para integrar el algoritmo, el problema y el monitor.

# Define the workflow
workflow = StdWorkflow(algorithm=algorithm, problem=problem, monitor=monitor)

Llamar a setup() inicializa los componentes para que el workflow esté listo para realizar los pasos de optimización.

Ejecutamos la optimización durante un número determinado de iteraciones (100 en este ejemplo). En cada iteración, el método step() actualiza el algoritmo PSO, evalúa nuevas soluciones candidatas en la función Ackley y realiza el seguimiento de su fitness a través del monitor.

# Perform the Ackley function optimization procedure
for _ in range(100):
    workflow.step()

Finalmente, recuperamos el submódulo monitor del workflow para acceder a las mejores soluciones encontradas hasta el momento (topk_solutions) y sus correspondientes valores objetivo (topk_fitness). Luego, imprimimos el mejor resultado y la solución asociada.

# Get the best solution and its fitness
population = monitor.topk_solutions
fitness = monitor.topk_fitness
print(f"The best solution is:\n{population},\nwith the minimum value:\n{fitness}")
monitor.plot()