En utilisant la bibliothèque Python DEAP, vous pouvez facilement effectuer des simulations à l'aide de l'algorithme génétique (GA). A ce moment, il peut être souhaitable de fixer le groupe initial en raison de circonstances telles que le fait d'avoir une certaine connaissance préalable de la solution optimale et de vouloir raccourcir le temps de calcul.
Par exemple, lorsque j'applique à la sélection de fonctionnalités d'apprentissage automatique telles que cet exemple, je souhaite commencer par le meilleur modèle que j'ai essayé jusqu'à présent. Peut être considéré. Si elle est de 100 à plusieurs centaines, il n'est pas nécessaire de définir la valeur initiale, mais il existe une demande pour des humains qui ont créé mécaniquement environ 100 000 fonctionnalités sans réfléchir à l'avance.
Il existe un guide dans Document officiel pour savoir comment traiter de tels cas. Il n'y a pas beaucoup d'informations sur le Web que j'ai réellement testées, je vais donc les énumérer ici.
Implémentation GA qui maximise la valeur totale du tableau constitué de 0 ou 1 comme fonction d'évaluation La solution optimale est un tableau de 1 et la valeur maximale de la fonction d'évaluation est la longueur du tableau. http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax.html http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax_short.html
#Import de bibliothèque
import numpy as np
import random
from deap import algorithms
from deap import base
from deap import creator
from deap import tools
Valeur totale d'un tableau de 100 éléments composé de 0 ou 1
def evalOneMax(individual):
return sum(individual), #Ajoutez une virgule même s'il n'y a qu'une seule valeur de retour
Ajoutez des méthodes FitnessMax et Individual au créateur avec create. Évaluez la maximisation de la fonction d'évaluation en définissant des poids = (1,0,).
creator.create("FitnessMax", base.Fitness, weights=(1.0,)) #Ajoutez une virgule même s'il n'y a qu'un seul argument
creator.create("Individual", list, fitness=creator.FitnessMax)
Ajoutez une méthode avec le nom de la première variable à la boîte à outils avec resister.
toolbox.attr_bool
: random.randint(0,1)
toolbox.individual
: 01 nombre aléatoire en utilisant toolbox.attr_bool> Répéter 100 fois avec tools.initRepeat Créer une liste de 100 éléments (= génération individuelle)
toolbox.polulation
: Répétez la génération individuelle par toolbox.individual pour créer une population
del toolbox
toolbox = base.Toolbox()
# Attribute generator
toolbox.register("attr_bool", random.randint, 0.0, 1.0)
# Structure initializers
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_bool, 100)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
Ensuite, la méthode requise pour l'exécution GA par ʻalgorithms.eaMuPlusLambda Définissez
toolbox.evaluate (évaluation),
toolbox.mate(crossover),
toolbox.mutate (mutation),
toolbox.select(sélection). Vous pouvez écrire comme ci-dessous en utilisant
deap.tools`.
toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selNSGA2)
pop: groupe initial hof: Préservation des meilleurs individus stats: sauvegarde des statistiques pour les fonctions d'évaluation de la population
"""Réglage de l'algorithme génétique
Jusqu'à la génération NGEN
Population de 1ère génération LAMBDA
Nombre d'individus à transmettre à la nouvelle génération d'UM
Probabilité de croisement CXPB
Probabilité de mutation MUTPB
"""
random.seed(4)
NGEN = 10
MU = 50
LAMBDA = 100
CXPB = 0.7
MUTPB = 0.3
#Création de population
pop = toolbox.population(n=MU)
hof = tools.HallOfFame(1)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", np.mean, axis=0)
stats.register("std", np.std, axis=0)
stats.register("min", np.min, axis=0)
stats.register("max", np.max, axis=0)
pop, log = algorithms.eaMuPlusLambda(pop,
toolbox,
mu=MU,
lambda_=LAMBDA,
cxpb=CXPB,
mutpb=MUTPB,
ngen=NGEN,
stats=stats,
halloffame=hof)
gen nevals avg std min max
0 50 [50.32] [4.71355492] [41.] [63.]
1 100 [56.] [2.02977831] [53.] [63.]
2 100 [59.3] [2.3] [57.] [68.]
3 100 [62.56] [2.03135423] [60.] [69.]
4 100 [65.58] [1.96051014] [63.] [72.]
5 100 [68.46] [1.52590956] [66.] [73.]
6 100 [70.4] [1.34164079] [69.] [74.]
7 100 [72.36] [1.10923397] [71.] [76.]
8 100 [74.06] [1.06602064] [73.] [77.]
9 100 [75.38] [0.79724526] [74.] [77.]
10 100 [76.36] [0.62481997] [76.] [78.]
Puisqu'il a commencé avec un nombre aléatoire, la valeur d'évaluation de l'individu initial se situe entre 41 et 63. Il n'a pas convergé dans la 10e génération, mais c'est OK car le but n'est pas de converger.
Si vous souhaitez fixer le groupe initial à une valeur spécifique et commencer, réécrivez la partie pertinente du document officiel comme suit.
Créez une liste de population initiale = individus. Par exemple, si vous souhaitez démarrer l'algorithme génétique à partir de la population clonée L00 d'un individu composé de tous les 0, ce sera comme suit.
MU = 50
# individual
L0 = [0] * 100
# list of individuals
L00 = [L0] * MU
Identique à 1-2.
Définissez une méthode toolbox.population_guess
qui remplace toolbox.population
.
toolbox = base.Toolbox()
# population_Fonctions utilisées pour deviner
def initPopulation(pcls, ind_init, file):
return pcls(ind_init(c) for c in file)
# population_Créer une méthode d'estimation
# creator.Ajouter la forme physique à chaque individu par individu
toolbox.register("population_guess", initPopulation, list, creator.Individual, L00)
#Ici ensemble
toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selNSGA2)
hof et stat sont identiques, donc omis
#Population de la génération individuelle initiale_Changer pour deviner
#pop = toolbox.population(n=MU)
pop = toolbox.population_guess()
pop, log = algorithms.eaMuPlusLambda(pop,
toolbox,
mu=MU,
lambda_=LAMBDA,
cxpb=CXPB,
mutpb=MUTPB,
ngen=NGEN,
stats=stats,
halloffame=hof)
gen nevals avg std min max
0 50 [0.] [0.] [0.] [0.]
1 100 [3.54] [3.04111822] [0.] [9.]
2 100 [8.3] [2.0808652] [6.] [15.]
3 100 [12.4] [2.45764115] [10.] [21.]
4 100 [16.38] [1.92758917] [14.] [22.]
5 100 [20.36] [2.10485154] [18.] [29.]
6 100 [24.52] [1.5651198] [22.] [29.]
7 100 [28.02] [1.74917123] [26.] [33.]
8 100 [31.3] [2.21133444] [29.] [39.]
9 100 [35.] [1.69705627] [33.] [40.]
10 100 [38.16] [1.71300905] [36.] [43.]
Groupe avec des valeurs d'évaluation minimale et maximale de 0 = j'ai pu démarrer l'AG à partir de mon propre groupe initial.
Recommended Posts