Skip to content

Evolution API Reference

Complete API documentation for genetic algorithms and evolutionary operations.

GeneticEvolver Class

Main class for evolutionary algorithms and meme population evolution.

Constructor

class GeneticEvolver:
    def __init__(
        self,
        population_size: int = 20,
        mutation_rate: float = 0.25,
        crossover_rate: float = 0.75,
        elitism_ratio: float = 0.1,
        fitness_function: Optional[Callable] = None,
        selection_method: str = "tournament",
        **kwargs
    ) -> None:
        """
        Initialize genetic evolver.

        Args:
            population_size: Size of the evolution population
            mutation_rate: Probability of mutation (0.0 to 1.0)
            crossover_rate: Probability of crossover (0.0 to 1.0)
            elitism_ratio: Fraction of elite individuals preserved
            fitness_function: Custom fitness evaluation function
            selection_method: Parent selection method
            **kwargs: Additional evolution parameters
        """

Evolution Parameters

Parameter Type Default Range Description
population_size int 20 2-1000 Number of individuals
mutation_rate float 0.25 0.0-1.0 Mutation probability
crossover_rate float 0.75 0.0-1.0 Crossover probability
elitism_ratio float 0.1 0.0-0.5 Elite preservation ratio
tournament_size int 3 2-10 Tournament selection size
max_stagnation int 10 1-100 Generations before restart

Core Evolution Methods

Basic Evolution

def evolve(
    self,
    initial_population: List[Meme],
    generations: int = 5,
    target_fitness: Optional[float] = None,
    convergence_threshold: float = 0.001
) -> EvolutionResult:
    """
    Evolve population of memes.

    Args:
        initial_population: Starting meme population
        generations: Number of generations to evolve
        target_fitness: Stop when fitness reached
        convergence_threshold: Stop when improvement < threshold

    Returns:
        EvolutionResult: Evolution results and final population

    Raises:
        MemeticEvolutionError: If evolution process fails
    """

def evolve_with_constraints(
    self,
    initial_population: List[Meme],
    constraints: EvolutionConstraints,
    generations: int = 5
) -> EvolutionResult:
    """
    Evolve with specific constraints.

    Args:
        initial_population: Starting population
        constraints: Evolution constraints
        generations: Number of generations

    Returns:
        EvolutionResult: Constrained evolution results
    """

Example:

from qmemetic_ai.core.evolution import GeneticEvolver, EvolutionConstraints

# Initialize evolver
evolver = GeneticEvolver(
    population_size=30,
    mutation_rate=0.3,
    crossover_rate=0.8,
    elitism_ratio=0.15
)

# Create initial population
initial_memes = [engine.create_meme(f"Research idea {i}") for i in range(15)]

# Basic evolution
result = evolver.evolve(
    initial_population=initial_memes,
    generations=20,
    target_fitness=0.9
)

print(f"Final fitness: {result.best_fitness:.3f}")
print(f"Generations completed: {result.generations_completed}")
print(f"Convergence achieved: {result.converged}")

Advanced Evolution

def multi_objective_evolution(
    self,
    initial_population: List[Meme],
    objectives: List[Callable],
    generations: int = 10,
    archive_size: int = 100
) -> MultiObjectiveResult:
    """
    Perform multi-objective evolution.

    Args:
        initial_population: Starting population
        objectives: List of objective functions
        generations: Number of generations
        archive_size: Size of Pareto archive

    Returns:
        MultiObjectiveResult: Pareto-optimal solutions
    """

def coevolution(
    self,
    populations: List[List[Meme]],
    interaction_matrix: np.ndarray,
    generations: int = 10
) -> CoevolutionResult:
    """
    Perform cooperative coevolution.

    Args:
        populations: Multiple populations to coevolve
        interaction_matrix: Population interaction strengths
        generations: Number of generations

    Returns:
        CoevolutionResult: Coevolution results
    """

Selection Methods

def tournament_selection(
    self,
    population: List[Meme],
    tournament_size: int = 3,
    num_parents: int = 2
) -> List[Meme]:
    """
    Tournament selection for parent memes.

    Args:
        population: Current population
        tournament_size: Size of tournament
        num_parents: Number of parents to select

    Returns:
        List[Meme]: Selected parent memes
    """

