eckity.genetic_operators.mutations.vector_n_point_mutation

  1import random
  2
  3from eckity.genetic_operators.failable_operator import FailableOperator
  4from eckity.genetic_encodings.ga.vector_individual import Vector
  5
  6from typing import List, Tuple, Union
  7
  8
  9class VectorNPointMutation(FailableOperator):
 10    """
 11    Vector N Point Mutation.
 12
 13    Randomly chooses N vector cells and performs a small change in their values.
 14
 15    Parameters
 16    ----------
 17    n : int
 18        Number of mutation points.
 19
 20    probability : float
 21        The probability of the mutation operator to be applied
 22
 23    arity : int
 24        The number of individuals this mutation is applied on
 25
 26    cell_selector: callable
 27        Returns the indices of the cells to mutate
 28
 29    mut_val_getter: callable
 30        Returns a mutated value of a certain cell
 31
 32    success_checker: callable
 33        Checks if a given (mutated) cell value is legal
 34
 35    events: list of strings
 36        Events to publish before/after the mutation operator
 37    """
 38    def __init__(self,
 39                 n=1,
 40                 probability=1.0,
 41                 arity=1,
 42                 cell_selector=None,
 43                 mut_val_getter=None,
 44                 success_checker=None,
 45                 events=None,
 46                 attempts=5):
 47        super().__init__(probability=probability, arity=arity, events=events, attempts=attempts)
 48        self.n = n
 49
 50        if cell_selector is None:
 51            cell_selector = self.default_cell_selector
 52        self.cell_selector = cell_selector
 53
 54        if success_checker is None:
 55            success_checker = self.default_success_checker
 56        self.success_checker = success_checker
 57
 58        if mut_val_getter is None:
 59            mut_val_getter = self.default_mut_val_getter
 60        self.mut_val_getter = mut_val_getter
 61
 62    @staticmethod
 63    def default_mut_val_getter(vec: Vector, idx: int) -> Union[int, float]:
 64        return vec.get_random_number_in_bounds(vec, idx)
 65
 66    @staticmethod
 67    def default_success_checker(old_vec: Vector, new_vec: Vector) -> bool:
 68        return new_vec.check_if_in_bounds()
 69    
 70    def default_cell_selector(self, vec: Vector) -> List[int]:
 71        vector_indices = range(vec.size())
 72        return random.sample(vector_indices, k=self.n)
 73
 74    def attempt_operator(self, individuals: List[Vector], attempt_num) -> Tuple[bool, List[Vector]]:
 75        """
 76        Attempt to perform the mutation operator
 77
 78        Parameters
 79        ----------
 80        individuals : list of vectors
 81            vectors to mutate
 82
 83        attempt_num : int
 84            Current attempt number
 85
 86        Returns
 87        ----------
 88        tuple of (bool, list of vectors)
 89            first return value determines if the the attempt succeeded
 90            second return value is the operator result
 91        """
 92        succeeded = True
 93        for individual in individuals:
 94            old_individual = individual.clone()
 95
 96            # randomly select n points of the vector (without repetitions)
 97            m_points = self.cell_selector(individual)
 98            # obtain the mutated values
 99            mut_vals = [self.mut_val_getter(individual, m_point) for m_point in m_points]
