Mit der Python-Bibliothek DEAP können Sie problemlos Simulationen mit dem genetischen Algorithmus (GA) durchführen. Zu diesem Zeitpunkt kann es wünschenswert sein, die anfängliche Gruppe zu fixieren, beispielsweise aufgrund von Vorkenntnissen über die optimale Lösung und dem Wunsch, die Berechnungszeit zu verkürzen.
Wenn ich mich beispielsweise für die Auswahl von Funktionen für maschinelles Lernen wie dieses Beispiel bewerbe, möchte ich mit dem besten Modell beginnen, das ich bisher ausprobiert habe. Es kann in Betracht genommen werden. Wenn es 100 bis mehrere Hundert sind, ist es nicht notwendig, den Anfangswert festzulegen, aber es besteht eine Nachfrage nach Menschen, die ungefähr 100.000 Merkmale mechanisch erstellt haben, ohne vorher nachzudenken.
Im offiziellen Dokument finden Sie eine Anleitung zum Umgang mit solchen Fällen. Es gibt nicht viele Informationen im Web, die ich tatsächlich getestet habe, daher werde ich sie hier auflisten.
GA-Implementierung, die den Gesamtwert des Arrays maximiert, das aus 0 oder 1 als Bewertungsfunktion besteht Die optimale Lösung ist ein Array von 1, und der Maximalwert der Bewertungsfunktion ist die Länge des Arrays. http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax.html http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax_short.html
#Bibliotheksimport
import numpy as np
import random
from deap import algorithms
from deap import base
from deap import creator
from deap import tools
Gesamtwert eines Arrays aus 100 Elementen, bestehend aus 0 oder 1
def evalOneMax(individual):
return sum(individual), #Fügen Sie ein Komma hinzu, auch wenn es nur einen Rückgabewert gibt
Fügen Sie dem Ersteller mit create FitnessMax- und Individual-Methoden hinzu. Bewerten Sie die Maximierung der Bewertungsfunktion durch Setzen von Gewichten = (1.0,).
creator.create("FitnessMax", base.Fitness, weights=(1.0,)) #Fügen Sie ein Komma hinzu, auch wenn es nur ein Argument gibt
creator.create("Individual", list, fitness=creator.FitnessMax)
Fügen Sie der Toolbox mit resister eine Methode mit dem Namen der ersten Variablen hinzu.
toolbox.attr_bool
: random.randint(0,1)
toolbox.individual
: 01 Zufallszahl mit toolbox.attr_bool> 100 Mal mit tools.initRepeat wiederholen Eine Liste mit 100 Elementen erstellen (= einzelne Generation)
toolbox.polulation
: Wiederholen Sie die individuelle Generierung durch toolbox.individual, um eine Population zu erstellen
del toolbox
toolbox = base.Toolbox()
# Attribute generator
toolbox.register("attr_bool", random.randint, 0.0, 1.0)
# Structure initializers
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_bool, 100)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
Dann die Methode, die für die GA-Ausführung durch algorithm.eaMuPlusLambda
erforderlich ist
Definieren Sie toolbox.evaluate
(Auswertung), toolbox.mate
(Crossover), toolbox.mutate
(Mutation), toolbox.select
(Auswahl).
Sie können wie folgt mit deap.tools
schreiben.
toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selNSGA2)
Pop: Anfangsgruppe hof: Erhaltung der besten Individuen Statistiken: Speichern von Statistiken für Funktionen zur Bevölkerungsbewertung
"""Einstellung des genetischen Algorithmus
Bis zur NGEN-Generation
Bevölkerung der 1. Generation LAMBDA
Anzahl der Personen, die an die MU der nächsten Generation weitergegeben werden sollen
Übergangswahrscheinlichkeit CXPB
Mutationswahrscheinlichkeit MUTPB
"""
random.seed(4)
NGEN = 10
MU = 50
LAMBDA = 100
CXPB = 0.7
MUTPB = 0.3
#Bevölkerungsschaffung
pop = toolbox.population(n=MU)
hof = tools.HallOfFame(1)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", np.mean, axis=0)
stats.register("std", np.std, axis=0)
stats.register("min", np.min, axis=0)
stats.register("max", np.max, axis=0)
algorithm.eaMuPlusLambda
pop, log = algorithms.eaMuPlusLambda(pop,
toolbox,
mu=MU,
lambda_=LAMBDA,
cxpb=CXPB,
mutpb=MUTPB,
ngen=NGEN,
stats=stats,
halloffame=hof)
gen nevals avg std min max
0 50 [50.32] [4.71355492] [41.] [63.]
1 100 [56.] [2.02977831] [53.] [63.]
2 100 [59.3] [2.3] [57.] [68.]
3 100 [62.56] [2.03135423] [60.] [69.]
4 100 [65.58] [1.96051014] [63.] [72.]
5 100 [68.46] [1.52590956] [66.] [73.]
6 100 [70.4] [1.34164079] [69.] [74.]
7 100 [72.36] [1.10923397] [71.] [76.]
8 100 [74.06] [1.06602064] [73.] [77.]
9 100 [75.38] [0.79724526] [74.] [77.]
10 100 [76.36] [0.62481997] [76.] [78.]
Da es mit einer Zufallszahl begann, liegt der Bewertungswert der ursprünglichen Person zwischen 41 und 63. Es ist in der 10. Generation nicht konvergiert, aber es ist in Ordnung, weil der Zweck nicht darin besteht, zu konvergieren.
Wenn Sie die ursprüngliche Gruppe auf einen bestimmten Wert festlegen und starten möchten, schreiben Sie den entsprechenden Teil des offiziellen Dokuments wie folgt neu.
Erstellen Sie eine Liste der selbst erstellten Grundgesamtheit = Einzelpersonen. Wenn Sie beispielsweise den genetischen Algorithmus aus der Klonpopulation L00 eines Individuums starten möchten, das aus allen Nullen besteht, ist dies wie folgt.
MU = 50
# individual
L0 = [0] * 100
# list of individuals
L00 = [L0] * MU
Gleich wie 1-2.
Definieren Sie eine Methode toolbox.population_guess
, die toolbox.population
ersetzt.
toolbox = base.Toolbox()
# population_Funktionen, die beim Erraten verwendet werden
def initPopulation(pcls, ind_init, file):
return pcls(ind_init(c) for c in file)
# population_Erstellen einer Schätzmethode
# creator.Fügen Sie jedem Individuum Fitness für Individuum hinzu
toolbox.register("population_guess", initPopulation, list, creator.Individual, L00)
#Hier zusammen
toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selNSGA2)
hof und stat sind gleich, also weggelassen
#Bevölkerung der ersten individuellen Generation_Ändern Sie zu raten
#pop = toolbox.population(n=MU)
pop = toolbox.population_guess()
algorithm.eaMuPlusLambda
pop, log = algorithms.eaMuPlusLambda(pop,
toolbox,
mu=MU,
lambda_=LAMBDA,
cxpb=CXPB,
mutpb=MUTPB,
ngen=NGEN,
stats=stats,
halloffame=hof)
gen nevals avg std min max
0 50 [0.] [0.] [0.] [0.]
1 100 [3.54] [3.04111822] [0.] [9.]
2 100 [8.3] [2.0808652] [6.] [15.]
3 100 [12.4] [2.45764115] [10.] [21.]
4 100 [16.38] [1.92758917] [14.] [22.]
5 100 [20.36] [2.10485154] [18.] [29.]
6 100 [24.52] [1.5651198] [22.] [29.]
7 100 [28.02] [1.74917123] [26.] [33.]
8 100 [31.3] [2.21133444] [29.] [39.]
9 100 [35.] [1.69705627] [33.] [40.]
10 100 [38.16] [1.71300905] [36.] [43.]
Eine Gruppe mit einem minimalen Bewertungswert von 0 und einem maximalen Wert von 0 = Ich konnte GA von meiner eigenen Anfangsgruppe aus starten.
Recommended Posts