Source code for niapy.algorithms.modified.hde

# encoding=utf8
import logging

import numpy as np

from niapy.algorithms.algorithm import Individual
from niapy.algorithms.basic.de import MultiStrategyDifferentialEvolution, DynNpDifferentialEvolution, DifferentialEvolution
from niapy.algorithms.other.mts import mts_ls1v1, mts_ls2, mts_ls3v1, MultipleTrajectorySearch

logging.basicConfig()
logger = logging.getLogger('niapy.algorithms.modified')
logger.setLevel('INFO')

__all__ = ['DifferentialEvolutionMTS', 'DifferentialEvolutionMTSv1', 'DynNpDifferentialEvolutionMTS',
           'DynNpDifferentialEvolutionMTSv1', 'MultiStrategyDifferentialEvolutionMTS',
           'MultiStrategyDifferentialEvolutionMTSv1', 'DynNpMultiStrategyDifferentialEvolutionMTS',
           'DynNpMultiStrategyDifferentialEvolutionMTSv1']


class MtsIndividual(Individual):
    r"""Individual for MTS local searches.

    Attributes:
        search_range (numpy.ndarray): Search range.
        grade (int): Grade of individual.
        enable (bool): If enabled.
        improved (bool): If improved.

    See Also:
        :class:`niapy.algorithms.algorithm.Individual`

    """

    def __init__(self, search_range=None, grade=0, enable=True, improved=False, task=None, **kwargs):
        r"""Initialize the individual.

        Args:
            search_range (numpy.ndarray): Search range.
            grade (Optional[int]): Grade of individual.
            enable (Optional[bool]): If enabled individual.
            improved (Optional[bool]): If individual improved.

        See Also:
            :func:`niapy.algorithms.algorithm.Individual.__init__`

        """
        super().__init__(task=task, **kwargs)
        self.grade, self.enable, self.improved = grade, enable, improved
        if search_range is None and task is not None:
            self.search_range = task.range / 4
        else:
            self.search_range = search_range


[docs]class DifferentialEvolutionMTS(DifferentialEvolution, MultipleTrajectorySearch): r"""Implementation of Differential Evolution with MTS local searches. Algorithm: Differential Evolution with MTS local searches Date: 2018 Author: Klemen Berkovič License: MIT Attributes: Name (List[str]): List of strings representing algorithm names. See Also: * :class:`niapy.algorithms.basic.de.DifferentialEvolution` * :class:`niapy.algorithms.other.mts.MultipleTrajectorySearch` """ Name = ['DifferentialEvolutionMTS', 'DEMTS']
[docs] @staticmethod def info(): r"""Get basic information about the algorithm. Returns: str: Basic information. See Also: * :func:`niapy.algorithms.Algorithm.info` """ return r"""TODO"""
[docs] def __init__(self, population_size=40, *args, **kwargs): """Initialize DifferentialEvolutionMTS.""" super().__init__(population_size, individual_type=kwargs.pop('individual_type', MtsIndividual), *args, **kwargs)
[docs] def set_parameters(self, **kwargs): r"""Set the algorithm parameters. See Also: :func:`niapy.algorithms.basic.de.DifferentialEvolution.set_parameters` """ MultipleTrajectorySearch.set_parameters(self, **kwargs) DifferentialEvolution.set_parameters(self, individual_type=kwargs.pop('individual_type', MtsIndividual), **kwargs)
[docs] def get_parameters(self): """Get algorithm parameters.""" d = DifferentialEvolution.get_parameters(self) d.update(MultipleTrajectorySearch.get_parameters(self)) return d
[docs] def post_selection(self, population, task, xb, fxb, **kwargs): r"""Post selection operator. Args: population (numpy.ndarray): Current population. task (Task): Optimization task. xb (numpy.ndarray): Global best individual. fxb (float): Global best fitness. Returns: Tuple[numpy.ndarray, numpy.ndarray, float]: New population. """ for x in population: if not x.enable: continue x.enable, x.grades = False, 0 x.x, x.f, xb, fxb, k = self.grading_run(x.x, x.f, xb, fxb, x.improved, x.search_range, task) x.x, x.f, xb, fxb, x.improved, x.search_range, x.grades = self.run_local_search(k, x.x, x.f, xb, fxb, x.improved, x.search_range, 0, task) for i in population[np.argsort([x.grade for x in population])[:self.num_enabled:]]: i.enable = True return population, xb, fxb
[docs]class DifferentialEvolutionMTSv1(DifferentialEvolutionMTS): r"""Implementation of Differential Evolution with MTSv1 local searches. Algorithm: Differential Evolution with MTSv1 local searches Date: 2018 Author: Klemen Berkovič License: MIT Attributes: Name (List[str]): List of strings representing algorithm name. See Also: :class:`niapy.algorithms.modified.DifferentialEvolutionMTS` """ Name = ['DifferentialEvolutionMTSv1', 'DEMTSv1']
[docs] @staticmethod def info(): r"""Get basic information about the algorithm. Returns: str: Basic information. See Also: * :func:`niapy.algorithms.Algorithm.info` """ return r"""TODO"""
[docs] def __init__(self, *args, **kwargs): """Initialize DifferentialEvolutionMTSv1.""" super().__init__(local_searches=(mts_ls1v1, mts_ls2, mts_ls3v1), *args, **kwargs)
[docs] def set_parameters(self, **kwargs): r"""Set core parameters of DifferentialEvolutionMTSv1 algorithm. See Also: :func:`niapy.algorithms.modified.DifferentialEvolutionMTS.set_parameters` """ super().set_parameters(local_searches=(mts_ls1v1, mts_ls2, mts_ls3v1), **kwargs)
[docs]class DynNpDifferentialEvolutionMTS(DifferentialEvolutionMTS, DynNpDifferentialEvolution): r"""Implementation of Differential Evolution with MTS local searches dynamic and population size. Algorithm: Differential Evolution with MTS local searches and dynamic population size Date: 2018 Author: Klemen Berkovič License: MIT Attributes: Name (List[str]): List of strings representing algorithm name See Also: * :class:`niapy.algorithms.modified.DifferentialEvolutionMTS` * :class:`niapy.algorithms.basic.de.DynNpDifferentialEvolution` """ Name = ['DynNpDifferentialEvolutionMTS', 'dynNpDEMTS']
[docs] @staticmethod def info(): r"""Get basic information about the algorithm. Returns: str: Basic information. See Also: * :func:`niapy.algorithms.Algorithm.info` """ return r"""TODO"""
[docs] def __init__(self, *args, **kwargs): """Initialize DynNpDifferentialEvolutionMTS.""" super().__init__(*args, **kwargs)
[docs] def set_parameters(self, p_max=10, rp=3, **kwargs): r"""Set core parameters or DynNpDifferentialEvolutionMTS algorithm. Args: p_max (Optional[int]): rp (Optional[float]): See Also: * :func:`niapy.algorithms.modified.hde.DifferentialEvolutionMTS.set_parameters` * :func`niapy.algorithms.basic.de.DynNpDifferentialEvolution.set_parameters` """ DynNpDifferentialEvolution.set_parameters(self, p_max=p_max, rp=rp, **kwargs) DifferentialEvolutionMTS.set_parameters(self, **kwargs)
[docs] def get_parameters(self): r"""Get parameters of the algorithm. Returns: Dict[str, Any]: Algorithm parameters. """ params = DynNpDifferentialEvolution.get_parameters(self) params.update(DifferentialEvolutionMTS.get_parameters(self)) return params
[docs] def post_selection(self, population, task, xb, fxb, **kwargs): new_x, xb, fxb = DynNpDifferentialEvolution.post_selection(self, population, task, xb, fxb) new_x, xb, fxb = DifferentialEvolutionMTS.post_selection(self, new_x, task, xb, fxb) return new_x, xb, fxb
[docs]class DynNpDifferentialEvolutionMTSv1(DynNpDifferentialEvolutionMTS): r"""Implementation of Differential Evolution with MTSv1 local searches and dynamic population size. Algorithm: Differential Evolution with MTSv1 local searches and dynamic population size Date: 2018 Author: Klemen Berkovič License: MIT Attributes: Name (List[str]): List of strings representing algorithm name. See Also: :class:`niapy.algorithms.modified.hde.DifferentialEvolutionMTS` """ Name = ['DynNpDifferentialEvolutionMTSv1', 'dynNpDEMTSv1']
[docs] @staticmethod def info(): r"""Get basic information about the algorithm. Returns: str: Basic information. See Also: * :func:`niapy.algorithms.Algorithm.info` """ return r"""TODO"""
[docs] def __init__(self, *args, **kwargs): """Initialize DynNpDifferentialEvolutionMTSv1.""" super().__init__(local_searches=(mts_ls1v1, mts_ls2, mts_ls3v1), *args, **kwargs)
[docs] def set_parameters(self, **kwargs): r"""Set core arguments of DynNpDifferentialEvolutionMTSv1 algorithm. See Also: :func:`niapy.algorithms.modified.hde.DifferentialEvolutionMTS.set_parameters` """ DynNpDifferentialEvolutionMTS.set_parameters(self, local_searches=(mts_ls1v1, mts_ls2, mts_ls3v1), **kwargs)
[docs]class MultiStrategyDifferentialEvolutionMTS(DifferentialEvolutionMTS, MultiStrategyDifferentialEvolution): r"""Implementation of Differential Evolution with MTS local searches and multiple mutation strategies. Algorithm: Differential Evolution with MTS local searches and multiple mutation strategies Date: 2018 Author: Klemen Berkovič License: MIT Attributes: Name (List[str]): List of strings representing algorithm name. See Also: * :class:`niapy.algorithms.modified.hde.DifferentialEvolutionMTS` * :class:`niapy.algorithms.basic.de.MultiStrategyDifferentialEvolution` """ Name = ['MultiStrategyDifferentialEvolutionMTS', 'MSDEMTS']
[docs] @staticmethod def info(): r"""Get basic information about the algorithm. Returns: str: Basic information. See Also: * :func:`niapy.algorithms.Algorithm.info` """ return r"""TODO"""
[docs] def __init__(self, *args, **kwargs): """Initialize MultiStrategyDifferentialEvolutionMTS.""" super().__init__(individual_type=kwargs.pop('individual_type', MtsIndividual), *args, **kwargs)
[docs] def set_parameters(self, **kwargs): r"""Set algorithm parameters. See Also: * :func:`niapy.algorithms.modified.DifferentialEvolutionMTS.set_parameters` * :func:`niapy.algorithms.basic.MultiStrategyDifferentialEvolution.set_parameters` """ DifferentialEvolutionMTS.set_parameters(self, **kwargs) MultiStrategyDifferentialEvolution.set_parameters(self, individual_type=kwargs.pop('individual_type', MtsIndividual), **kwargs)
[docs] def get_parameters(self): r"""Get parameters of the algorithm. Returns: Dict[str, Any]: Algorithm parameters. """ params = DifferentialEvolutionMTS.get_parameters(self) params.update(MultiStrategyDifferentialEvolution.get_parameters(self)) return params
[docs] def evolve(self, pop, xb, task, **kwargs): r"""Evolve population. Args: pop (numpy.ndarray[Individual]): Current population of individuals. xb (numpy.ndarray): Global best individual. task (Task): Optimization task. Returns: numpy.ndarray[Individual]: Evolved population. """ return MultiStrategyDifferentialEvolution.evolve(self, pop, xb, task, **kwargs)
[docs]class MultiStrategyDifferentialEvolutionMTSv1(MultiStrategyDifferentialEvolutionMTS): r"""Implementation of Differential Evolution with MTSv1 local searches and multiple mutation strategies. Algorithm: Differential Evolution with MTSv1 local searches and multiple mutation strategies Date: 2018 Author: Klemen Berkovič License: MIT Attributes: Name (List[str]): List of stings representing algorithm name. See Also: * :class:`niapy.algorithms.modified.MultiStrategyDifferentialEvolutionMTS` """ Name = ['MultiStrategyDifferentialEvolutionMTSv1', 'MSDEMTSv1']
[docs] @staticmethod def info(): r"""Get basic information about the algorithm. Returns: str: Basic information. See Also: * :func:`niapy.algorithms.Algorithm.info` """ return r"""TODO"""
[docs] def __init__(self, *args, **kwargs): """Initialize MultiStrategyDifferentialEvolutionMTSv1.""" super().__init__(local_searches=(mts_ls1v1, mts_ls2, mts_ls3v1), *args, **kwargs)
[docs] def set_parameters(self, **kwargs): r"""Set core parameters of MultiStrategyDifferentialEvolutionMTSv1 algorithm. See Also: * :func:`niapy.algorithms.modified.MultiStrategyDifferentialEvolutionMTS.set_parameters` """ MultiStrategyDifferentialEvolutionMTS.set_parameters(self, local_searches=(mts_ls1v1, mts_ls2, mts_ls3v1), **kwargs)
[docs]class DynNpMultiStrategyDifferentialEvolutionMTS(MultiStrategyDifferentialEvolutionMTS, DynNpDifferentialEvolutionMTS): r"""Implementation of Differential Evolution with MTS local searches, multiple mutation strategies and dynamic population size. Algorithm: Differential Evolution with MTS local searches, multiple mutation strategies and dynamic population size Date: 2018 Author: Klemen Berkovič License: MIT Attributes: Name (List[str]): List of strings representing algorithm name See Also: * :class:`niapy.algorithms.modified.MultiStrategyDifferentialEvolutionMTS` * :class:`niapy.algorithms.modified.DynNpDifferentialEvolutionMTS` """ Name = ['DynNpMultiStrategyDifferentialEvolutionMTS', 'dynNpMSDEMTS']
[docs] @staticmethod def info(): r"""Get basic information about the algorithm. Returns: str: Basic information. See Also: * :func:`niapy.algorithms.Algorithm.info` """ return r"""TODO"""
[docs] def __init__(self, *args, **kwargs): """Initialize DynNpMultiStrategyDifferentialEvolutionMTS.""" super().__init__(*args, **kwargs)
[docs] def set_parameters(self, **kwargs): r"""Set core arguments of DynNpMultiStrategyDifferentialEvolutionMTS algorithm. See Also: * :func:`niapy.algorithms.modified.MultiStrategyDifferentialEvolutionMTS.set_parameters` * :func:`niapy.algorithms.modified.DynNpDifferentialEvolutionMTS.set_parameters` """ DynNpDifferentialEvolutionMTS.set_parameters(self, **kwargs) MultiStrategyDifferentialEvolutionMTS.set_parameters(self, **kwargs)
[docs] def get_parameters(self): r"""Get parameters of the algorithm. Returns: Dict[str, Any]: Algorithm parameters. """ params = DynNpDifferentialEvolutionMTS.get_parameters(self) params.update(MultiStrategyDifferentialEvolutionMTS.get_parameters(self)) return params
[docs]class DynNpMultiStrategyDifferentialEvolutionMTSv1(DynNpMultiStrategyDifferentialEvolutionMTS): r"""Implementation of Differential Evolution with MTSv1 local searches, multiple mutation strategies and dynamic population size. Algorithm: Differential Evolution with MTSv1 local searches, multiple mutation strategies and dynamic population size Date: 2018 Author: Klemen Berkovič License: MIT Attributes: Name (List[str]): List of strings representing algorithm name. See Also: * :class:`niapy.algorithm.modified.DynNpMultiStrategyDifferentialEvolutionMTS` """ Name = ['DynNpMultiStrategyDifferentialEvolutionMTSv1', 'dynNpMSDEMTSv1']
[docs] @staticmethod def info(): r"""Get basic information about the algorithm. Returns: str: Basic information. See Also: * :func:`niapy.algorithms.Algorithm.info` """ return r"""TODO"""
[docs] def __init__(self, *args, **kwargs): """Initialize DynNpMultiStrategyDifferentialEvolutionMTSv1.""" super().__init__(local_searches=(mts_ls1v1, mts_ls2, mts_ls3v1), *args, **kwargs)
[docs] def set_parameters(self, **kwargs): r"""Set core parameters of DynNpMultiStrategyDifferentialEvolutionMTSv1 algorithm. See Also: * :func:`niapy.algorithm.modified.DynNpMultiStrategyDifferentialEvolutionMTS.set_parameters` """ DynNpMultiStrategyDifferentialEvolutionMTS.set_parameters(self, local_searches=(mts_ls1v1, mts_ls2, mts_ls3v1), **kwargs)