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.
Verwenden Sie die folgende Python-Bibliothek namens DEAP. https://deap.readthedocs.io/en/master/
Suchen Sie nach dem unten gezeigten Mindestwert für Bird Bunction.
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)
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)
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 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)
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.
hof
Ist 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.
Recommended Posts