Pymoo - Multi-Objective Optimization in Python
Overview
Pymoo is a comprehensive Python framework for optimization with emphasis on multi-objective problems. Solve single and multi-objective optimization using state-of-the-art algorithms (NSGA-II/III, MOEA/D), benchmark problems (ZDT, DTLZ), customizable genetic operators, and multi-criteria decision making methods. Excels at finding trade-off solutions (Pareto fronts) for problems with conflicting objectives.
When to Use This Skill
This skill should be used when:
- Solving optimization problems with one or multiple objectives
- Finding Pareto-optimal solutions and analyzing trade-offs
- Implementing evolutionary algorithms (GA, DE, PSO, NSGA-II/III)
- Working with constrained optimization problems
- Benchmarking algorithms on standard test problems (ZDT, DTLZ, WFG)
- Customizing genetic operators (crossover, mutation, selection)
- Visualizing high-dimensional optimization results
- Making decisions from multiple competing solutions
- Handling binary, discrete, continuous, or mixed-variable problems
Core Concepts
The Unified Interface
Pymoo uses a consistent minimize() function for all optimization tasks:
Result object contains:
result.X: Decision variables of optimal solution(s)result.F: Objective values of optimal solution(s)result.G: Constraint violations (if constrained)result.algorithm: Algorithm object with history
Problem Types
Single-objective: One objective to minimize/maximize Multi-objective: 2-3 conflicting objectives → Pareto front Many-objective: 4+ objectives → High-dimensional Pareto front Constrained: Objectives + inequality/equality constraints Dynamic: Time-varying objectives or constraints
Quick Start Workflows
Workflow 1: Single-Objective Optimization
When: Optimizing one objective function
Steps:
- Define or select problem
- Choose single-objective algorithm (GA, DE, PSO, CMA-ES)
- Configure termination criteria
- Run optimization
- Extract best solution
Example:
See: scripts/single_objective_example.py for complete example
Workflow 2: Multi-Objective Optimization (2-3 objectives)
When: Optimizing 2-3 conflicting objectives, need Pareto front
Algorithm choice: NSGA-II (standard for bi/tri-objective)
Steps:
- Define multi-objective problem
- Configure NSGA-II
- Run optimization to obtain Pareto front
- Visualize trade-offs
- Apply decision making (optional)
Example:
See: scripts/multi_objective_example.py for complete example
Workflow 3: Many-Objective Optimization (4+ objectives)
When: Optimizing 4 or more objectives
Algorithm choice: NSGA-III (designed for many objectives)
Key difference: Must provide reference directions for population guidance
Steps:
- Define many-objective problem
- Generate reference directions
- Configure NSGA-III with reference directions
- Run optimization
- Visualize using Parallel Coordinate Plot
Example:
See: scripts/many_objective_example.py for complete example
Workflow 4: Custom Problem Definition
When: Solving domain-specific optimization problem
Steps:
- Extend
ElementwiseProblemclass - Define
__init__with problem dimensions and bounds - Implement
_evaluatemethod for objectives (and constraints) - Use with any algorithm
Unconstrained example:
Constrained example:
Constraint formulation rules:
- Inequality: Express as
g(x) <= 0(feasible when ≤ 0) - Equality: Express as
h(x) = 0(feasible when = 0) - Convert
g(x) >= bto-(g(x) - b) <= 0
See: scripts/custom_problem_example.py for complete examples
Workflow 5: Constraint Handling
When: Problem has feasibility constraints
Approach options:
1. Feasibility First (Default - Recommended)
2. Penalty Method
3. Constraint as Objective
4. Specialized Algorithms
See: references/constraints_mcdm.md for comprehensive constraint handling guide
Workflow 6: Decision Making from Pareto Front
When: Have Pareto front, need to select preferred solution(s)
Steps:
- Run multi-objective optimization
- Normalize objectives to [0, 1]
- Define preference weights
- Apply MCDM method
- Visualize selected solution
Example using Pseudo-Weights:
Other MCDM methods:
- Compromise Programming: Select closest to ideal point
- Knee Point: Find balanced trade-off solutions
- Hypervolume Contribution: Select most diverse subset
See:
scripts/decision_making_example.pyfor complete examplereferences/constraints_mcdm.mdfor detailed MCDM methods
Workflow 7: Visualization
Choose visualization based on number of objectives:
2 objectives: Scatter Plot
3 objectives: 3D Scatter
4+ objectives: Parallel Coordinate Plot
Solution comparison: Petal Diagram
See: references/visualization.md for all visualization types and usage
Algorithm Selection Guide
Single-Objective Problems
Multi-Objective Problems (2-3 objectives)
Many-Objective Problems (4+ objectives)
Constrained Problems
See: references/algorithms.md for comprehensive algorithm reference
Benchmark Problems
Quick problem access:
See: references/problems.md for complete test problem reference
Genetic Operator Customization
Standard operator configuration:
Operator selection by variable type:
Continuous variables:
- Crossover: SBX (Simulated Binary Crossover)
- Mutation: PM (Polynomial Mutation)
Binary variables:
- Crossover: TwoPointCrossover, UniformCrossover
- Mutation: BitflipMutation
Permutations (TSP, scheduling):
- Crossover: OrderCrossover (OX)
- Mutation: InversionMutation
See: references/operators.md for comprehensive operator reference
Performance and Troubleshooting
Common issues and solutions:
Problem: Algorithm not converging
- Increase population size
- Increase number of generations
- Check if problem is multimodal (try different algorithms)
- Verify constraints are correctly formulated
Problem: Poor Pareto front distribution
- For NSGA-III: Adjust reference directions
- Increase population size
- Check for duplicate elimination
- Verify problem scaling
Problem: Few feasible solutions
- Use constraint-as-objective approach
- Apply repair operators
- Try SRES/ISRES for constrained problems
- Check constraint formulation (should be g <= 0)
Problem: High computational cost
- Reduce population size
- Decrease number of generations
- Use simpler operators
- Enable parallelization (if problem supports)
Best practices:
- Normalize objectives when scales differ significantly
- Set random seed for reproducibility
- Save history to analyze convergence:
save_history=True - Visualize results to understand solution quality
- Compare with true Pareto front when available
- Use appropriate termination criteria (generations, evaluations, tolerance)
- Tune operator parameters for problem characteristics
Resources
This skill includes comprehensive reference documentation and executable examples:
references/
Detailed documentation for in-depth understanding:
- algorithms.md: Complete algorithm reference with parameters, usage, and selection guidelines
- problems.md: Benchmark test problems (ZDT, DTLZ, WFG) with characteristics
- operators.md: Genetic operators (sampling, selection, crossover, mutation) with configuration
- visualization.md: All visualization types with examples and selection guide
- constraints_mcdm.md: Constraint handling techniques and multi-criteria decision making methods
Search patterns for references:
- Algorithm details:
grep -r "NSGA-II\|NSGA-III\|MOEA/D" references/ - Constraint methods:
grep -r "Feasibility First\|Penalty\|Repair" references/ - Visualization types:
grep -r "Scatter\|PCP\|Petal" references/
scripts/
Executable examples demonstrating common workflows:
- single_objective_example.py: Basic single-objective optimization with GA
- multi_objective_example.py: Multi-objective optimization with NSGA-II, visualization
- many_objective_example.py: Many-objective optimization with NSGA-III, reference directions
- custom_problem_example.py: Defining custom problems (constrained and unconstrained)
- decision_making_example.py: Multi-criteria decision making with different preferences
Run examples:
Additional Notes
Installation:
Dependencies: NumPy, SciPy, matplotlib, autograd (optional for gradient-based)
Documentation: https://pymoo.org/
Version: This skill is based on pymoo 0.6.x
Common patterns:
- Always use
ElementwiseProblemfor custom problems - Constraints formulated as
g(x) <= 0andh(x) = 0 - Reference directions required for NSGA-III
- Normalize objectives before MCDM
- Use appropriate termination:
('n_gen', N)orget_termination("f_tol", tol=0.001)

