Source code for metaheuristic_designer.strategies.local_search
"""
Local Search strategy (single solution, multiple perturbations per iteration).
"""
from __future__ import annotations
from typing import Optional
from ..initializer import Initializer
from ..search_strategy import SearchStrategy
from ..operator import Operator
from ..population import Population
from ..survivor_selection_base import SurvivorSelection
from ..survivor_selection import create_survivor_selection
from ..utils import RNGLike
[docs]
class LocalSearch(SearchStrategy):
"""
Local Search algorithm.
At each iteration the current solution is duplicated *iterations*
times, and every copy is perturbed independently. The best
among the original and the perturbed copies survives. By default,
the survivor selection is set to ``"local_search"`` (one parent
vs. many offspring).
Parameters
----------
initializer : Initializer
Population initializer.
operator : Operator, optional
Perturbation operator.
survivor_sel : SurvivorSelection, optional
Survivor selection; defaults to ``"local_search"``.
name : str, optional
Display name (default ``"LocalSearch"``).
iterations : int, optional
Number of perturbed copies per iteration (default 100).
random_state : RNGLike, optional
Random number generator.
**kwargs
Forwarded to :class:`SearchStrategy`.
"""
def __init__(
self,
initializer: Initializer,
operator: Optional[Operator] = None,
survivor_sel: Optional[SurvivorSelection] = None,
name: str = "LocalSearch",
iterations: int = 100,
random_state: Optional[RNGLike] = None,
**kwargs,
):
if survivor_sel is None:
survivor_sel = create_survivor_selection("local_search")
super().__init__(
initializer,
operator=operator,
survivor_sel=survivor_sel,
name=name,
random_state=random_state,
# Forced kwargs
iterations=iterations,
**kwargs,
)
[docs]
def perturb(self, parents: Population, **kwargs) -> Population:
"""Duplicate the parent *iterations* times, then apply the operator.
Parameters
----------
parents : Population
The current solution(s).
**kwargs
Forwarded to :class:`SearchStrategy.perturb`.
Returns
-------
Population
The perturbed copies.
"""
new_population = parents.repeat(self.params.iterations)
return super().perturb(new_population, **kwargs)