def mutate( self, min_swap_probability=0.2, max_swap_probability=0.8, inverse_probability=0.001, shift_probability=0.001, min_insert_probability=0.3, max_insert_probability=0.6, random_probability=0.2, ): swap_probability = random.uniform(min_swap_probability, max_swap_probability) insert_probability = random.uniform(min_insert_probability, max_insert_probability) for inhabitant in self.generation[1:]: if len(inhabitant.gene) == 0: inhabitant.gene = self._random_moves() continue if decision(insert_probability): insert_amount = random.randint(1, 3) if decision(0.5): # remove decision possible_chars = self._random_word(insert_amount) if decision(0.33): for s in possible_chars: inhabitant.gene += [possible_chars[0]] elif decision(0.5): for s in possible_chars: inhabitant.gene = [possible_chars[0] ] + inhabitant.gene else: insert_index = random.randint(1, len(inhabitant.gene)) for s in possible_chars: inhabitant.gene = (inhabitant.gene[:insert_index] + [possible_chars[0]] + inhabitant.gene[insert_index:]) else: if len(inhabitant) - insert_amount > 0: if decision(0.33): inhabitant.gene = inhabitant.gene[insert_amount:] elif decision(0.5): inhabitant.gene = inhabitant.gene[:-insert_amount] else: remove_index = random.randint( 1, len(inhabitant.gene) - insert_amount) inhabitant.gene = ( inhabitant.gene[:remove_index] + inhabitant.gene[remove_index + insert_amount:]) elif decision(random_probability): inhabitant.gene = self._random_moves() else: if decision(shift_probability): shift_range = random.randint(1, 3) for _ in range(shift_range + 1): inhabitant.gene = [inhabitant.gene[-1] ] + inhabitant.gene[:-1] if decision(swap_probability): inhabitant.gene = gen_neighbour(inhabitant.gene) if decision(inverse_probability): inhabitant.gene = inhabitant.gene[::-1] inhabitant.gene = self._cancel_backtrack(inhabitant.gene)
def mutate( self, min_swap_probability=0.2, max_swap_probability=0.8, inverse_probability=0.001, shift_probability=0.01, min_insert_probability=0.5, max_insert_probability=0.8, random_probability=0.05, semi_backtrack_removal_probability=0.1, ): swap_probability = random.uniform(min_swap_probability, max_swap_probability) insert_probability = random.uniform(min_insert_probability, max_insert_probability) for inhabitant in self.generation[1:]: if len(inhabitant.gene) <= 1: inhabitant.gene = self._random_moves() continue if decision(semi_backtrack_removal_probability) and len(inhabitant) > 2: inhabitant.gene = self._semi_backtrack_removal(inhabitant.gene) continue if decision(insert_probability): insert_amount = random.randint(1, 2) if decision(0.2): # remove decision possible_chars = self._random_word(insert_amount) if decision(0.2): inhabitant.gene += possible_chars elif decision(0.2): inhabitant.gene = possible_chars + inhabitant.gene else: insert_index = random.randint(1, len(inhabitant.gene)) inhabitant.gene = ( inhabitant.gene[:insert_index] + possible_chars + inhabitant.gene[insert_index:] ) else: if len(inhabitant) - insert_amount > 1: if decision(0.33): inhabitant.gene = inhabitant.gene[insert_amount:] elif decision(0.33): inhabitant.gene = inhabitant.gene[:-insert_amount] else: for _ in range(insert_amount): remove_index = random.randint(1, len(inhabitant.gene)-insert_amount) inhabitant.gene = ( inhabitant.gene[:remove_index] + inhabitant.gene[remove_index+1:] ) elif decision(random_probability): inhabitant.gene = self._random_moves() else: if decision(shift_probability): shift_range = random.randint(1, 3) for _ in range(shift_range + 1): inhabitant.gene = [inhabitant.gene[-1]] + inhabitant.gene[:-1] if decision(swap_probability): inhabitant.gene = gen_neighbour(inhabitant.gene) if decision(inverse_probability): inhabitant.gene = inhabitant.gene[::-1] inhabitant.gene = self._cancel_backtrack(inhabitant.gene)
def mutate( self, min_swap_probability=0.6, max_swap_probability=0.9, inverse_probability=0.1, random_probability=0.4, shift_probability=0.6, insert_probability=0.8, replace_probability=0.9, ): swap_probability = random.uniform(min_swap_probability, max_swap_probability) for inhabitant in self.generation[1:]: if decision(insert_probability): insert_amount = random.randint(1, 2) if decision(0.5): # remove decision if (len(inhabitant) + insert_amount < len( self.all_puzzle_keys)): possible_chars = self._random_word() for char in inhabitant.gene: if char in possible_chars: possible_chars.remove(char) if decision(0.33): inhabitant.gene += possible_chars[:insert_amount] elif decision(0.5): inhabitant.gene = possible_chars[: insert_amount] + inhabitant.gene else: insert_index = random.randint( 1, len(inhabitant.gene)) inhabitant.gene = inhabitant.gene[: insert_index] + possible_chars[:insert_amount] + inhabitant.gene[ insert_index:] else: if (len(inhabitant) - insert_amount > 0): if len(inhabitant) - insert_amount > 0: if decision(0.33): inhabitant.gene = inhabitant.gene[ insert_amount:] elif decision(0.5): inhabitant.gene = inhabitant.gene[: -insert_amount] else: remove_index = random.randint( 1, len(inhabitant.gene) - insert_amount) inhabitant.gene = ( inhabitant.gene[:remove_index] + inhabitant.gene[remove_index + insert_amount:]) elif decision(random_probability): inhabitant.gene = self._random_word() else: if decision(shift_probability): shift_range = random.randint(1, 3) for _ in range(shift_range + 1): inhabitant.gene = [inhabitant.gene[-1] ] + inhabitant.gene[:-1] if decision(swap_probability): inhabitant.gene = gen_neighbour(inhabitant.gene) if decision(inverse_probability): inhabitant.gene = inhabitant.gene[::-1]