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

Qu'est-ce qu'un algorithme d'évolution?

L'algorithme évolutif (EA) est l'un des algorithmes d'optimisation et est une méthode d'optimisation qui incorpore la sélection naturelle, la recombinaison génique, la mutation, etc. comme modèle.

Les algorithmes évolutifs sont approximativement divisés en quatre types suivants. --Algorithme génétique

Cette fois, nous traiterons de l'algorithme génétique (GA).

Bibliothèque utilisée

Utilisez la bibliothèque Python suivante appelée DEAP. https://deap.readthedocs.io/en/master/

code

Fonction objective

Recherchez la valeur minimale de Bird Bunction indiquée ci-dessous. $f(x, y) = sin(x)e^{(1-cos(y))^2}+cos(y)e^{(1-sin(x))^2}+(x-y)^2$ La fonction Bird est une fonction multimodale avec une solution globale optimale-106.764537 en (x, y) = (4.70104, 3.15294), (-1.58214, -3.13024) et de nombreuses solutions locales autour d'elle.

sample_GA.py


import numpy as np
def bird(x):
    x1 = x[0]
    x2 = x[1]
    t = np.sin(x1)*np.exp((1-np.cos(x2))**2) + np.cos(x2)*np.exp((1-np.sin(x1))**2) + (x1-x2)**2 
    return t,

#dessin
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
c1 = c2 = np.arange(-10, 10, 0.1)
xx, yy = np.meshgrid(c1, c2)
len=np.size(c1)  
z=np.empty((len, len))
for i in range(len):
    for j in range(len):
        xin=np.array([xx[i,j], yy[i,j]])
        z[i,j], = bird(xin)
fig0 = plt.figure(figsize=(12,12), dpi=80).add_subplot(111, projection='3d')
fig0.plot_surface(xx, yy, z, alpha=1)
plt.xlim(10, -10)            
plt.ylim(-10, 10)

Figure 2020-08-11 151135.png

Importer la bibliothèque

Importez les bibliothèques requises. Puisque DEAP utilise une bibliothèque aléatoire, les résultats changent à chaque essai. Pour éviter cela, utilisez random.seed (1).

sample_GA.py



import pandas as pd
import random
from deap import algorithms
from deap import base,creator,tools
# random.seed(1)

Génération de population précoce

Créez une fonction pour générer un individu initial. Ici, les individus initiaux ont été générés dans un modèle de grille 10 × 10 dans la plage de -10 à 10 pour x et y.

sample_GA.py


def initPopulation(pcls, ind_init):
    x = np.linspace(-10, 10, 10)
    y = np.linspace(-10, 10, 10)
    inix, iniy = np.meshgrid(x,y)
    contents = np.concatenate([inix.reshape([-1,1]), iniy.reshape([-1,1])], axis=1)
    pcls = [ind_init(c) for c in contents]
    return pcls

Inscrivez-vous dans la boîte à outils

Enregistrez des méthodes telles que l'évaluation ("évaluer"), la population ("population"), le croisement ("mate"), la mutation ("muter") et la sélection ("sélectionner") dans la boîte à outils.

