def _mutation(self, child1_weights: np.ndarray, child2_weights: np.ndarray, child1_bias: np.ndarray, child2_bias: np.ndarray) -> None: scale = .2 rand_mutation = random.random() mutation_bucket = np.digitize(rand_mutation, self._mutation_bins) mutation_rate = self._mutation_rate if self.settings['mutation_rate_type'].lower() == 'decaying': mutation_rate = mutation_rate / sqrt(self.current_generation + 1) # Gaussian if mutation_bucket == 0: # Mutate weights gaussian_mutation(child1_weights, mutation_rate, scale=scale) gaussian_mutation(child2_weights, mutation_rate, scale=scale) # Mutate bias gaussian_mutation(child1_bias, mutation_rate, scale=scale) gaussian_mutation(child2_bias, mutation_rate, scale=scale) # Uniform random elif mutation_bucket == 1: # Mutate weights random_uniform_mutation(child1_weights, mutation_rate, -1, 1) random_uniform_mutation(child2_weights, mutation_rate, -1, 1) # Mutate bias random_uniform_mutation(child1_bias, mutation_rate, -1, 1) random_uniform_mutation(child2_bias, mutation_rate, -1, 1) else: raise Exception('Unable to determine valid mutation based off probabilities.')
def _mutation(self, child1_weights: np.ndarray, child2_weights: np.ndarray, child1_bias: np.ndarray, child2_bias: np.ndarray) -> None: mutation_rate = self.config.Mutation.mutation_rate scale = self.config.Mutation.gaussian_mutation_scale if self.config.Mutation.mutation_rate_type == 'dynamic': mutation_rate = mutation_rate / math.sqrt(self.current_generation + 1) # Mutate weights gaussian_mutation(child1_weights, mutation_rate, scale=scale) gaussian_mutation(child2_weights, mutation_rate, scale=scale) # Mutate bias gaussian_mutation(child1_bias, mutation_rate, scale=scale) gaussian_mutation(child2_bias, mutation_rate, scale=scale)
def _mutation(self, chromosome: np.ndarray) -> None: """ Randomly decide if we should perform mutation on a gene within the chromosome. This is done in place """ rand_mutation = random.random() mutation_bucket = np.digitize(rand_mutation, self._mutation_bins) # Gaussian if mutation_bucket == 0: mutation_rate = get_ga_constant('mutation_rate') if get_ga_constant('mutation_rate_type').lower() == 'dynamic': mutation_rate = mutation_rate / math.sqrt( self.current_generation + 1) gaussian_mutation(chromosome, mutation_rate, scale=get_ga_constant('gaussian_mutation_scale')) # Random uniform elif mutation_bucket == 1: #@TODO: add to this pass else: raise Exception( 'Unable to determine valid mutation based off probabilities')