Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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]