def roulette_wheel_selection(
    self,
    population: List[Meme],
    num_parents: int = 2
) -> List[Meme]:
    """
    Roulette wheel selection based on fitness.

    Args:
        population: Current population
        num_parents: Number of parents to select

    Returns:
        List[Meme]: Selected parent memes
    """

def rank_selection(
    self,
    population: List[Meme],
    selection_pressure: float = 2.0,
    num_parents: int = 2
) -> List[Meme]:
    """
    Rank-based selection.

    Args:
        population: Current population
        selection_pressure: Selection pressure parameter
        num_parents: Number of parents to select

    Returns:
        List[Meme]: Selected parent memes
    """

Example:

# Configure different selection methods
evolver.selection_method = "tournament"
evolver.tournament_size = 5

# Multi-objective evolution
objectives = [
    lambda m: m.calculate_fitness(),           # Primary fitness
    lambda m: m.novelty_score(),              # Novelty objective
    lambda m: 1.0 - m.complexity             # Simplicity objective
]

mo_result = evolver.multi_objective_evolution(
    initial_population=initial_memes,
    objectives=objectives,
    generations=15
)

print(f"Pareto front size: {len(mo_result.pareto_front)}")

Genetic Operators

Crossover Operations

def semantic_crossover(
    self,
    parent1: Meme,
    parent2: Meme,
    method: str = "weighted_average"
) -> Tuple[Meme, Meme]:
    """
    Perform semantic crossover between memes.

    Args:
        parent1: First parent meme
        parent2: Second parent meme
        method: Crossover method

    Returns:
        Tuple[Meme, Meme]: Two offspring memes
    """

def content_crossover(
    self,
    parent1: Meme,
    parent2: Meme,
    crossover_point: Optional[float] = None
) -> Tuple[Meme, Meme]:
    """
    Perform content-based crossover.

    Args:
        parent1: First parent meme
        parent2: Second parent meme
        crossover_point: Crossover position (0.0 to 1.0)

    Returns:
        Tuple[Meme, Meme]: Two offspring memes
    """

def uniform_crossover(
    self,
    parent1: Meme,
    parent2: Meme,
    swap_probability: float = 0.5
) -> Tuple[Meme, Meme]:
    """
    Perform uniform crossover.

    Args:
        parent1: First parent meme
        parent2: Second parent meme
        swap_probability: Probability of swapping each element

    Returns:
        Tuple[Meme, Meme]: Two offspring memes
    """

Mutation Operations

def semantic_mutation(
    self,
    meme: Meme,
    mutation_strength: float = 0.1
) -> Meme:
    """
    Apply semantic mutation to meme.

    Args:
        meme: Meme to mutate
        mutation_strength: Strength of mutation

    Returns:
        Meme: Mutated meme
    """

def content_mutation(
    self,
    meme: Meme,
    mutation_type: str = "synonym_replacement"
) -> Meme:
    """
    Apply content-based mutation.

    Args:
        meme: Meme to mutate
        mutation_type: Type of content mutation

    Returns:
        Meme: Mutated meme
    """

def structural_mutation(
    self,
    meme: Meme,
    structure_changes: List[str]
) -> Meme:
    """
    Apply structural mutations to meme.

    Args:
        meme: Meme to mutate
        structure_changes: List of structural changes

    Returns:
        Meme: Mutated meme
    """

Example:

# Custom crossover and mutation
parent1 = evolved_memes[0]
parent2 = evolved_memes[1]

# Semantic crossover
child1, child2 = evolver.semantic_crossover(
    parent1, parent2, method="attention_weighted"
)

# Content mutation
mutated_child = evolver.content_mutation(
    child1, mutation_type="paraphrase"
)

print(f"Parent 1: {parent1.content[:50]}...")
print(f"Parent 2: {parent2.content[:50]}...")
print(f"Child: {child1.content[:50]}...")
print(f"Mutated: {mutated_child.content[:50]}...")

EvolutionParameters Class

Configuration container for evolution parameters.

Parameter Groups

