def __init__(self, n=3, parent1 = None, parent2 = None):

        self.conds = []

        # If no parents, then create a random strategy.
        if parent1 == None or parent2 == None:
            num_conds = randint(1,n)
            for i in range(0,num_conds):
                self.conds.append(conditions.gen_random_condition())
        
        # Else do recombination
        else:
            if len(parent1.conds) <= 0:
                num_from_p1 = 0
            else:
                num_from_p1 = randint(0, len(parent1.conds))
            if len(parent2.conds) <= 0:
                num_from_p2 = 0
            else:
                num_from_p2 = randint(0, len(parent2.conds))

            p1_rules = parent1.conds[:num_from_p1]
            p2_rules = parent2.conds[:num_from_p2]

            longer = max(p1_rules, p2_rules, key=len)
            shorter = min(p2_rules, p1_rules, key=len)

            for i in range(0, len(shorter)):
                if not (shorter[i] in longer):
                    longer.insert(2*i+1, shorter[i])

            self.conds = longer[:RULE_CAP]

            if random() < MUTATE_CHANCE:
                self.mutate()
 def add_r():
     rule = conditions.gen_random_condition()
     self.conds.insert(i, rule)