sep_cma_es (faber_tweann v2.4.0)

View Source

Separable (diagonal) CMA-ES over a real-valued vector.

The second optimizer of Programme 2 (Search Strategies). Where mu_lambda_es carries a single global step size sigma (isotropic search), sep-CMA-ES adapts a PER-COORDINATE variance (a diagonal covariance) plus a cumulative step-size path, so it can scale each dimension independently. It is the diagonal restriction of CMA-ES (Ros and Hansen 2008, "A Simple Modification in CMA-ES Achieving Linear Time and Space Complexity"): O(N) per generation, no eigendecomposition. It captures the anisotropic-scaling half of full CMA-ES's power, but NOT correlations/rotations (the covariance stays diagonal). If a problem needs correlated steps, full CMA-ES or CoSyNE is the next rung.

Same pluggable-fitness contract as mu_lambda_es: evolve/3 takes fun(([float()]) -> float()), higher is better, and returns #{best, fitness, generations, evaluations, reason}. That makes it a drop-in swap in the EXP-025/026 evaluation harness (EXP-028).

Reference: Hansen, "The CMA Evolution Strategy: A Tutorial" (arXiv 1604.00772) for the update equations; Ros and Hansen 2008 for the diagonal learning-rate scaling ((N+2)/3 on c1 and cmu).

Summary

Functions

Run a separable (diagonal) CMA-ES.

Types

fitness_fun/0

-type fitness_fun() :: fun((vector()) -> float()).

vector/0

-type vector() :: [float()].

Functions

evolve(FitnessFun, N, Opts)

-spec evolve(fitness_fun(), pos_integer(), map()) -> map().

Run a separable (diagonal) CMA-ES.

Opts: lambda offspring per generation (default 4 + floor(3*ln N)) mu parents (default lambda div 2) max_generations cap (default 1000) fitness_goal stop when best fitness >= this (default infinity) init_sigma initial step size (default 1.0) x0 initial mean vector (default zeros) trace when true, record the running best fitness per generation (default false) on_generation fun(Gen, BestFitnessSoFar) called once per generation, for live progress (default undefined)

Returns #{best, fitness, generations, evaluations, reason}, plus history => [{Generation, BestFitnessSoFar}] when trace is true (reason = solved | max_generations).