Skip to content

Evolutionary & swarm optimization

decisionrl.evolution provides gradient-free (black-box) optimizers under one ask / tell interface, plus a neuroevolution agent that trains RL policies without gradients.

from decisionrl.evolution import CEM, minimize
from decisionrl.evolution.functions import rastrigin

opt = CEM(dim=10, bounds=(-5.12, 5.12), seed=0)
x_best, f_best, history = minimize(rastrigin, opt, iters=200)

Optimizers

Family Class Idea
Evolution strategy CEM fit a Gaussian to the elite fraction
Evolution strategy CMAES covariance-matrix adaptation ES
Evolution strategy OpenAIES natural ES with mirrored sampling
Evolution strategy ARS augmented random search (V1-t)
Evolutionary DifferentialEvolution DE/rand/1/bin
Evolutionary GeneticAlgorithm tournament + blend + Gaussian mutation
Metaheuristic SimulatedAnnealing Metropolis acceptance + cooling
Swarm PSO particle swarm optimization
Swarm FireflyAlgorithm attraction to brighter fireflies
Swarm ArtificialBeeColony employed + scout bees
Swarm GreyWolfOptimizer alpha/beta/delta leader hierarchy
Swarm BatAlgorithm echolocation, loudness / pulse-rate
Combinatorial AntColonyTSP pheromone-guided TSP tours

All continuous optimizers minimize the objective and share the ask/tell API, so they are drop-in interchangeable and easy to benchmark.

Gradient-free optimizers on Rastrigin

Neuroevolution

NeuroevolutionAgent optimizes a small tanh-MLP policy's weights directly to maximize episode return using any optimizer above — no gradients, no replay buffer. It implements the standard predict / learn / save / load API.

from decisionrl.evolution import NeuroevolutionAgent
from decisionrl.envs import CartPole

agent = NeuroevolutionAgent(CartPole(), optimizer="cmaes", hidden_sizes=(16,), seed=0)
agent.learn(60_000)   # CEM / CMA-ES / PSO all reach return 500

Neuroevolution on CartPole

Ant Colony Optimization (TSP)

from decisionrl.evolution import AntColonyTSP, random_cities, distance_matrix

cities = random_cities(20, seed=3)
tour, length, history = AntColonyTSP(distance_matrix(cities), seed=0).solve(iters=120)

ACO for the TSP