Code créé la dernière fois https://qiita.com/nmat0031785/items/ceea6f78ab71e9956fce
Le `` algorithms.eaSimple '' utilisé précédemment ne peut laisser des statistiques que pour chaque génération. Améliorer afin que les variables de conception et l'adaptabilité de tous les individus puissent être conservées.
Premièrement, l'adaptabilité n'est calculée que pour l'individu initial. Après cela, les variables de conception, l'adaptabilité, la génération (0 car il s'agit de la génération initiale) et le numéro individuel sont enregistrés dans pd.DataFrame.
sample_GA.py
#Générer une population précoce
pop = toolbox.population_guess()
#Évaluation de l'adaptabilité des premiers individus
fitnesses = toolbox.map(toolbox.evaluate, pop)
for ind, fit in zip(pop, fitnesses):
ind.fitness.values = fit
fits = [ind.fitness.values[0] for ind in pop]
#Stocker l'individu initial dans le journal de bord
logbook = pd.DataFrame([])
t1 = pd.DataFrame(pop)
t1.columns = ["x1", "x2"]
t1 = t1.assign(fits=fits, generation=0, ids=range(len(pop)))
logbook = logbook.append(t1)
Entrez dans la boucle d'évolution. Avec offspring = toolbox.select (pop, POP_SIZE) `` `, les individus pour` `POP_SIZE
sont resélectionnés à partir de la population initiale
pop```. Cela permet de modifier le nombre de populations initiales et de populations dans la boucle d'évolution.
Des nombres aléatoires sont donnés aux individus de chaque génération pendant quelques minutes, et les individus capturés dans CX_PB '' et
MUT_PB '' sont croisés et ciblés pour la mutation. Après cela, l'adaptabilité est réévaluée pour le nouvel individu et ajoutée à pd.DataFrame.
sample_GA.py
#Paramètres
N_GEN = 20 #Nombre de générations répétitives
POP_SIZE = 100 #Nombre d'individus dans la population
CX_PB = 0.8 #Probabilité de croisement
MUT_PB = 0.05 #Probabilité de mutation
#Début de la boucle d'évolution
g = 0
while g < N_GEN:
g = g + 1
#Sélection et duplication d'individus de nouvelle génération
offspring = toolbox.select(pop, POP_SIZE)
offspring = list(map(toolbox.clone, offspring))
#Traversée
for child1, child2 in zip(offspring[::2], offspring[1::2]):
#Sélectionnez les individus à croiser
if random.random() < CX_PB:
toolbox.mate(child1, child2)
#Les individus croisés suppriment l'adaptabilité
del child1.fitness.values
del child2.fitness.values
#Mutation
for mutant in offspring:
#Sélectionnez un individu à muter
if random.random() < MUT_PB:
toolbox.mutate(mutant)
#L'individu muté supprime l'adaptabilité
del mutant.fitness.values
#Réévaluer l'adaptabilité des individus dont l'adaptabilité a été supprimé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
#Mettre à jour la population avec une population de nouvelle génération
pop[:] = offspring
#Extraction de l'adaptabilité de tous les individus de nouvelle génération
fits = [ind.fitness.values[0] for ind in pop]
#Conserver dans le journal de bord
t1 = pd.DataFrame(pop)
t1.columns = ["x1", "x2"]
t1 = t1.assign(fits=fits, generation=g, ids=range(POP_SIZE))
logbook = logbook.append(t1)
#déboguer
print(t1)
terminal
・
・
・
-- Generation 20 --
x1 x2 fits generation ids
0 -1.582142 -3.130247 -106.764537 20 0
1 -1.582142 -3.130247 -106.764537 20 1
2 -1.582142 -3.130247 -106.764537 20 2
3 -1.582142 -3.130247 -106.764537 20 3
4 -1.582142 -3.130247 -106.764537 20 4
.. ... ... ... ... ...
95 -1.582142 -3.130247 -106.764537 20 95
96 -1.582142 -3.130247 -106.764537 20 96
97 -1.582142 -3.130247 -106.764537 20 97
98 -1.582142 -3.130247 -106.764537 20 98
99 -1.582142 -3.130247 -106.764537 20 99
[100 rows x 5 columns]
Enregistrez le résultat au format CSV.
sample_GA.py
logbook.to_csv("result.csv", sep=",", index=None, header=None)
Sortie des variables de conception et adaptabilité de chaque individu. La prochaine fois jusqu'à la visualisation des résultats.
Recommended Posts