class EvolutionParameters:
    def __init__(
        self,
        # Basic parameters
        population_size: int = 20,
        generations: int = 5,

        # Genetic operators
        mutation_rate: float = 0.25,
        crossover_rate: float = 0.75,
        elitism_ratio: float = 0.1,

        # Selection parameters
        selection_method: str = "tournament",
        tournament_size: int = 3,
        selection_pressure: float = 2.0,

        # Convergence parameters
        convergence_threshold: float = 0.001,
        max_stagnation: int = 10,
        target_fitness: Optional[float] = None,

        # Diversity parameters
        diversity_pressure: float = 0.0,
        niching_enabled: bool = False,
        niche_radius: float = 0.1,

        # Performance parameters
        parallel_evaluation: bool = True,
        batch_size: int = 10,
        memory_limit: Optional[str] = None
    ) -> None:
        """Initialize evolution parameters."""

Parameter Validation

def validate_parameters(self) -> List[str]:
    """
    Validate parameter values.

    Returns:
        List[str]: List of validation errors (empty if valid)
    """

def optimize_for_dataset(
    self,
    dataset_size: int,
    available_memory: str,
    time_budget: int
) -> None:
    """
    Optimize parameters for specific dataset and constraints.

    Args:
        dataset_size: Size of meme dataset
        available_memory: Available memory (e.g., "4GB")
        time_budget: Time budget in seconds
    """

def adaptive_adjustment(
    self,
    generation: int,
    fitness_history: List[float],
    diversity_history: List[float]
) -> None:
    """
    Adaptively adjust parameters during evolution.

    Args:
        generation: Current generation number
        fitness_history: Historical fitness values
        diversity_history: Historical diversity values
    """

Example:

from qmemetic_ai.core.evolution import EvolutionParameters

# Create optimized parameters
params = EvolutionParameters(
    population_size=50,
    generations=30,
    mutation_rate=0.2,
    crossover_rate=0.85,
    selection_method="rank",
    diversity_pressure=0.3,
    parallel_evaluation=True
)

# Validate parameters
errors = params.validate_parameters()
if errors:
    print(f"Parameter errors: {errors}")

# Optimize for dataset
params.optimize_for_dataset(
    dataset_size=1000,
    available_memory="8GB",
    time_budget=3600  # 1 hour
)

# Use parameters with evolver
evolver = GeneticEvolver(**params.to_dict())

Fitness Functions

Built-in Fitness Functions

class FitnessFunctions:
    """Collection of built-in fitness functions."""

    @staticmethod
    def content_quality(meme: Meme) -> float:
        """Evaluate content quality and coherence."""

    @staticmethod
    def semantic_richness(meme: Meme) -> float:
        """Evaluate semantic richness and complexity."""

    @staticmethod
    def novelty_fitness(meme: Meme, population: List[Meme]) -> float:
        """Evaluate novelty relative to population."""

    @staticmethod
    def diversity_fitness(meme: Meme, population: List[Meme]) -> float:
        """Promote population diversity."""

    @staticmethod
    def domain_relevance(meme: Meme, domain_keywords: List[str]) -> float:
        """Evaluate relevance to specific domain."""

    @staticmethod
    def multi_objective_fitness(
        meme: Meme,
        objectives: List[Callable],
        weights: List[float]
    ) -> float:
        """Weighted combination of multiple objectives."""

Custom Fitness Functions

def create_custom_fitness(
    weights: Dict[str, float],
    constraints: Optional[Dict[str, Any]] = None
) -> Callable[[Meme], float]:
    """
    Create custom fitness function with specified weights.

    Args:
        weights: Weights for different fitness components
        constraints: Optional constraints to enforce

    Returns:
        Callable: Custom fitness function
    """

def adaptive_fitness(
    base_fitness: Callable,
    adaptation_rate: float = 0.1
) -> Callable[[Meme, int], float]:
    """
    Create adaptive fitness function that changes over generations.

    Args:
        base_fitness: Base fitness function
        adaptation_rate: Rate of fitness adaptation

    Returns:
        Callable: Adaptive fitness function
    """

Example:

# Built-in fitness functions
content_fitness = FitnessFunctions.content_quality(meme)
novelty_fitness = FitnessFunctions.novelty_fitness(meme, population)

