Je voudrais vous présenter la bibliothèque d'algorithmes génétiques Deap qui peut être utilisée avec Python. Il existe une autre bibliothèque d'algorithmes génétiques pour Python appelée Pyevolve, mais Deap semble être plus actif dans le développement, donc j'aimerais l'utiliser. Je vais. Vous trouverez ci-dessous les principaux algorithmes et fonctionnalités disponibles dans Deap.
Example Cette fois, je vais expliquer l'exemple de GA. Tout d'abord, importez le module.
import random
from deap import base
from deap import creator
from deap import tools
creator hérite de la classe de base et crée une nouvelle classe.
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
La première ligne crée une classe d'ajustement qui est optimisée en maximisant l'ajustement. Les poids sont un tableau, mais pour l'optimisation à un seul objectif, la taille 1 convient (bien que "," semble être nécessaire), et pour l'optimisation polyvalente, les pondérations pour chaque objectif sont organisées. Définissez (-1,0,) pour optimiser en minimisant.
toolbox = base.Toolbox()
# Attribute generator
toolbox.register("attr_bool", random.randint, 0, 1)
# Structure initializers
toolbox.register("individual", tools.initRepeat, creator.Individual, 
    toolbox.attr_bool, 100)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox crée une fonction. Dans le registre sur la 3ème ligne, une fonction appelée attr_bool est créée en donnant 0,1 argument à random.randint. attr_bool est une fonction qui génère au hasard 0 ou 1. initRepeat est une fonction préparée à l'avance dans Toolbox. Le premier argument est le type de conteneur qui stocke les données, le second est la fonction qui génère des données individuelles et le troisième est la taille du conteneur. Ici, une fonction appelée individu (individu) et une fonction appelée population (groupe) sont créées à partir d'initRepeat. Ensuite, créez des fonctions d'évaluation, des intersections, des mutations et des fonctions de sélection. (Notez qu'il y a un "," dans la valeur de retour de la fonction d'évaluation.)
def evalOneMax(individual):
    return sum(individual),
toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoints)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selTournament, tournsize=3)
Maintenant que les paramètres GA sont terminés, créons la routine de calcul d'évolution réelle.
def main():
    random.seed(64)
    #Générer une population précoce
    pop = toolbox.population(n=300)
    CXPB, MUTPB, NGEN = 0.5, 0.2, 40 #Probabilité de croisement, probabilité de mutation, nombre de boucles dans le calcul de l'évolution
    
    print("Start of evolution")
    
    #Évaluation de la population précoce
    fitnesses = list(map(toolbox.evaluate, pop))
    for ind, fit in zip(pop, fitnesses):
        ind.fitness.values = fit
    
    print("  Evaluated %i individuals" % len(pop))
    
    #Le calcul de l'évolution a commencé
    for g in range(NGEN):
        print("-- Generation %i --" % g)
        
        #Sélectionnez la population de la prochaine génération
        offspring = toolbox.select(pop, len(pop))
        #Cloner la population
        offspring = list(map(toolbox.clone, offspring))
    
        #Appliquer le croisement et la mutation à des populations sélectionnées
        #Éliminez les individus pairs et impairs et intersectez
        for child1, child2 in zip(offspring[::2], offspring[1::2]):
            if random.random() < CXPB:
                toolbox.mate(child1, child2)
                del child1.fitness.values
                del child2.fitness.values
        for mutant in offspring:
            if random.random() < MUTPB:
                toolbox.mutate(mutant)
                del mutant.fitness.values
    
        #Calculer l'aptitude en collectant les individus pour lesquels l'aptitude n'a pas été calculée
        invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
        fitnesses = map(toolbox.evaluate, invalid_ind)
        for ind, fit in zip(invalid_ind, fitnesses):
            ind.fitness.values = fit
        
        print("  Evaluated %i individuals" % len(invalid_ind))
        
        #Faire la progéniture de la prochaine génération
        pop[:] = offspring
        
        #Organiser l'aptitude de tous les individus
        fits = [ind.fitness.values[0] for ind in pop]
        
        length = len(pop)
        mean = sum(fits) / length
        sum2 = sum(x*x for x in fits)
        std = abs(sum2 / length - mean**2)**0.5
        
        print("  Min %s" % min(fits))
        print("  Max %s" % max(fits))
        print("  Avg %s" % mean)
        print("  Std %s" % std)
    
    print("-- End of (successful) evolution --")
    
    best_ind = tools.selBest(pop, 1)[0]
    print("Best individual is %s, %s" % (best_ind, best_ind.fitness.values))
Après cela, vous pouvez appeler cette fonction principale comme ```if name == "main": main () `` `.
Start of evolution
  Evaluated 300 individuals
-- Generation 0 --
  Evaluated 189 individuals
  Min 40.0
  Max 65.0
  Avg 54.7433333333
  Std 4.46289766358
-- Generation 1 --
  Evaluated 171 individuals
  Min 44.0
  Max 70.0
  Avg 58.48
  Std 3.98533980149
...(Omis en chemin)...
-- Generation 38 --
  Evaluated 180 individuals
  Min 89.0
  Max 100.0
  Avg 97.7466666667
  Std 2.32719191779
-- Generation 39 --
  Evaluated 196 individuals
  Min 88.0
  Max 100.0
  Avg 98.1833333333
  Std 2.33589145486
-- End of (successful) evolution --
Best individual is [True, 1, 1, 1, 1, 1, True, 1, 1, 1, 1, True, 1, 1, 1, 1, True, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, True, True, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, True, 1, 1, 1, 1, True, True, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], (100.0,)
Bien que 1 et True soient mélangés dans le tableau, on peut voir que la solution optimale est requise, probablement parce qu'il s'agit d'un problème de fonction d'intersection ou de mutation.
Exemple Deap: http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax.html
Recommended Posts