[PYTHON] Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)

Dernière fois

Code créé la dernière fois https://qiita.com/nmat0031785/items/ceea6f78ab71e9956fce

Enregistrement des résultats d'optimisation

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.

Génération et évaluation de la population initiale

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)

Boucle d'évolution

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]

sauvegarder

Enregistrez le résultat au format CSV.

sample_GA.py


logbook.to_csv("result.csv", sep=",", index=None, header=None)

Résumé

Sortie des variables de conception et adaptabilité de chaque individu. La prochaine fois jusqu'à la visualisation des résultats.

Recommended Posts

Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 1)
Trouvez la valeur minimale de la fonction par la méthode d'optimisation du groupe de particules (PSO)
Trouver une solution au problème N-Queen avec un algorithme génétique (2)
Trouver l'index de la valeur maximale (valeur minimale) d'un tableau multidimensionnel
Trouver une solution au problème N-Queen avec un algorithme génétique (1)
La valeur de meta lors de la spécification d'une fonction sans valeur de retour avec Dask dataframe s'applique
Trouvez la fonction de transfert du système à un degré de liberté avec PythonControl.
Si vous donnez une liste avec l'argument par défaut de la fonction ...
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Compter la partie concaténée maximale d'un graphe aléatoire avec NetworkX
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
Trouvez la valeur SHA256 avec R (avec bonus)
Rechercher le labyrinthe avec l'algorithme python A *
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (théorie)
Comment réparer la population initiale avec un algorithme génétique utilisant DEAP
Tweet les prévisions météo avec le bot Partie 2
Trouvez la valeur de l'humeur avec python (Rike Koi)
Trouvez la position au-dessus du seuil avec NumPy
Récupérer l'appelant d'une fonction en Python
Trouvez le nombre de jours dans un mois
Découvrez la fraction de la valeur saisie en python
Découvrez le jour par date / heure
Visualisez le comportement de l'algorithme de tri avec matplotlib
Trouvez l'itinéraire le plus court avec l'algorithme de Python Dijkstra
Calcul séquentiel de la valeur moyenne avec l'algorithme en ligne
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (résultat de l'exécution)
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
[Vérification] Essayez d'aligner le groupe de points avec la fonction d'optimisation de pytorch Partie 1
Dessinez un graphique avec PyQtGraph Partie 5-Augmentez l'axe Y
Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Partie 1 Régression polynomiale
Calculer la somme des valeurs uniques par tabulation croisée des pandas
Découpez une partie de la chaîne à l'aide d'une tranche Python
Prenez des captures d'écran LCD avec Python-LEGO Mindstorms
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
Prenez la valeur du thermo-hygromètre SwitchBot avec Raspberry Pi
Changer les valeurs du thermo-hygromètre Bot avec Raspberry Pi
Découvrez l'emplacement des packages installés avec pip
Visualisez le vocabulaire caractéristique d'un document avec D3.js
Tweetez la probabilité de précipitations dans le cadre de la fonction de bot
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ②
Annoncer les prévisions météorologiques (pluie, etc.) par DM dans le cadre de la fonction de bot
Calculer le produit des matrices avec une expression de caractère?
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
J'ai essayé de trouver l'entropie de l'image avec python
Découvrez la largeur apparente d'une chaîne en python
Un diagramme de réseau a été créé avec les données du COVID-19.
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Mesurer l'importance des entités avec un outil de forêt aléatoire
Obtenez l'identifiant d'un GPU avec une faible utilisation de la mémoire
Obtenez UNIXTIME au début d'aujourd'hui avec une commande
Hériter de la bibliothèque standard pour trouver la valeur moyenne de Queue
[Python] Essayez d'optimiser les paramètres de systole FX avec un algorithme génétique
Votre URL n'a pas répondu avec la valeur du paramètre de défi.
J'ai fait une fonction pour vérifier le modèle de DCGAN