Ich möchte die genetische Algorithmusbibliothek Deap vorstellen, die mit Python verwendet werden kann. Es gibt eine andere genetische Algorithmusbibliothek für Python namens Pyevolve, aber Deap scheint in der Entwicklung aktiver zu sein, daher würde ich diese gerne verwenden. Ich werde. Nachfolgend sind die wichtigsten in Deap verfügbaren Algorithmen und Funktionen aufgeführt.
Example Dieses Mal werde ich das Beispiel von GA erklären. Importieren Sie zunächst das Modul.
import random
from deap import base
from deap import creator
from deap import tools
creator erbt die Basisklasse und erstellt eine neue Klasse.
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
In der ersten Zeile wird eine Anpassungsklasse erstellt, die durch Maximieren der Anpassung optimiert wird. Gewichte sind ein Array, aber für die Einzweckoptimierung ist Größe 1 in Ordnung (obwohl "," notwendig zu sein scheint), und für die Mehrzweckoptimierung sind die Gewichte für jeden Zweck angeordnet. Stellen Sie (-1.0,) ein, um durch Minimieren zu optimieren.
toolbox = base.Toolbox()
# Attribute generator
toolbox.register("attr_bool", random.randint, 0, 1)
# Structure initializers
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_bool, 100)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox erstellt eine Funktion. Im Register in der 3. Zeile wird eine Funktion namens attr_bool erstellt, indem random.randint 0,1 Argumente gegeben wird. attr_bool ist eine Funktion, die zufällig 0 oder 1 generiert. initRepeat ist eine Funktion, die im Voraus in der Toolbox vorbereitet wird. Das erste Argument ist der Typ des Containers, in dem die Daten gespeichert sind, das zweite ist die Funktion, die einzelne Daten generiert, und das dritte ist die Größe des Containers. Hier werden aus initRepeat eine Funktion namens Individuum (Individuum) und eine Funktion namens Population (Gruppe) erstellt. Erstellen Sie als Nächstes Bewertungsfunktionen, Schnittpunkte, Mutationen und Auswahlfunktionen. (Beachten Sie, dass der Rückgabewert der Auswertungsfunktion ein "," enthält.)
def evalOneMax(individual):
return sum(individual),
toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoints)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selTournament, tournsize=3)
Nachdem die GA-Einstellungen abgeschlossen sind, erstellen wir die eigentliche Evolutionsberechnungsroutine.
def main():
random.seed(64)
#Generieren Sie eine frühe Bevölkerung
pop = toolbox.population(n=300)
CXPB, MUTPB, NGEN = 0.5, 0.2, 40 #Kreuzungswahrscheinlichkeit, Mutationswahrscheinlichkeit, Anzahl der Schleifen in der Evolutionsberechnung
print("Start of evolution")
#Bewertung der frühen Bevölkerung
fitnesses = list(map(toolbox.evaluate, pop))
for ind, fit in zip(pop, fitnesses):
ind.fitness.values = fit
print(" Evaluated %i individuals" % len(pop))
#Die Evolutionsberechnung wurde gestartet
for g in range(NGEN):
print("-- Generation %i --" % g)
#Wählen Sie die Bevölkerung der nächsten Generation aus
offspring = toolbox.select(pop, len(pop))
#Klonen Sie die Bevölkerung
offspring = list(map(toolbox.clone, offspring))
#Wenden Sie Kreuzung und Mutation auf ausgewählte Populationen an
#Nehmen Sie gerade und ungerade Individuen heraus und kreuzen Sie sie
for child1, child2 in zip(offspring[::2], offspring[1::2]):
if random.random() < CXPB:
toolbox.mate(child1, child2)
del child1.fitness.values
del child2.fitness.values
for mutant in offspring:
if random.random() < MUTPB:
toolbox.mutate(mutant)
del mutant.fitness.values
#Berechnen Sie die Eignung, indem Sie Personen sammeln, für die die Eignung nicht berechnet wurde
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
print(" Evaluated %i individuals" % len(invalid_ind))
#Machen Sie den Nachwuchs der nächsten Generation
pop[:] = offspring
#Ordnen Sie die Eignung aller Personen
fits = [ind.fitness.values[0] for ind in pop]
length = len(pop)
mean = sum(fits) / length
sum2 = sum(x*x for x in fits)
std = abs(sum2 / length - mean**2)**0.5
print(" Min %s" % min(fits))
print(" Max %s" % max(fits))
print(" Avg %s" % mean)
print(" Std %s" % std)
print("-- End of (successful) evolution --")
best_ind = tools.selBest(pop, 1)[0]
print("Best individual is %s, %s" % (best_ind, best_ind.fitness.values))
Danach können Sie diese Hauptfunktion wie `if __name__ ==" __main__ ": main ()`
aufrufen.
Start of evolution
Evaluated 300 individuals
-- Generation 0 --
Evaluated 189 individuals
Min 40.0
Max 65.0
Avg 54.7433333333
Std 4.46289766358
-- Generation 1 --
Evaluated 171 individuals
Min 44.0
Max 70.0
Avg 58.48
Std 3.98533980149
...(Unterwegs weggelassen)...
-- Generation 38 --
Evaluated 180 individuals
Min 89.0
Max 100.0
Avg 97.7466666667
Std 2.32719191779
-- Generation 39 --
Evaluated 196 individuals
Min 88.0
Max 100.0
Avg 98.1833333333
Std 2.33589145486
-- End of (successful) evolution --
Best individual is [True, 1, 1, 1, 1, 1, True, 1, 1, 1, 1, True, 1, 1, 1, 1, True, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, True, True, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, True, 1, 1, 1, 1, True, True, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], (100.0,)
Obwohl 1 und True im Array gemischt sind, ist ersichtlich, dass die optimale Lösung erforderlich ist, wahrscheinlich weil es sich um ein Problem der Schnitt- oder Mutationsfunktion handelt.
Deap Beispiel: http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax.html
Recommended Posts