Source code for metaheuristic_designer.strategies.eda_strategy
"""
Strategy that generates solutions from a model.
"""
from __future__ import annotations
from abc import abstractmethod
from typing import Optional
from ..population import Population
from ..objective_function import ObjectiveFunc
from ..initializer import Initializer
from ..parent_selection_base import ParentSelection
from ..survivor_selection_base import SurvivorSelection
from ..search_strategy import SearchStrategy
from ..operator import Operator
from ..utils import RNGLike
[docs]
class EDAStrategy(SearchStrategy):
"""
Population-based strategy with constant size and no parent selection.
The entire population is perturbed each generation. By default,
parent selection is the identity (all individuals are used) and
survivor selection is generational (offspring replace parents).
Parameters
----------
initializer : Initializer
Population initializer.
operator : Operator
Perturbation operator.
parent_sel : ParentSelection, optional
Parent selection; defaults to identity (keep all).
survivor_sel : SurvivorSelection, optional
Survivor selection; defaults to generational replacement.
name : str, optional
Display name (default ``"Static Population Evolution"``).
rng : RNGLike, optional
Random number generator.
\\*\\*kwargs
Forwarded to :class:`SearchStrategy`.
"""
def __init__(
self,
initializer: Initializer,
operator: Operator,
parent_sel: Optional[ParentSelection] = None,
survivor_sel: Optional[SurvivorSelection] = None,
name: str = "Static Population Evolution",
rng: Optional[RNGLike] = None,
**kwargs,
):
self.sampler = initializer
super().__init__(
initializer=initializer,
operator=operator,
parent_sel=parent_sel,
survivor_sel=survivor_sel,
name=name,
rng=rng,
**kwargs,
)
[docs]
@abstractmethod
def estimate_parameters(self, population: Population) -> Operator:
"""Utilizes the samples present in the input population to
estimate the parameters used by the operator.
Parameters
----------
population : Population
Data to use for estimating parameters.
Returns
-------
Operator
Newly configured operator.
"""
[docs]
def step(self, prev_population: Population, objfunc: ObjectiveFunc) -> Population:
population = self.parent_sel.select(prev_population)
self.operator = self.estimate_parameters(population)
population = self.operator.evolve(population)
population = objfunc.repair_population(population)
population = objfunc.calculate_fitness(population)
population = self.survivor_sel.select(population=prev_population, offspring=population)
return population