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()
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
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__())]