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
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
@staticmethod
def
default_mut_val_getter( vec: eckity.genetic_encodings.ga.vector_individual.Vector, idx: int) -> Union[int, float]:
@staticmethod
def
default_success_checker( old_vec: eckity.genetic_encodings.ga.vector_individual.Vector, new_vec: eckity.genetic_encodings.ga.vector_individual.Vector) -> bool:
def
default_cell_selector( self, vec: eckity.genetic_encodings.ga.vector_individual.Vector) -> List[int]:
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)