# Custom weighted fitness
custom_fitness = create_custom_fitness(
    weights={
        "quality": 0.4,
        "novelty": 0.3,
        "relevance": 0.2,
        "complexity": 0.1
    },
    constraints={
        "min_length": 10,
        "max_length": 500,
        "required_keywords": ["AI", "research"]
    }
)

# Use custom fitness
evolver.fitness_function = custom_fitness
result = evolver.evolve(initial_memes, generations=15)

Evolution Monitoring

EvolutionTracker Class

class EvolutionTracker:
    """Track and analyze evolution progress."""

    def __init__(self):
        self.generation_history = []
        self.fitness_history = []
        self.diversity_history = []
        self.operator_statistics = {}

    def record_generation(
        self,
        generation: int,
        population: List[Meme],
        fitness_stats: Dict[str, float],
        diversity_metrics: Dict[str, float]
    ) -> None:
        """Record generation statistics."""

    def analyze_convergence(self) -> Dict[str, Any]:
        """Analyze convergence patterns."""

    def plot_evolution_progress(self) -> Any:
        """Create evolution progress plots."""

    def export_statistics(self, file_path: str) -> None:
        """Export evolution statistics to file."""

Real-time Monitoring

def monitor_evolution(
    evolver: GeneticEvolver,
    callback_frequency: int = 1
) -> EvolutionMonitor:
    """
    Set up real-time evolution monitoring.

    Args:
        evolver: Evolver to monitor
        callback_frequency: Callback every N generations

    Returns:
        EvolutionMonitor: Monitoring interface
    """

class EvolutionMonitor:
    """Real-time evolution monitoring interface."""

    def on_generation_complete(
        self,
        generation: int,
        population: List[Meme],
        statistics: Dict[str, Any]
    ) -> None:
        """Called when generation completes."""

    def on_evolution_complete(
        self,
        result: EvolutionResult
    ) -> None:
        """Called when evolution completes."""

    def get_live_statistics(self) -> Dict[str, Any]:
        """Get current evolution statistics."""

Example:

# Set up evolution tracking
tracker = EvolutionTracker()
monitor = monitor_evolution(evolver, callback_frequency=2)

# Custom monitoring callback
def custom_callback(gen, pop, stats):
    print(f"Generation {gen}: Best fitness = {stats['best_fitness']:.3f}")
    if stats['diversity'] < 0.1:
        print("Warning: Population diversity low!")

monitor.on_generation_complete = custom_callback

# Run monitored evolution
result = evolver.evolve(initial_memes, generations=20)

# Analyze results
convergence_analysis = tracker.analyze_convergence()
evolution_plot = tracker.plot_evolution_progress()

Specialized Evolution Algorithms

Island Model Evolution

class IslandEvolution:
    """Island model for parallel evolution."""

    def __init__(
        self,
        num_islands: int = 4,
        migration_rate: float = 0.1,
        migration_interval: int = 5,
        topology: str = "ring"
    ):
        self.num_islands = num_islands
        self.migration_rate = migration_rate
        self.migration_interval = migration_interval
        self.topology = topology

    def evolve_islands(
        self,
        initial_populations: List[List[Meme]],
        generations: int = 10
    ) -> List[List[Meme]]:
        """
        Evolve multiple islands in parallel.

        Args:
            initial_populations: Starting populations for each island
            generations: Number of generations

        Returns:
            List[List[Meme]]: Final populations from all islands
        """

    def migrate_individuals(
        self,
        populations: List[List[Meme]],
        generation: int
    ) -> List[List[Meme]]:
        """Handle migration between islands."""

Memetic Algorithms

class MemeticAlgorithm(GeneticEvolver):
    """Memetic algorithm combining evolution with local search."""

    def __init__(
        self,
        local_search_method: str = "hill_climbing",
        local_search_probability: float = 0.5,
        local_search_iterations: int = 10,
        **kwargs
    ):
        super().__init__(**kwargs)
        self.local_search_method = local_search_method
        self.local_search_probability = local_search_probability
        self.local_search_iterations = local_search_iterations

    def local_search(
        self,
        meme: Meme,
        iterations: int
    ) -> Meme:
        """
        Apply local search to improve meme.

        Args:
            meme: Meme to improve
            iterations: Number of local search steps

        Returns:
            Meme: Improved meme
        """

    def evolve_with_local_search(
        self,
        initial_population: List[Meme],
        generations: int = 5
    ) -> EvolutionResult:
        """Evolve with integrated local search."""

