nsga_optimizer
Multi-objective NSGA-II/III optimization for walkers.
Multi-objective NSGA-II/III optimizer for walking mechanisms.
Wraps pymoo’s NSGA-II/III to optimize walking linkages against multiple
physics-based objectives simultaneously (e.g., distance + efficiency +
stability). Returns a ParetoFront of non-dominated solutions with
optional gait analysis and stability data.
Example:
from leggedsnake import (
DistanceFitness, StabilityFitness, Walker,
nsga_walking_optimization, NsgaWalkingConfig,
)
def make_walker():
return Walker(topology, dimensions)
result = nsga_walking_optimization(
walker_factory=make_walker,
objectives=[DistanceFitness(duration=10), StabilityFitness(duration=10)],
bounds=(lower, upper),
objective_names=["distance", "stability"],
nsga_config=NsgaWalkingConfig(n_generations=50, pop_size=40),
)
best = result.pareto_front.best_compromise()
print(best.scores)
- class leggedsnake.nsga_optimizer.NsgaWalkingConfig(n_generations: int = 100, pop_size: int = 100, algorithm: Literal['nsga2', 'nsga3'] = 'nsga2', seed: int | None = None, verbose: bool = True, crossover_prob: float = 0.9, mutation_eta: float = 20.0, n_workers: int = 1)
Bases:
objectConfiguration for NSGA-II/III walking optimization.
- Variables:
n_generations (int) – Number of evolutionary generations.
pop_size (int) – Population size per generation.
algorithm ({"nsga2", "nsga3"}) – Multi-objective algorithm. NSGA-II is best for 2–3 objectives; NSGA-III handles more.
seed (int | None) – Random seed for reproducibility.
verbose (bool) – Show progress during optimization.
crossover_prob (float) – Simulated binary crossover probability.
mutation_eta (float) – Polynomial mutation distribution index.
- __init__(n_generations: int = 100, pop_size: int = 100, algorithm: Literal['nsga2', 'nsga3'] = 'nsga2', seed: int | None = None, verbose: bool = True, crossover_prob: float = 0.9, mutation_eta: float = 20.0, n_workers: int = 1) None
- algorithm: Literal['nsga2', 'nsga3'] = 'nsga2'
- crossover_prob: float = 0.9
- mutation_eta: float = 20.0
- n_generations: int = 100
- n_workers: int = 1
Number of parallel workers for fitness evaluation. 1 = sequential (default). >1 uses a process pool.
- pop_size: int = 100
- seed: int | None = None
- verbose: bool = True
- class leggedsnake.nsga_optimizer.NsgaWalkingResult(pareto_front: ~pylinkage.optimization.collections.pareto.ParetoFront, gait_analyses: dict[int, ~leggedsnake.gait_analysis.GaitAnalysisResult] | None = None, stability_series: dict[int, ~leggedsnake.stability.StabilityTimeSeries] | None = None, config: ~leggedsnake.nsga_optimizer.NsgaWalkingConfig = <factory>)
Bases:
objectResult of multi-objective walking optimization.
- Variables:
pareto_front (ParetoFront) – Non-dominated solutions with scores and dimensions.
gait_analyses (dict[int, GaitAnalysisResult] | None) – Gait analysis for each Pareto solution (index → analysis). Only populated when
include_gait=True.stability_series (dict[int, StabilityTimeSeries] | None) – Stability time series for each Pareto solution. Only populated when
include_stability=True.config (NsgaWalkingConfig) – The configuration used.
- __init__(pareto_front: ~pylinkage.optimization.collections.pareto.ParetoFront, gait_analyses: dict[int, ~leggedsnake.gait_analysis.GaitAnalysisResult] | None = None, stability_series: dict[int, ~leggedsnake.stability.StabilityTimeSeries] | None = None, config: ~leggedsnake.nsga_optimizer.NsgaWalkingConfig = <factory>) None
- best_compromise(weights: Sequence[float] | None = None) ParetoSolution
Return the best compromise solution (delegates to ParetoFront).
- best_for_objective(objective_index: int) ParetoSolution
Return the Pareto solution that is best for a single objective.
Walking fitnesses maximize (distance, efficiency, stability all larger-is-better), and scores are stored un-negated after
_ensemble_to_pareto_front, somaxis correct here.- Parameters:
objective_index (int) – Index into the scores tuple (0-based).
- config: NsgaWalkingConfig
- gait_analyses: dict[int, GaitAnalysisResult] | None = None
- pareto_front: ParetoFront
- stability_series: dict[int, StabilityTimeSeries] | None = None
- class leggedsnake.nsga_optimizer.WalkingNsgaProblem(walker_factory: Callable[[], Any], objectives: Sequence[DynamicFitness], bounds: tuple[Sequence[float], Sequence[float]], config: Any | None = None, n_workers: int = 1)
Bases:
objectPymoo Problem for multi-objective walking optimization.
Each candidate is a vector of linkage constraint dimensions. Evaluation builds a Walker, runs physics for each objective, and returns the negated scores (pymoo minimizes; our fitness functions maximize).
- Parameters:
walker_factory (callable) – Zero-argument callable returning a fresh Walker.
objectives (sequence of DynamicFitness) – Fitness evaluators. Each produces a
FitnessResult.score.bounds (tuple of (lower, upper)) – Parameter bounds as sequences of floats.
config (WorldConfig | None) – Simulation config override.
- __init__(walker_factory: Callable[[], Any], objectives: Sequence[DynamicFitness], bounds: tuple[Sequence[float], Sequence[float]], config: Any | None = None, n_workers: int = 1) None
- close() None
Shut down the shared process pool, if one was created.
Safe to call repeatedly. The driver in
nsga_walking_optimization()invokes this in a finally block so workers don’t outlive the optimization.
- property problem: Any
The pymoo Problem instance.
- leggedsnake.nsga_optimizer.nsga_walking_optimization(walker_factory: Callable[[], Any], objectives: Sequence[DynamicFitness], bounds: tuple[Sequence[float], Sequence[float]], objective_names: Sequence[str] | None = None, nsga_config: NsgaWalkingConfig | None = None, world_config: Any | None = None, include_gait: bool = False, include_stability: bool = False) NsgaWalkingResult
Multi-objective walking optimization via NSGA-II/III.
Optimizes a walking mechanism against multiple
DynamicFitnessobjectives simultaneously using pymoo. Returns a Pareto front of non-dominated solutions with optional gait and stability analysis.- Parameters:
walker_factory (callable) – Zero-argument callable returning a fresh Walker instance.
objectives (sequence of DynamicFitness) – Fitness evaluators (e.g.,
DistanceFitness,StabilityFitness).bounds (tuple of (lower, upper)) – Parameter bounds as sequences of floats, one per constraint dimension.
objective_names (sequence of str, optional) – Human-readable names for each objective.
nsga_config (NsgaWalkingConfig, optional) – Algorithm configuration. Uses defaults if None.
world_config (WorldConfig, optional) – Simulation config passed to fitness evaluators.
include_gait (bool) – If True, run gait analysis on Pareto-front solutions after optimization completes.
include_stability (bool) – If True, collect stability time series for Pareto-front solutions.
- Returns:
Pareto front with optional gait/stability analysis.
- Return type: