Пример #1
0
    def __mutate_delete(self, parent: Tree):
        rand_node_index = random.randrange(0, parent.number_of_nodes_in_tree)
        temp_node: Node = parent.get_node(rand_node_index)

        if temp_node is None:
            raise Exception("Invalid Node Index")
        while temp_node.type is "T":
            rand_node_index = random.randrange(0,
                                               parent.number_of_nodes_in_tree)
            temp_node = parent.get_node(rand_node_index)

        for i in range(temp_node.max_num_of_children):
            temp_node.children_list[i] = parent.generate_random_terminal()
Пример #2
0
    def __mutate_add(self, parent: Tree):
        rand_node_index = random.randrange(1, parent.number_of_nodes_in_tree)
        temp_node: Node = parent.get_node(rand_node_index)

        while temp_node.type is "T":
            rand_node_index = random.randrange(0,
                                               parent.number_of_nodes_in_tree)
            temp_node: Node = parent.get_node(rand_node_index)

        final_depth = parent.depth if hp.GP.mutate_add_depth < 2 else hp.GP.mutate_add_depth
        temp_tree = Tree(final_depth, self.function_set, self.terminal_set)
        temp_tree.populate_random_tree(["grow", "full"
                                        ].__getitem__(random.randrange(0, 2)))
        temp_node.children_list[random.randrange(
            0, temp_node.max_num_of_children)] = temp_tree.root
Пример #3
0
    def __mutate_change(self, parent: Tree):
        rand_node_index = random.randrange(0, parent.number_of_nodes_in_tree)
        temp_node: Node = parent.get_node(rand_node_index)

        # make sure excluding current terminal won't break our lovely program
        if (temp_node.type is "T") and (self.terminal_set.__len__() > 1):
            temp_remaining_terminals = [
                t for t in self.terminal_set if t is not temp_node.label
            ]
            temp_node.label = temp_remaining_terminals[random.randrange(
                0, temp_remaining_terminals.__len__())]
        if (temp_node.type is "F") and (self.function_set.__len__() > 1):
            # generating a list of tuples from remaining function excluding current function label
            temp_remaining_functions = [
                f_tpl[0] for f_tpl in self.function_set
                if (f_tpl[0] is not temp_node.label) and (
                    f_tpl[1] is temp_node.max_num_of_children)
            ]
            if temp_remaining_functions.__len__() > 0:
                temp_node.label = temp_remaining_functions[random.randrange(
                    0, temp_remaining_functions.__len__())]