100
101            # update the mutated value in-place
102            for m_point, mut_val in zip(m_points, mut_vals):
103                individual.set_cell_value(m_point, mut_val)
104
105            if not self.success_checker(old_individual, individual):
106                succeeded = False
107                individual.set_vector(old_individual.vector)
108                break
109
110        self.applied_individuals = individuals
111        return succeeded, individuals
112
113    def on_fail(self, payload):
114        """
115        The required fix when the operator fails, does nothing by default and can be overridden by subclasses
116
117        Parameters
118        ----------
119        payload : object
120            relevant data for on_fail (usually the individuals that the mutation was attempted to be applied on)
121        """
122        pass
class VectorNPointMutation(eckity.genetic_operators.failable_operator.FailableOperator):
 10class VectorNPointMutation(FailableOperator):
 11    """
 12    Vector N Point Mutation.
 13
 14    Randomly chooses N vector cells and performs a small change in their values.
 15
 16    Parameters
 17    ----------
 18    n : int
 19        Number of mutation points.
 20
 21    probability : float
 22        The probability of the mutation operator to be applied
 23
 24    arity : int
 25        The number of individuals this mutation is applied on
 26
 27    cell_selector: callable
 28        Returns the indices of the cells to mutate
 29
 30    mut_val_getter: callable
 31        Returns a mutated value of a certain cell
 32
 33    success_checker: callable
 34        Checks if a given (mutated) cell value is legal
 35
 36    events: list of strings
 37        Events to publish before/after the mutation operator
 38    """
 39    def __init__(self,
 40                 n=1,
 41                 probability=1.0,
 42                 arity=1,
 43                 cell_selector=None,
 44                 mut_val_getter=None,
 45                 success_checker=None,
 46                 events=None,
 47                 attempts=5):
 48        super().__init__(probability=probability, arity=arity, events=events, attempts=attempts)
 49        self.n = n
 50
 51        if cell_selector is None:
 52            cell_selector = self.default_cell_selector
 53        self.cell_selector = cell_selector
 54
 55        if success_checker is None:
 56            success_checker = self.default_success_checker
 57        self.success_checker = success_checker
 58
 59        if mut_val_getter is None:
 60            mut_val_getter = self.default_mut_val_getter
 61        self.mut_val_getter = mut_val_getter
 62
 63    @staticmethod
 64    def default_mut_val_getter(vec: Vector, idx: int) -> Union[int, float]:
 65        return vec.get_random_number_in_bounds(vec, idx)
 66
 67    @staticmethod
 68    def default_success_checker(old_vec: Vector, new_vec: Vector) -> bool:
 69        return new_vec.check_if_in_bounds()
 70    
 71    def default_cell_selector(self, vec: Vector) -> List[int]:
 72        vector_indices = range(vec.size())
 73        return random.sample(vector_indices, k=self.n)
 74
 75    def attempt_operator(self, individuals: List[Vector], attempt_num) -> Tuple[bool, List[Vector]]:
 76        """
 77        Attempt to perform the mutation operator
 78
 79        Parameters
 80        ----------
 81        individuals : list of vectors
 82            vectors to mutate
 83
 84        attempt_num : int
 85            Current attempt number
 86
 87        Returns
 88        ----------
 89        tuple of (bool, list of vectors)
 90            first return value determines if the the attempt succeeded
 91            second return value is the operator result
 92        """
 93        succeeded = True
 94        for individual in individuals:
 95            old_individual = individual.clone()
 96
 97            # randomly select n points of the vector (without repetitions)
 98            m_points = self.cell_selector(individual)
 99            # obtain the mutated values
100            mut_vals = [self.mut_val_getter(individual, m_point) for m_point in m_points]
101
102            # update the mutated value in-place
103            for m_point, mut_val in zip(m_points, mut_vals):
104                individual.set_cell_value(m_point, mut_val)
105
106            if not self.success_checker(old_individual, individual):
107                succeeded = False
108                individual.set_vector(old_individual.vector)
109                break
110
111        self.applied_individuals = individuals
112        return succeeded, individuals
113
114    def on_fail(self, payload):
115        """
116        The required fix when the operator fails, does nothing by default and can be overridden by subclasses
117
118        Parameters
119        ----------
120        payload : object
121            relevant data for on_fail (usually the individuals that the mutation was attempted to be applied on)
122        """
123        pass

Vector N Point Mutation.

Randomly chooses N vector cells and performs a small change in their values.

Parameters
  • n (int): Number of mutation points.
  • probability (float): The probability of the mutation operator to be applied
  • arity (int): The number of individuals this mutation is applied on
  • cell_selector (callable): Returns the indices of the cells to mutate
  • mut_val_getter (callable): Returns a mutated value of a certain cell
  • success_checker (callable): Checks if a given (mutated) cell value is legal
  • events (list of strings): Events to publish before/after the mutation operator
