if input: return output1 else: return output2 pset.addPrimitive(operator.lt, ["float", "float"], "bool") pset.addPrimitive(operator.eq, ["float", "float"], "bool") pset.addPrimitive(if_then_else, ["bool", "float", "float"], "float") # terminals pset.addEphemeralConstant(lambda: random.random() * 100, "float") pset.addTerminal(0, "bool") pset.addTerminal(1, "bool") creator.create("FitnessMax", base.Fitness, weights=(1.0,)) creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMax, pset=pset) tools = toolbox.Toolbox() tools.register("expr", gp.generateRamped, pset=pset, type_=pset.ret, min_=1, max_=2) tools.register("individual", creator.Individual, content_init=tools.expr) tools.register("population", list, content_init=tools.individual, size_init=100) tools.register("lambdify", gp.lambdify, pset=pset) def evalSpambase(individual): # Transform the tree expression in a callable function func = tools.lambdify(expr=individual) # Randomly sample 400 mails in the spam database spam_samp = random.sample(spam, 400) # Evaluate the sum of correctly identified mail as spam result = sum(bool(func(*mail[:57])) is bool(mail[57]) for mail in spam_samp) return result, tools.register("evaluate", evalSpambase)
def refFunc(x): return x**4 + x**3 + x**2 + x def evalSymbReg(expr, data): # Transform the tree expression in a callable function func = tools_gp.lambdify(expr=expr) # Evaluate the sum of squared difference between the expression # and the real function : x**4 + x**3 + x**2 + x values = data diff_func = lambda x: (func(x) - refFunc(x))**2 diff = sum(map(diff_func, values)) return diff, tools_ga = toolbox.Toolbox() tools_ga.register("float", random.uniform, -1, 1) tools_ga.register("individual", creator.IndGA, content_init=tools_ga.float, size_init=10) tools_ga.register("population", list, content_init=tools_ga.individual, size_init=200) tools_ga.register("select", toolbox.selTournament, tournsize=3) tools_ga.register("mate", toolbox.cxTwoPoints) tools_ga.register("mutate", toolbox.mutGaussian, mu=0, sigma=0.01, indpb=0.05)