# This file is part of EAP. # # EAP is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation, either version 3 of # the License, or (at your option) any later version. # # EAP is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with EAP. If not, see . import random import operator from deap import algorithms from deap import base from deap import creator from deap import tools from deap import gp # Initialize Parity problem input and output matrices PARITY_FANIN_M = 6 PARITY_SIZE_M = 2**PARITY_FANIN_M inputs = [None] * PARITY_SIZE_M outputs = [None] * PARITY_SIZE_M for i in range(PARITY_SIZE_M): inputs[i] = [None] * PARITY_FANIN_M value = i dividor = PARITY_SIZE_M parity = 1 for j in range(PARITY_FANIN_M): dividor /= 2 if value >= dividor: inputs[i][j] = 1 parity = int(not parity) value -= dividor else: inputs[i][j] = 0 outputs[i] = parity pset = gp.PrimitiveSet("MAIN", PARITY_FANIN_M, "IN") pset.addPrimitive(operator.and_, 2) pset.addPrimitive(operator.or_, 2) pset.addPrimitive(operator.xor, 2) pset.addPrimitive(operator.not_, 1) pset.addTerminal(1) pset.addTerminal(0) creator.create("FitnessMax", base.Fitness, weights=(1.0,)) creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMax, pset=pset) toolbox = base.Toolbox() toolbox.register("expr", gp.genFull, pset=pset, min_=3, max_=5) toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.expr) toolbox.register("population", tools.initRepeat, list, toolbox.individual) toolbox.register("lambdify", gp.lambdify, pset=pset) def evalParity(individual): func = toolbox.lambdify(expr=individual) return sum(func(*in_) == out for in_, out in zip(inputs, outputs)), toolbox.register("evaluate", evalParity) toolbox.register("select", tools.selTournament, tournsize=3) toolbox.register("mate", gp.cxOnePoint) toolbox.register("expr_mut", gp.genGrow, min_=0, max_=2) toolbox.register("mutate", gp.mutUniform, expr=toolbox.expr_mut) def main(): random.seed(21) pop = toolbox.population(n=300) hof = tools.HallOfFame(1) stats = tools.Statistics(lambda ind: ind.fitness.values) stats.register("avg", tools.mean) stats.register("std", tools.std) stats.register("min", min) stats.register("max", max) algorithms.eaSimple(pop, toolbox, 0.5, 0.2, 40, stats, halloffame=hof) return pop, stats, hof if __name__ == "__main__": main()