[PYTHON] Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 1)

Was ist ein Evolutionsalgorithmus?

Der Evolutionsalgorithmus (EA) ist einer der Optimierungsalgorithmen und eine Optimierungsmethode, die natürliche Selektion, Genrekombination, Mutation usw. als Modell enthält.

Evolutionäre Algorithmen sind grob in die folgenden vier Typen unterteilt. --Genetischen Algorithmus

Dieses Mal werden wir uns mit dem genetischen Algorithmus (GA) befassen.

Bibliothek verwendet

Verwenden Sie die folgende Python-Bibliothek namens DEAP. https://deap.readthedocs.io/en/master/

Code

Zielfunktion

Suchen Sie nach dem unten gezeigten Mindestwert für Bird Bunction. $f(x, y) = sin(x)e^{(1-cos(y))^2}+cos(y)e^{(1-sin(x))^2}+(x-y)^2$ Die Vogelfunktion ist eine multimodale Funktion mit einer globalen optimalen Lösung - 106.764537 bei (x, y) = (4.70104, 3.15294), (-1.58214, -3.13024) und vielen lokalen Lösungen.

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,

#Zeichnung
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

Bibliothek importieren

Importieren Sie die erforderlichen Bibliotheken. Da DEAP eine zufällige Bibliothek verwendet, ändern sich die Ergebnisse mit jedem Versuch. Um dies zu vermeiden, verwenden Sie 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)

Erzeugung einer frühen Bevölkerung

Erstellen Sie eine Funktion, um eine erste Person zu generieren. Hier wurden anfängliche Individuen in einem 10 × 10-Gittermuster im Bereich von -10 bis 10 sowohl für x als auch für y erzeugt.

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

Registrieren Sie sich in der Toolbox

Registrieren Sie Methoden wie Auswertung ("Auswertung"), Population ("Population"), Crossover ("Mate"), Mutation ("Mutate") und Auswahl ("Select") in der Toolbox.

Zum Beispiel das folgende `toolbox.register (" mate ", tools.cxBlend, alpha = 0.2)` Dies bedeutet, dass eine Funktion namens tool.cxblend als Crossover-Methode registriert ist (Alpha = 0,2 ist ein Argument von tools.cxBlend).

Die Mischungskreuzung als Kreuzungsmethode, die Gaußsche Mutation als Mutation und das Auswahlformat werden in einem Turnier mit 10 Personen durchgeführt. Wenn Sie die anfängliche Grundgesamtheit angeben möchten, registrieren Sie sie in "populations_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)

Lauf

Wenn Sie bisher eingerichtet haben, funktioniert der Rest mit einfachen Befehlen.

Im folgenden Beispiel werden die Anzahl der bewerteten Personen, der Durchschnittswert, die Standardabweichung, der Maximalwert und der Minimalwert jeder Generation in einem "Logbuch" aufgezeichnet. hofIst eine Abkürzung für Holl of Fame, und Sie können die angegebene Nummer in absteigender Reihenfolge der Bewertung speichern.

Das Argument cxpb von algorithm.eaSimple gibt die Crossover-Rate an, mutpb gibt die Mutationsrate an und ngen gibt die Anzahl der Generationen an. Die Anzahl der Individuen pro Generation beträgt 10 × 10 = 100 Individuen, die die durch "Pop" definierte Person erben. Es ist auch möglich, die anfängliche Stichprobe und die Anzahl der Personen zum Zeitpunkt des Generationswechsels separat anzugeben.

sample_GA.py


#Generieren Sie eine frühe Bevölkerung
pop = toolbox.population_guess()

#Aufbau
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)

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

#Top 3 Personen anzeigen
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]

Global optimale Lösung - konvergiert um 106.765. Da der Algorithmus nicht die Differenzinformationen jedes Einzelnen verwendet, tritt ein winziger Fehler auf.

Zusammenfassung und Eindrücke

Recommended Posts

Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 1)
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
Schneiden Sie einen Teil der Zeichenfolge mit einem Python-Slice aus
Suche nach einer Lösung für das N-Queen-Problem mit einem genetischen Algorithmus (2)
Suche nach einer Lösung für das N-Queen-Problem mit einem genetischen Algorithmus (1)
Hinweis zur Verwendung der Python-Eingabefunktion
Wie man die anfängliche Population mit einem genetischen Algorithmus unter Verwendung von DEAP fixiert
Ermitteln Sie den Mindestwert der Funktion mithilfe der Partikelgruppenoptimierungsmethode (PSO).
Holen Sie sich den Aufrufer einer Funktion in Python
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
Zusammenfassung des kommerziellen Werts von EC-Standorten mithilfe des automatischen Zusammenfassungsalgorithmus LexRank
Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Teil 1 Polynomregression
Die Geschichte der Einführung einer Multi-Faktor-Authentifizierungsfunktion unter Verwendung eines Einmalkennworts in einer Java-Anwendung
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Zeichnen auf Jupyter mit der Plot-Funktion von Pandas
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 1
Kündigen Sie die Wettervorhersage (Regen usw.) von DM als Teil der Funktion des Bots an
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
Der Wert von meta beim Angeben einer Funktion ohne Rückgabewert mit Dask dataframe gilt
Vermeiden Sie die Fallstricke bei der Verwendung eines Mac (für Linux-Benutzer?)
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 1)
Ich habe ein wenig versucht, das Verhalten der Zip-Funktion
Ein Memo, dass ich eine Grundfunktion in Python mit Wiederholung geschrieben habe
Extrahieren Sie den Wert von dict oder list als Zeichenfolge
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
[Python] Wert des Funktionsobjekts (?)
Ein Memorandum zur Verwendung von eigen3
Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
Verstehen Sie die Funktion der Faltung am Beispiel der Bildverarbeitung
Lösung des Planungsproblems der Krankenschwester (Schichtoptimierung) mit einem genetischen Algorithmus
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
So ermitteln Sie die Speicheradresse des Pandas-Datenrahmenwerts
Zählen Sie mit NetworkX den maximal verketteten Teil eines zufälligen Diagramms
So speichern Sie einen Teil eines langen Videos mit OpenCV
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Bewerten Sie die Leistung eines einfachen Regressionsmodells mithilfe der LeaveOneOut-Schnittstellenvalidierung
Rufen Sie den Wert des Dropdown-Menüs mit Python und Selen ab und legen Sie ihn fest
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
[Kaggle] Ich habe mit dem Titanic-Tutorial eine Sammlung von Problemen erstellt
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Finden Sie die Definition des Wertes von errno
Überprüfen Sie den Rückgabewert mit PEP 380
Über den Rückgabewert von pthread_mutex_init ()
Vorsichtsmaßnahmen bei Verwendung der Funktion urllib.parse.quote
Automatisierung der Algorithmusgenerierung mit genetischen Algorithmen
Über den Rückgabewert des Histogramms.
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Die Geschichte des Exportierens eines Programms
Teilen und Verarbeiten eines Datenrahmens mithilfe der Groupby-Funktion
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Latein lernen zum Schreiben eines lateinischen Satzanalyseprogramms (Teil 1)
Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Einführung
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Theorie)
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen