Source code for brkga_mp_ipr.enums

###############################################################################
# enums.py: Definitions of useful enumerations.
#
# (c) Copyright 2019, Carlos Eduardo de Andrade. All Rights Reserved.
#
# This code is released under LICENSE.md.
#
# Created on:  Nov 05, 2019 by ceandrade
# Last update: Nov 09, 2019 by ceandrade
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###############################################################################

from enum import Enum, Flag, unique

###############################################################################
# Enumerations
###############################################################################

[docs]class ParsingEnum(Enum): """ Implements a base Enum class that returns an Enum object from a string (case insensitive). """ @classmethod def _missing_(cls, name): """ When the constructor cannot find the attribute, it calls this function. Then, we check if the string of the given name/object is in the attribute list of the Enum. If so, we return the attribute. """ for member in cls: if member.name.upper() == str(name).upper(): return member return None def __str__(self): """ Just return the name instead of <name, value>. """ return self.name
###############################################################################
[docs]@unique class Sense(ParsingEnum): """ Tells the algorithm either to ``MINIMIZE`` or ``MAXIMIZE`` the objective function. """ MINIMIZE = 0 MAXIMIZE = 1
###############################################################################
[docs]@unique class BiasFunctionType(ParsingEnum): r""" Specifies a bias function when choosing parents to mating. This function substitutes the :math:`\rho` (rho) parameter from the original BRKGA. For a given rank :math:`r`, we have the following functions: - ``CONSTANT``: 1 / number of parents for mating (all individuals have the same probability) - ``CUBIC``: :math:`r^{-3}` - ``EXPONENTIAL``: :math:`\epsilon^{-r}` - ``LINEAR``: :math:`1 / r` - ``LOGINVERSE``: :math:`1 / \log(r + 1)` - ``QUADRATIC``: :math:`r^{-2}` """ CONSTANT = 0 CUBIC = 1 EXPONENTIAL = 2 LINEAR = 3 LOGINVERSE = 4 QUADRATIC = 5 CUSTOM = 6
###############################################################################
[docs]@unique class PathRelinkingType(ParsingEnum): """ Specifies type of path relinking: - ``DIRECT``: changes each key for the correspondent in the other chromosome. - ``PERMUTATION``: switches the order of a key for that in the other chromosome. """ DIRECT = 0 PERMUTATION = 1
###############################################################################
[docs]@unique class PathRelinkingSelection(ParsingEnum): """ Specifies which individuals used to build the path: - ``BESTSOLUTION``: selects, in the order, the best solution of each population. - ``RANDOMELITE``: chooses uniformly random solutions from the elite sets. """ BESTSOLUTION = 0 RANDOMELITE = 1
###############################################################################
[docs]@unique class PathRelinkingResult(Flag): """ Specifies the result type/status of path relink procedure: - ``TOO_HOMOGENEOUS``: the chromosomes among the populations are too homogeneous and the path relink will not generate improveded solutions. - ``NO_IMPROVEMENT``: path relink was done but no improveded solution was found. - ``ELITE_IMPROVEMENT``: an improved solution among the elite set was found, but the best solution was not improved. - ``BEST_IMPROVEMENT``: the best solution was improved. """ TOO_HOMOGENEOUS = 0 NO_IMPROVEMENT = 1 ELITE_IMPROVEMENT = 3 BEST_IMPROVEMENT = 7
################################################################################
[docs]@unique class ShakingType(ParsingEnum): """ Specifies the type of shaking to be performed. - ``CHANGE``: applies the following perturbations: 1) Inverts the value of a random chosen, i.e., from :math:`value` to :math:`1 - value`; 2) Assigns a random value to a random key. - ``SWAP``: applies two swap perturbations: 1) Swaps the values of a randomly chosen key :math:`i` and its neighbor :math:`i + 1`; 2) Swaps values of two randomly chosen keys. """ CHANGE = 0 SWAP = 1