VectorNPointMutation( n=1, probability=1.0, arity=1, cell_selector=None, mut_val_getter=None, success_checker=None, events=None, attempts=5)
39    def __init__(self,
40                 n=1,
41                 probability=1.0,
42                 arity=1,
43                 cell_selector=None,
44                 mut_val_getter=None,
45                 success_checker=None,
46                 events=None,
47                 attempts=5):
48        super().__init__(probability=probability, arity=arity, events=events, attempts=attempts)
49        self.n = n
50
51        if cell_selector is None:
52            cell_selector = self.default_cell_selector
53        self.cell_selector = cell_selector
54
55        if success_checker is None:
56            success_checker = self.default_success_checker
57        self.success_checker = success_checker
58
59        if mut_val_getter is None:
60            mut_val_getter = self.default_mut_val_getter
61        self.mut_val_getter = mut_val_getter
n
cell_selector
success_checker
mut_val_getter
@staticmethod
def default_mut_val_getter( vec: eckity.genetic_encodings.ga.vector_individual.Vector, idx: int) -> Union[int, float]:
63    @staticmethod
64    def default_mut_val_getter(vec: Vector, idx: int) -> Union[int, float]:
65        return vec.get_random_number_in_bounds(vec, idx)
@staticmethod
def default_success_checker( old_vec: eckity.genetic_encodings.ga.vector_individual.Vector, new_vec: eckity.genetic_encodings.ga.vector_individual.Vector) -> bool:
67    @staticmethod
68    def default_success_checker(old_vec: Vector, new_vec: Vector) -> bool:
69        return new_vec.check_if_in_bounds()
def default_cell_selector( self, vec: eckity.genetic_encodings.ga.vector_individual.Vector) -> List[int]:
71    def default_cell_selector(self, vec: Vector) -> List[int]:
72        vector_indices = range(vec.size())
73        return random.sample(vector_indices, k=self.n)
def attempt_operator( self, individuals: List[eckity.genetic_encodings.ga.vector_individual.Vector], attempt_num) -> Tuple[bool, List[eckity.genetic_encodings.ga.vector_individual.Vector]]:
 75    def attempt_operator(self, individuals: List[Vector], attempt_num) -> Tuple[bool, List[Vector]]:
 76        """
 77        Attempt to perform the mutation operator
 78
 79        Parameters
 80        ----------
 81        individuals : list of vectors
 82            vectors to mutate
 83
 84        attempt_num : int
 85            Current attempt number
 86
 87        Returns
 88        ----------
 89        tuple of (bool, list of vectors)
 90            first return value determines if the the attempt succeeded
 91            second return value is the operator result
 92        """
 93        succeeded = True
 94        for individual in individuals:
 95            old_individual = individual.clone()
 96
 97            # randomly select n points of the vector (without repetitions)
 98            m_points = self.cell_selector(individual)
 99            # obtain the mutated values
100            mut_vals = [self.mut_val_getter(individual, m_point) for m_point in m_points]
101
102            # update the mutated value in-place
103            for m_point, mut_val in zip(m_points, mut_vals):
104                individual.set_cell_value(m_point, mut_val)
105
106            if not self.success_checker(old_individual, individual):
107                succeeded = False
108                individual.set_vector(old_individual.vector)
109                break
110
111        self.applied_individuals = individuals
112        return succeeded, individuals

Attempt to perform the mutation operator

Parameters
  • individuals (list of vectors): vectors to mutate
  • attempt_num (int): Current attempt number
Returns
  • tuple of (bool, list of vectors): first return value determines if the the attempt succeeded second return value is the operator result
def on_fail(self, payload):
114    def on_fail(self, payload):
115        """
116        The required fix when the operator fails, does nothing by default and can be overridden by subclasses
117
118        Parameters
119        ----------
120        payload : object
121            relevant data for on_fail (usually the individuals that the mutation was attempted to be applied on)
122        """
123        pass

The required fix when the operator fails, does nothing by default and can be overridden by subclasses

Parameters
  • payload (object): relevant data for on_fail (usually the individuals that the mutation was attempted to be applied on)