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)