Pymoo Genetic Operators Reference
Comprehensive reference for genetic operators in pymoo.
Sampling Operators
Sampling operators initialize populations at the start of optimization.
Random Sampling
Purpose: Generate random initial solutions
Types:
- FloatRandomSampling: Continuous variables
- BinaryRandomSampling: Binary variables
- IntegerRandomSampling: Integer variables
- PermutationRandomSampling: Permutation-based problems
Usage:
from pymoo.operators.sampling.rnd import FloatRandomSampling
sampling = FloatRandomSampling()
Latin Hypercube Sampling (LHS)
Purpose: Space-filling initial population
Benefit: Better coverage of search space than random
Types:
- LHS: Standard Latin Hypercube
Usage:
from pymoo.operators.sampling.lhs import LHS
sampling = LHS()
Custom Sampling
Provide initial population through Population object or NumPy array
Selection Operators
Selection operators choose parents for reproduction.
Tournament Selection
Purpose: Select parents through tournament competition
Mechanism: Randomly select k individuals, choose best
Parameters:
- pressure: Tournament size (default: 2)
- func_comp: Comparison function
Usage:
from pymoo.operators.selection.tournament import TournamentSelection
selection = TournamentSelection(pressure=2)
Random Selection
Purpose: Uniform random parent selection Use case: Baseline or exploration-focused algorithms
Usage:
from pymoo.operators.selection.rnd import RandomSelection
selection = RandomSelection()
Crossover Operators
Crossover operators recombine parent solutions to create offspring.
For Continuous Variables
Simulated Binary Crossover (SBX)
Purpose: Primary crossover for continuous optimization
Mechanism: Simulates single-point crossover of binary-encoded variables
Parameters:
- prob: Crossover probability (default: 0.9)
- eta: Distribution index (default: 15)
- Higher eta → offspring closer to parents
- Lower eta → more exploration
Usage:
from pymoo.operators.crossover.sbx import SBX
crossover = SBX(prob=0.9, eta=15)
String shorthand: "real_sbx"
Differential Evolution Crossover
Purpose: DE-specific recombination
Variants:
- DE/rand/1/bin
- DE/best/1/bin
- DE/current-to-best/1/bin
Parameters:
- CR: Crossover rate
- F: Scaling factor
For Binary Variables
Single Point Crossover
Purpose: Cut and swap at one point Usage:
from pymoo.operators.crossover.pntx import SinglePointCrossover
crossover = SinglePointCrossover()
Two Point Crossover
Purpose: Cut and swap between two points Usage:
from pymoo.operators.crossover.pntx import TwoPointCrossover
crossover = TwoPointCrossover()
K-Point Crossover
Purpose: Multiple cut points
Parameters:
- n_points: Number of crossover points
Uniform Crossover
Purpose: Each gene independently from either parent
Parameters:
- prob: Per-gene swap probability (default: 0.5)
Usage:
from pymoo.operators.crossover.ux import UniformCrossover
crossover = UniformCrossover(prob=0.5)
Half Uniform Crossover (HUX)
Purpose: Exchange exactly half of differing genes Benefit: Maintains genetic diversity
For Permutations
Order Crossover (OX)
Purpose: Preserve relative order from parents Use case: Traveling salesman, scheduling problems
Usage:
from pymoo.operators.crossover.ox import OrderCrossover
crossover = OrderCrossover()
Edge Recombination Crossover (ERX)
Purpose: Preserve edge information from parents Use case: Routing problems where edge connectivity matters
Partially Mapped Crossover (PMX)
Purpose: Exchange segments while maintaining permutation validity
Mutation Operators
Mutation operators introduce variation to maintain diversity.
For Continuous Variables
Polynomial Mutation (PM)
Purpose: Primary mutation for continuous optimization
Mechanism: Polynomial probability distribution
Parameters:
- prob: Per-variable mutation probability
- eta: Distribution index (default: 20)
- Higher eta → smaller perturbations
- Lower eta → larger perturbations
Usage:
from pymoo.operators.mutation.pm import PM
mutation = PM(prob=None, eta=20) # prob=None means 1/n_var
String shorthand: "real_pm"
Probability guidelines:
- None or 1/n_var: Standard recommendation
- Higher for more exploration
- Lower for more exploitation
For Binary Variables
Bitflip Mutation
Purpose: Flip bits with specified probability
Parameters:
- prob: Per-bit flip probability
Usage:
from pymoo.operators.mutation.bitflip import BitflipMutation
mutation = BitflipMutation(prob=0.05)
For Integer Variables
Integer Polynomial Mutation
Purpose: PM adapted for integers Ensures: Valid integer values after mutation
For Permutations
Inversion Mutation
Purpose: Reverse a segment of the permutation Use case: Maintains some order structure
Usage:
from pymoo.operators.mutation.inversion import InversionMutation
mutation = InversionMutation()
Scramble Mutation
Purpose: Randomly shuffle a segment
Custom Mutation
Define custom mutation by extending Mutation class
Repair Operators
Repair operators fix constraint violations or ensure solution feasibility.
Rounding Repair
Purpose: Round to nearest valid value Use case: Integer/discrete variables with bound constraints
Bounce Back Repair
Purpose: Reflect out-of-bounds values back into feasible region Use case: Box-constrained continuous problems
Projection Repair
Purpose: Project infeasible solutions onto feasible region Use case: Linear constraints
Custom Repair
Purpose: Domain-specific constraint handling
Implementation: Extend Repair class
Example:
from pymoo.core.repair import Repair
class MyRepair(Repair):
def _do(self, problem, X, **kwargs):
# Modify X to satisfy constraints
# Return repaired X
return X
Operator Configuration Guidelines
Parameter Tuning
Crossover probability: - High (0.8-0.95): Standard for most problems - Lower: More emphasis on mutation
Mutation probability:
- 1/n_var: Standard recommendation
- Higher: More exploration, slower convergence
- Lower: Faster convergence, risk of premature convergence
Distribution indices (eta): - Crossover eta (15-30): Higher for local search - Mutation eta (20-50): Higher for exploitation
Problem-Specific Selection
Continuous problems: - Crossover: SBX - Mutation: Polynomial Mutation - Selection: Tournament
Binary problems: - Crossover: Two-point or Uniform - Mutation: Bitflip - Selection: Tournament
Permutation problems: - Crossover: Order Crossover (OX) - Mutation: Inversion or Scramble - Selection: Tournament
Mixed-variable problems: - Use appropriate operators per variable type - Ensure operator compatibility
String-Based Configuration
Pymoo supports convenient string-based operator specification:
from pymoo.algorithms.soo.nonconvex.ga import GA
algorithm = GA(
pop_size=100,
sampling="real_random",
crossover="real_sbx",
mutation="real_pm"
)
Available strings:
- Sampling: "real_random", "real_lhs", "bin_random", "perm_random"
- Crossover: "real_sbx", "real_de", "int_sbx", "bin_ux", "bin_hux"
- Mutation: "real_pm", "int_pm", "bin_bitflip", "perm_inv"
Operator Combination Examples
Standard Continuous GA:
from pymoo.operators.sampling.rnd import FloatRandomSampling
from pymoo.operators.crossover.sbx import SBX
from pymoo.operators.mutation.pm import PM
from pymoo.operators.selection.tournament import TournamentSelection
sampling = FloatRandomSampling()
crossover = SBX(prob=0.9, eta=15)
mutation = PM(eta=20)
selection = TournamentSelection()
Binary GA:
from pymoo.operators.sampling.rnd import BinaryRandomSampling
from pymoo.operators.crossover.pntx import TwoPointCrossover
from pymoo.operators.mutation.bitflip import BitflipMutation
sampling = BinaryRandomSampling()
crossover = TwoPointCrossover()
mutation = BitflipMutation(prob=0.05)
Permutation GA (TSP):
from pymoo.operators.sampling.rnd import PermutationRandomSampling
from pymoo.operators.crossover.ox import OrderCrossover
from pymoo.operators.mutation.inversion import InversionMutation
sampling = PermutationRandomSampling()
crossover = OrderCrossover()
mutation = InversionMutation()