Code, der zuletzt erstellt wurde https://qiita.com/nmat0031785/items/ceea6f78ab71e9956fce
Die zuvor verwendeten `` `algorithm.eaSimple``` können nur Statistiken für jede Generation hinterlassen. Verbessern Sie, damit die Entwurfsvariablen und die Anpassungsfähigkeit aller Personen erhalten bleiben.
Zunächst wird die Anpassungsfähigkeit nur für die ursprüngliche Person berechnet. Danach werden die Entwurfsvariablen, die Anpassungsfähigkeit, die Generierung (0, da es sich um die erste Generierung handelt) und die individuelle Nummer in pd.DataFrame gespeichert.
sample_GA.py
#Generieren Sie eine frühe Bevölkerung
pop = toolbox.population_guess()
#Bewertung der Anpassungsfähigkeit früher Personen
fitnesses = toolbox.map(toolbox.evaluate, pop)
for ind, fit in zip(pop, fitnesses):
ind.fitness.values = fit
fits = [ind.fitness.values[0] for ind in pop]
#Speichern Sie die erste Person im Logbuch
logbook = pd.DataFrame([])
t1 = pd.DataFrame(pop)
t1.columns = ["x1", "x2"]
t1 = t1.assign(fits=fits, generation=0, ids=range(len(pop)))
logbook = logbook.append(t1)
Betreten Sie die Evolutionsschleife. Mit `offspring = toolbox.select (pop, POP_SIZE)`
werden die Personen für
POP_SIZE aus der ursprünglichen Population`` pop
erneut ausgewählt. Dies ermöglicht es, die Anzahl der Anfangspopulationen und Populationen in der Evolutionsschleife zu ändern.
Individuen jeder Generation erhalten Minuten lang Zufallszahlen, und Individuen, die in "CX_PB" und "MUT_PB" gefangen wurden, werden gekreuzt und auf Mutation ausgerichtet. Danach wird die Anpassungsfähigkeit für die neue Person neu bewertet und zu pd.DataFrame hinzugefügt.
sample_GA.py
#Parameter
N_GEN = 20 #Anzahl der sich wiederholenden Generationen
POP_SIZE = 100 #Anzahl der Personen in der Bevölkerung
CX_PB = 0.8 #Übergangswahrscheinlichkeit
MUT_PB = 0.05 #Mutationswahrscheinlichkeit
#Start der Evolutionsschleife
g = 0
while g < N_GEN:
g = g + 1
#Auswahl und Vervielfältigung von Personen der nächsten Generation
offspring = toolbox.select(pop, POP_SIZE)
offspring = list(map(toolbox.clone, offspring))
#Kreuzung
for child1, child2 in zip(offspring[::2], offspring[1::2]):
#Wählen Sie die zu kreuzenden Personen aus
if random.random() < CX_PB:
toolbox.mate(child1, child2)
#Gekreuzte Personen entfernen Anpassungsfähigkeit
del child1.fitness.values
del child2.fitness.values
#Mutation
for mutant in offspring:
#Wählen Sie eine Person aus, die mutiert werden soll
if random.random() < MUT_PB:
toolbox.mutate(mutant)
#Das mutierte Individuum entfernt die Anpassungsfähigkeit
del mutant.fitness.values
#Bewerten Sie die Anpassungsfähigkeit von Personen neu, deren Anpassungsfähigkeit gestrichen 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
#Aktualisieren Sie die Bevölkerung mit einer neuen Generation
pop[:] = offspring
#Extraktion der Anpassungsfähigkeit aller Individuen der neuen Generation
fits = [ind.fitness.values[0] for ind in pop]
#Im Logbuch speichern
t1 = pd.DataFrame(pop)
t1.columns = ["x1", "x2"]
t1 = t1.assign(fits=fits, generation=g, ids=range(POP_SIZE))
logbook = logbook.append(t1)
#debuggen
print(t1)
terminal
・
・
・
-- Generation 20 --
x1 x2 fits generation ids
0 -1.582142 -3.130247 -106.764537 20 0
1 -1.582142 -3.130247 -106.764537 20 1
2 -1.582142 -3.130247 -106.764537 20 2
3 -1.582142 -3.130247 -106.764537 20 3
4 -1.582142 -3.130247 -106.764537 20 4
.. ... ... ... ... ...
95 -1.582142 -3.130247 -106.764537 20 95
96 -1.582142 -3.130247 -106.764537 20 96
97 -1.582142 -3.130247 -106.764537 20 97
98 -1.582142 -3.130247 -106.764537 20 98
99 -1.582142 -3.130247 -106.764537 20 99
[100 rows x 5 columns]
Speichern Sie das Ergebnis als CSV.
sample_GA.py
logbook.to_csv("result.csv", sep=",", index=None, header=None)
Ausgabe von Designvariablen und Anpassungsfähigkeit jedes Einzelnen. Nächstes Mal bis zur Ergebnisvisualisierung.
Recommended Posts