Class NeatSelection<T extends Comparable<T>>

java.lang.Object
net.bmahe.genetics4j.neat.spec.selection.NeatSelection<T>
Type Parameters:
T - the fitness value type (typically Double)
All Implemented Interfaces:
SelectionPolicy
Direct Known Subclasses:
ImmutableNeatSelection

@Immutable public abstract class NeatSelection<T extends Comparable<T>> extends Object implements SelectionPolicy
Selection policy for NEAT (NeuroEvolution of Augmenting Topologies) species-based selection.

NeatSelection implements the species-based selection mechanism that is fundamental to NEAT's ability to maintain population diversity and protect structural innovations. It organizes the population into species based on genetic compatibility, applies fitness sharing within species, and manages reproduction allocation to prevent dominant topologies from eliminating exploration.

Key features:

  • Species formation: Groups genetically similar individuals using compatibility predicates
  • Fitness sharing: Reduces fitness pressure within species to promote diversity
  • Species preservation: Maintains minimum viable species sizes
  • Reproduction allocation: Distributes offspring based on species average fitness

NEAT species-based selection process:

  1. Compatibility testing: Apply species predicate to group similar individuals
  2. Species assignment: Assign individuals to species based on genetic distance
  3. Fitness adjustment: Apply fitness sharing within each species
  4. Species filtering: Remove species below minimum size threshold
  5. Reproduction allocation: Determine offspring count per species
  6. Within-species selection: Select parents using specified selection policy

Species management parameters:

  • Keep ratio: Proportion of each species to preserve for reproduction
  • Minimum size: Smallest viable species size to prevent extinction
  • Compatibility predicate: Function determining species membership
  • Selection policy: Within-species selection strategy

Common usage patterns:

// Default NEAT selection with standard parameters
NeatSelection<Double> defaultSelection = NeatSelection.ofDefault();

// Custom compatibility threshold
BiPredicate<Individual<Double>, Individual<Double>> compatibilityPredicate = (i1,
		i2) -> NeatUtils.compatibilityDistance(i1.genotype(), i2.genotype(), 0, 2, 2, 1.0f) < 3.0; // Higher threshold
																																	// = fewer, larger
																																	// species

NeatSelection<Double> customSelection = NeatSelection.<Double>builder()
		.perSpeciesKeepRatio(0.8f) // Keep top 80% of each species
		.minSpeciesSize(3) // Minimum 3 individuals per species
		.speciesPredicate(compatibilityPredicate)
		.speciesSelection(Tournament.of(5)) // Tournament size 5 within species
		.build();

// Aggressive diversity preservation
NeatSelection<Double> diverseSelection = NeatSelection.of(
		0.95f, // Keep 95% of each species
		compatibilityPredicate,
		new ProportionalSelection() // Proportional selection within species
);

Compatibility distance calculation:

  • Matching genes: Genes with same innovation numbers in both individuals
  • Disjoint genes: Genes in one individual within the other's innovation range
  • Excess genes: Genes beyond the other individual's highest innovation number
  • Weight differences: Average difference in matching gene weights

Species preservation strategies:

  • Keep ratio: Ensures a proportion of each species survives selection pressure
  • Minimum size: Prevents viable species from going extinct due to random drift
  • Fitness sharing: Reduces competition between similar individuals
  • Innovation protection: Gives new topologies time to optimize

Integration with genetic operators:

  • Crossover compatibility: Species ensure genetic similarity for meaningful recombination
  • Mutation guidance: Species composition can influence mutation rates
  • Structural innovation: Protected evolution of different network topologies
  • Population dynamics: Species formation and extinction drive exploration

Performance considerations:

  • Compatibility caching: Distance calculations cached for efficiency
  • Species reuse: Species structures maintained across generations
  • Parallel evaluation: Species-based organization enables concurrent processing
  • Memory efficiency: Efficient species membership tracking
