Skip to content

Separable CMA

from deap_er import Fitness, Toolbox, creator, tools

tools.rng.seed(1234)

DIM = 100
GENS = 250
TARGET = 1e-6


def make_toolbox():
    creator.create_type("FitnessMin", Fitness, weights=(-1.0,))
    creator.create_type("Individual", list, fitness=creator.FitnessMin)
    strategy = tools.StrategySeparable(
        centroid=[3.0] * DIM,
        sigma=3.0,
        offsprings=80,
        low=-5.0,
        up=5.0,
    )
    toolbox = Toolbox()
    toolbox.register("evaluate", tools.bm_sphere)
    toolbox.register("generate", strategy.generate, creator.Individual)
    toolbox.register("update", strategy.update)
    return toolbox


def main():
    toolbox = make_toolbox()
    hof = tools.HallOfFame(1)
    tools.ea_generate_update(toolbox, generations=GENS, hof=hof, verbose=True)
    best = hof[0].fitness.values[0]
    if best >= TARGET:
        raise RuntimeError("Separable CMA did not reach the sphere target.")
    print(f"Reached sphere fitness {best:.3e} in {DIM} dimensions.")


if __name__ == "__main__":
    main()