Par exemple, le suivant toolbox.register ("mate", tools.cxBlend, alpha = 0.2) ` Cela signifie qu'une fonction appelée tool.cxblend est enregistrée en tant que méthode de croisement (alpha = 0.2 est un argument de tools.cxBlend).

Le croisement par mélange comme méthode de croisement, la mutation gaussienne comme mutation et le format de sélection seront menés dans un tournoi de 10 individus. Si vous souhaitez spécifier la population initiale, enregistrez-la dans "population_guess".

sample_GA.py


creator.create("FitnessMax", base.Fitness, weights=(-1.0,))
creator.create("Individual", np.ndarray, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
toolbox.register("evaluate", bird)
toolbox.register("population_guess", initPopulation, list, creator.Individual)
toolbox.register("mate", tools.cxBlend, alpha=0.2)
toolbox.register("mutate", tools.mutGaussian, mu=[0.0, 0.0], sigma=[2.0, 2.0], indpb=1)
toolbox.register("select", tools.selTournament, tournsize=10)

Courir

Si vous avez configuré jusqu'à présent, le reste fonctionnera avec des commandes simples.

Dans l'exemple ci-dessous, le nombre d'individus évalués, la valeur moyenne, l'écart type, la valeur maximale et la valeur minimale de chaque génération sont enregistrés dans le `` journal de bord ''. hofEst une abréviation pour holl of fame, et vous pouvez enregistrer le nombre spécifié dans l'ordre décroissant d'évaluation.

L'argument cxpb de algorithms.eaSimple indique le taux de croisement, mutpb indique le taux de mutation et ngen indique le nombre de générations. Le nombre d'individus par génération sera de 10 × 10 = 100 individus, héritant de celui défini par `` pop ''. Il est également possible de spécifier séparément l'échantillonnage initial et le nombre d'individus au moment du changement de génération.

sample_GA.py


#Générer une population précoce
pop = toolbox.population_guess()

#Réglage
hof = tools.HallOfFame(5, similar=np.array_equal)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", np.mean)
stats.register("std", np.std)
stats.register("min", np.min)
stats.register("max", np.max)

#Courir
pop, logbook= algorithms.eaSimple(pop, toolbox,
                        cxpb=0.9, mutpb=0.1, ngen=20,
                        stats=stats, halloffame=hof, verbose=True)

#Afficher les 3 meilleurs individus
print("holl of fame.1 : %s" % (hof[0]))
print("holl of fame.2 : %s" % (hof[1]))
print("holl of fame.3 : %s" % (hof[2]))

terminal


gen	nevals	avg    	std    	min     	max   
0  	100   	80.0665	99.3005	-83.8352	414.98
1  	74    	7.49092	62.2371	-103.255	301.724
2  	89    	11.499 	108.449	-105.693	665.594
3  	84    	-60.283	53.2721	-106.71 	161.645
4  	87    	-95.3896	32.299 	-106.723	40.9594
5  	75    	-99.3516	28.4967	-106.758	23.0967
6  	73    	-104.068	15.7185	-106.764	4.33984
7  	76    	-103.476	18.6955	-106.764	10.0824
8  	80    	-101.665	22.5172	-106.764	16.8155
9  	92    	-102.631	20.6472	-106.764	26.921 
10 	77    	-102.882	19.2791	-106.764	6.34586
11 	90    	-99.4555	30.4939	-106.764	56.3788
12 	89    	-100.566	27.1489	-106.764	30.2934
13 	79    	-100.978	25.2596	-106.764	51.745 
14 	78    	-98.4071	32.1796	-106.764	85.5625
15 	76    	-105.728	10.3096	-106.764	-3.14868
16 	89    	-95.2292	38.3427	-106.764	80.6272 
17 	91    	-102.44 	25.6436	-106.764	96.6545 
18 	80    	-105.432	11.2501	-106.764	4.33866 
19 	83    	-102.271	23.504 	-106.764	67.6912 
20 	79    	-103.856	16.5553	-106.764	-3.86946
holl of fame.1 : [4.70021671 3.1529326 ]
holl of fame.2 : [4.70021671 3.15293287]
holl of fame.3 : [4.70021671 3.15293358]

Solution globale optimale - Convergence autour de 106.765. Puisque l'algorithme n'utilise pas les informations différentielles de chaque individu, une erreur minime se produira.

Résumé et impressions

Recommended Posts

Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 1)
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
Découpez une partie de la chaîne à l'aide d'une tranche Python
Trouver une solution au problème N-Queen avec un algorithme génétique (2)
Trouver une solution au problème N-Queen avec un algorithme génétique (1)
Un mémorandum sur l'utilisation de la fonction d'entrée de Python
Comment réparer la population initiale avec un algorithme génétique utilisant DEAP
Trouvez la valeur minimale de la fonction par la méthode d'optimisation du groupe de particules (PSO)
Récupérer l'appelant d'une fonction en Python
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Résumer la valeur commerciale des sites EC à l'aide de l'algorithme de synthèse automatique LexRank
Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Partie 1 Régression polynomiale
L'histoire de l'introduction d'une fonction d'authentification multifacteur utilisant un mot de passe à usage unique dans une application Java
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
Dessinez sur Jupyter en utilisant la fonction de tracé des pandas
Explication du concept d'analyse de régression à l'aide de Python Partie 1
Annoncer les prévisions météorologiques (pluie, etc.) par DM dans le cadre de la fonction de bot
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
La valeur de meta lors de la spécification d'une fonction sans valeur de retour avec Dask dataframe s'applique
Éviter les pièges de l'utilisation d'un Mac (pour les utilisateurs Linux?)
J'ai fait une fonction pour vérifier le modèle de DCGAN
J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 1)
J'ai essayé un peu le comportement de la fonction zip
Un mémo que j'ai écrit une fonction de base en Python en utilisant la récurrence
Extraire la valeur de dict ou list sous forme de chaîne de caractères
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
[python] Valeur de l'objet fonction (?)
Un mémorandum d'utilisation de eigen3
Lors de l'incrémentation de la valeur d'une clé qui n'existe pas
Comprendre la fonction de convolution en utilisant le traitement d'image comme exemple
Résolution du problème d'horaire des infirmières (optimisation des équipes) avec un algorithme génétique
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
Une fonction qui mesure le temps de traitement d'une méthode en python
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
Comment enregistrer une partie d'une longue vidéo en utilisant OpenCV
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Évaluer les performances d'un modèle de régression simple à l'aide de la validation d'intersection LeaveOneOut
Obtenez et définissez la valeur du menu déroulant en utilisant Python et Selenium
Créez une fonction pour obtenir le contenu de la base de données dans Go
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
[Kaggle] J'ai fait une collection de problèmes en utilisant le didacticiel Titanic
Django super introduction par les débutants Python! Partie 3 J'ai essayé d'utiliser la fonction d'héritage de fichier de modèle
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
Trouvez la définition de la valeur de errno
Vérifiez la valeur de retour avec PEP 380
À propos de la valeur de retour de pthread_mutex_init ()
Précautions lors de l'utilisation de la fonction urllib.parse.quote
Automatisation de la génération d'algorithmes à l'aide d'algorithmes génétiques
À propos de la valeur de retour de l'histogramme.
[Python] Faire de la fonction une fonction lambda
L'histoire de l'exportation d'un programme
Comment diviser et traiter une trame de données à l'aide de la fonction groupby
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Apprendre le latin dans le but d'écrire un programme d'analyse de phrases latines (partie 1)
Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Introduction
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (théorie)
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique