def mutate(self, pruning=False): """ Alter a random node in chromosomes. """ # randomly select node to mutate mpoint = r.randint(0, self.size - 1) # mutate whole node by replacing children with random subtree if r.random() >= 0.5: rand_tree = random_tree(2) x2 = r.randint(0, rand_tree.node_num - 1) node = rand_tree.get_node(x2) self.chromosomes.set_node(mpoint, node) # check and prune tree with new subtree for inefficiencies if pruning: self.chromosomes.prune() # or just mutate node value based on current type else: node = self.chromosomes.get_node(mpoint) # constant if node.value in CONSTS: mutated_value = CONSTS[r.randint(0, len(CONSTS) - 1)] # variable elif node.value in eugene.Config.VAR.keys(): mutated_value = eugene.Config.VAR.keys()[r.randint(0, len(eugene.Config.VAR.keys()) - 1)] # a unary operator elif node.value in UNARIES: mutated_value = UNARIES[r.randint(0, len(UNARIES) - 1)] # a binary operator elif node.value in BINARIES: mutated_value = BINARIES[r.randint(0, len(BINARIES) - 1)] # a n-ary operator # elif node.value in NARIES: # mutated_value = NARIES[r.randint(0, len(NARIES) - 1)] # EPHEMERAL constant random ( 0:1, uniform -500:500, or normal -500:500 ) else: mutated_value = EPHEMERAL[r.randint(1, len(EPHEMERAL) - 1)]() # mutate node value (keeps children, if applicable) node.value = mutated_value self.chromosomes.set_node(mpoint, node)
def test_12_random_trees(self): """Generate 500 random trees""" NUM_TREES = 500 random_trees = [random_tree(10) for i in xrange(NUM_TREES)] self.assertEqual(len(random_trees), NUM_TREES)