Example:

# Island model evolution
island_evolution = IslandEvolution(
    num_islands=6,
    migration_rate=0.15,
    migration_interval=3
)

# Create island populations
island_pops = [
    [engine.create_meme(f"Island {i} idea {j}") for j in range(10)]
    for i in range(6)
]

# Evolve islands
final_islands = island_evolution.evolve_islands(
    initial_populations=island_pops,
    generations=15
)

# Memetic algorithm
memetic = MemeticAlgorithm(
    population_size=20,
    local_search_method="simulated_annealing",
    local_search_probability=0.7
)

memetic_result = memetic.evolve_with_local_search(
    initial_population=initial_memes,
    generations=10
)

Performance Optimization

Parallel Evolution

class ParallelEvolver(GeneticEvolver):
    """Parallel implementation of genetic evolution."""

    def __init__(
        self,
        num_workers: int = 4,
        evaluation_batch_size: int = 20,
        **kwargs
    ):
        super().__init__(**kwargs)
        self.num_workers = num_workers
        self.evaluation_batch_size = evaluation_batch_size

    def parallel_fitness_evaluation(
        self,
        population: List[Meme]
    ) -> List[float]:
        """Evaluate fitness in parallel."""

    def parallel_genetic_operations(
        self,
        population: List[Meme],
        num_offspring: int
    ) -> List[Meme]:
        """Perform genetic operations in parallel."""

Memory-Efficient Evolution

class MemoryEfficientEvolver(GeneticEvolver):
    """Memory-efficient evolution for large populations."""

    def __init__(
        self,
        checkpoint_frequency: int = 10,
        disk_cache_size: str = "1GB",
        **kwargs
    ):
        super().__init__(**kwargs)
        self.checkpoint_frequency = checkpoint_frequency
        self.disk_cache_size = disk_cache_size

    def streaming_evolution(
        self,
        meme_generator: Iterator[Meme],
        generations: int = 5
    ) -> EvolutionResult:
        """Evolve using streaming meme generation."""

    def checkpoint_evolution(
        self,
        checkpoint_path: str,
        generation: int,
        population: List[Meme]
    ) -> None:
        """Save evolution checkpoint."""

Example:

# Parallel evolution
parallel_evolver = ParallelEvolver(
    num_workers=8,
    evaluation_batch_size=50,
    population_size=200
)

parallel_result = parallel_evolver.evolve(
    initial_population=large_population,
    generations=30
)

# Memory-efficient evolution
memory_evolver = MemoryEfficientEvolver(
    checkpoint_frequency=5,
    disk_cache_size="2GB"
)

# Stream large datasets
def meme_stream():
    for i in range(10000):
        yield engine.create_meme(f"Streaming meme {i}")

streaming_result = memory_evolver.streaming_evolution(
    meme_generator=meme_stream(),
    generations=20
)

Integration Examples

With Entanglement Networks

# Evolution-guided entanglement
evolved_memes = evolver.evolve(initial_memes, generations=10)
network = entangler.create_network(evolved_memes)

# Use network properties for fitness
def network_fitness(meme):
    degree = network.get_degree(meme)
    centrality = network.get_centrality(meme)
    clustering = network.get_local_clustering(meme)

    return 0.4 * degree + 0.3 * centrality + 0.3 * clustering

# Evolve with network-based fitness
network_evolved = evolver.evolve(
    evolved_memes,
    fitness_function=network_fitness,
    generations=5
)

With Cognitive Models

# Cognitive-driven evolution
from qmemetic_ai.cognitive.models import CognitiveFingerprint

user_profile = CognitiveFingerprint(
    user_id="researcher_001",
    preferences={"complexity": 0.8, "novelty": 0.7}
)

def personalized_fitness(meme):
    base_fitness = meme.calculate_fitness()
    user_fit = user_profile.calculate_fit_score(meme)
    return 0.6 * base_fitness + 0.4 * user_fit

# Personalized evolution
personalized_result = evolver.evolve(
    initial_memes,
    fitness_function=personalized_fitness,
    generations=15
)

For complete integration examples, see the Engine API and Entanglement API documentation.