Bibliothèque de calcul d'évolution Python Deap

Présentation de DEAP

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 () `` `.

Résultat de sortie

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.

référence

Exemple Deap: http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax.html

Recommended Posts

Bibliothèque de calcul d'évolution Python Deap
Bibliothèque de calcul d'évolution Python Deap (3)
Bibliothèque de calcul d'évolution Python Deap (2)
Bibliothèque de messagerie Python 3.6
Bibliothèque Python AST
Note sur la bibliothèque Python
Perceuse de calcul Python
bibliothèque de commerce d'algorithmes python
Installer une bibliothèque externe pour python
Bibliothèque d'optimisation Python Pulp
Exercice de calcul Python (extension)
Aim Python Library Master (48) Autopep8
Aim Python Library Master (36) json2html
Aim Python Library Master (49) psidialogs
Deep Python appris de DEAP
Aim Python Library Master (26) easyxml
Aim python library master (29) table_printer
Espaces de noms Aim Python Library Master (55)
AIM Python Library Master (46) BrowserPlus
Aim Python Library Master (30) Chronyk
AIM Python Library Master (3) Workalendar
Aim Python Library Master (42) Speedrecorder
Aim Python Library Master (37) Slimurl
Recommandation de la bibliothèque binpacking de python
Aim Python Library Master (44) pynetviz
Aim Python Library Master (8) Rolex
Aim Python Library Master (52) Marktime
Aim Python Library Master (7) Numparser
Aim Python Library Master (21) hy
Viser les requêtes du maître de bibliothèque python (18)
Windows10: installation de la bibliothèque dlib pour python
Aim Python Library Master (13) Easydev
Aim Python Library Master (20) Pyyaml
Aim Python Library Master (34) simultané
Viser la segmentation de mots du maître de la bibliothèque python
Aim Python Library Master (43) cpmoptimize
Aim Python Library Master (68) pazudorasolver
Aim Python Library Master (58) Faker
Aim Python Library Master (11) nlist
Aimez le maître de la bibliothèque python (38) beautiful_print
Aim Python Library Master (65) Geopy
Aim Python Library Master (2) Vincenty
Journal de bord Aim Python Library Master (59)
Aim Python Library Master (51) Pyautogui
Aim Python Library Master (10) Timeit
Aim Python Library Master (0) Liens
Aim Python Library Master (66) youtube-dl
Remplacer les fonctions de bibliothèque en Python
Aim Python Library Master (53) psutil
Aim Python Library Master (22) HTMltag
Aim Python Library Master (67) httpie
Aim Python Library Master (45) xlsxwriter
Aim Python Library Master (9) WebHelpers
Aim Python Library Master (32) SQL
Aim Python Library Master (60) Colourettu
Viser maître de la bibliothèque python (64) pretty_cron
Aim Python Library Master (56) colorthief
Aim Python Library Master (61) recherche imbriquée
Aim Python Library Master (17) Rangeparser