See Also:
  • Constructor Details

    • NeatSelection

      public NeatSelection()
  • Method Details

    • perSpeciesKeepRatio

      @Default public float perSpeciesKeepRatio()
      Returns the proportion of each species to preserve for reproduction.

      This ratio determines what fraction of each species will be retained after fitness-based culling. Higher values preserve more diversity within species but may slow convergence, while lower values increase selection pressure but may lose beneficial genetic variations.

      Typical values:

      • 0.9 (default): Preserve top 90% of each species
      • 0.8-0.95: Balanced diversity preservation
      • < 0.8: Aggressive selection pressure
      • > 0.95: Minimal selection pressure, maximum diversity
      Returns:
      keep ratio between 0.0 and 1.0 (exclusive of 0.0, inclusive of 1.0)
    • minSpeciesSize

      @Default public int minSpeciesSize()
      Returns the minimum number of individuals required to maintain a species.

      Species with fewer members than this threshold will be eliminated to prevent resource waste on non-viable populations. This helps focus evolutionary resources on species with sufficient genetic diversity to explore their local fitness landscape effectively.

      Typical values:

      • 5 (default): Balanced viability threshold
      • 3-10: Reasonable range for most problems
      • < 3: Very permissive, allows small species to survive
      • > 10: Strict threshold, eliminates marginal species
      Returns:
      minimum species size (must be positive)
    • speciesPredicate

      public abstract BiPredicate<Individual<T>, Individual<T>> speciesPredicate()
      Returns the predicate used to determine species membership.

      This bi-predicate takes two individuals and returns true if they should belong to the same species based on their genetic compatibility. Typically implemented using NEAT compatibility distance with a threshold value.

      Common implementations:

      • Compatibility distance: Based on matching, disjoint, excess genes and weight differences
      • Topological similarity: Based on network structure similarity
      • Behavioral similarity: Based on network output patterns
      • Custom metrics: Domain-specific similarity measures
      Returns:
      bi-predicate for determining species membership
    • speciesSelection

      public abstract SelectionPolicy speciesSelection()
      Returns the selection policy used within each species.

      After individuals are organized into species, this policy determines how parents are selected within each species for reproduction. Common choices include tournament selection, proportional selection, or rank-based selection.

      Selection policy considerations:

      • Tournament selection: Good balance of selection pressure and diversity
      • Proportional selection: Fitness-proportionate selection within species
      • Rank selection: Rank-based selection to avoid fitness scaling issues
      • Elite selection: Always select best individuals within species
      Returns:
      selection policy for within-species parent selection
    • interspeciesMatingRate

      @Default public float interspeciesMatingRate()
      Returns the probability of mating between individuals from different species.

      Standard NEAT (Stanley invalid input: '&' Miikkulainen, 2002) speciation isolates species for mating to protect structural innovations. The original paper allows a small probability of interspecies mating (e.g. 0.001) to enable occasional genetic mixing across species boundaries.

      The selector returns a flat population ordered by species. EASystem pairs consecutive individuals (index 0+1, 2+3, ...). When this rate is 0, each species allocation is rounded to an even count so that every consecutive pair stays within the same species. When the rate is greater than 0, the selector randomly swaps the second individual of some pairs with an individual from a different species, at the given probability.

      Typical values:

      • 0.0 (default): Strict speciation, no interspecies mating
      • 0.001: Paper's suggested rate, occasional cross-species pairing
      • 0.05-0.1: Aggressive genetic mixing
      Returns:
      interspecies mating rate between 0.0 (inclusive) and 1.0 (inclusive)
    • check

      @Check public void check()
    • builder

      public static <U extends Comparable<U>> NeatSelection.Builder<U> builder()
    • of

      public static <U extends Comparable<U>> NeatSelection<U> of(float perSpeciesKeepRatio, BiPredicate<Individual<U>, Individual<U>> speciesPredicate, SelectionPolicy speciesSelection)
      Creates a NEAT selection policy with custom keep ratio and specified parameters.
      Type Parameters:
      U - the fitness value type
      Parameters:
      perSpeciesKeepRatio - proportion of each species to preserve (0.0 invalid input: '<' ratio invalid input: '<'= 1.0)
      speciesPredicate - predicate for determining species membership
      speciesSelection - selection policy for within-species parent selection
      Returns:
      a new NEAT selection policy with the specified parameters
    • of

      public static <U extends Comparable<U>> NeatSelection<U> of(BiPredicate<Individual<U>, Individual<U>> speciesPredicate, SelectionPolicy speciesSelection)
      Creates a NEAT selection policy with default keep ratio and specified parameters.
      Type Parameters:
      U - the fitness value type
      Parameters:
      speciesPredicate - predicate for determining species membership
      speciesSelection - selection policy for within-species parent selection
      Returns:
      a new NEAT selection policy with default keep ratio (0.9)
    • ofDefault

      public static <U extends Comparable<U>> NeatSelection<U> ofDefault()
      Creates a NEAT selection policy with standard default parameters.

      Default configuration:

      • Keep ratio: 0.9 (preserve top 90% of each species)
      • Minimum species size: 5 individuals
      • Compatibility distance: Threshold of 1.0 with standard coefficients
      • Species selection: Tournament selection with size 3

      Compatibility distance uses:

      • Weight coefficient: 1.0
      • Excess gene coefficient: 2.0
      • Disjoint gene coefficient: 2.0
      • Distance threshold: 1.0
      Type Parameters:
      U - the fitness value type
      Returns:
      a new NEAT selection policy with standard default parameters
    • ofCompatibilityDistance

      public static <U extends Comparable<U>> NeatSelection<U> ofCompatibilityDistance(float compatibilityThreshold, SelectionPolicy speciesSelection)
      Creates a NEAT selection policy using compatibility distance for speciation with default coefficients.

      Default coefficients: excess=2.0, disjoint=2.0, weight difference=1.0

      Type Parameters:
      U - the fitness value type
      Parameters:
      compatibilityThreshold - maximum compatibility distance for same-species membership
      speciesSelection - selection policy for within-species parent selection
      Returns:
      a new NEAT selection policy with default keep ratio and coefficients
    • ofCompatibilityDistance

      public static <U extends Comparable<U>> NeatSelection<U> ofCompatibilityDistance(float compatibilityThreshold, float c1, float c2, float c3, SelectionPolicy speciesSelection)
      Creates a NEAT selection policy using compatibility distance for speciation with custom coefficients.
      Type Parameters:
      U - the fitness value type
      Parameters:
      compatibilityThreshold - maximum compatibility distance for same-species membership
      c1 - excess gene coefficient
      c2 - disjoint gene coefficient
      c3 - weight difference coefficient
      speciesSelection - selection policy for within-species parent selection
      Returns:
      a new NEAT selection policy with default keep ratio and custom coefficients
    • ofCompatibilityDistance

      public static <U extends Comparable<U>> NeatSelection<U> ofCompatibilityDistance(float perSpeciesKeepRatio, float compatibilityThreshold, float c1, float c2, float c3, SelectionPolicy speciesSelection)
      Creates a NEAT selection policy using compatibility distance for speciation with custom keep ratio and coefficients.
      Type Parameters:
      U - the fitness value type
      Parameters:
      perSpeciesKeepRatio - proportion of each species to preserve (0.0 invalid input: '<' ratio invalid input: '<'= 1.0)
      compatibilityThreshold - maximum compatibility distance for same-species membership
      c1 - excess gene coefficient
      c2 - disjoint gene coefficient
      c3 - weight difference coefficient
      speciesSelection - selection policy for within-species parent selection
      Returns:
      a new NEAT selection policy with the specified parameters