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