Fully migrate from flags

- Copy members to new array
- Replace members
- Don't remove members from population
This commit is contained in:
George Lacey 2017-10-09 22:41:27 +01:00
parent 20fb79ef76
commit dc111a64f8
2 changed files with 17 additions and 14 deletions

View File

@ -23,7 +23,7 @@ for i in range(0, args.iter):
cls() cls()
print("Epoch: %d " % i) print("Epoch: %d " % i)
elite = round(args.pop * .1) elite = round(args.pop * .1)
crossover = round(args.pop * .8) crossover = round((args.pop * .8) / 2)
pop.advance_generation(elite, crossover) pop.advance_generation(elite, crossover)
best_fit.append(pop.best_fitness().fitness()) best_fit.append(pop.best_fitness().fitness())
#input("...") #input("...")
@ -34,5 +34,5 @@ print(pop.best_fitness())
plt.plot(best_fit) plt.plot(best_fit)
plt.xlabel("Epoch") plt.xlabel("Epoch")
plt.ylabel("Fitness") plt.ylabel("Best fitness")
plt.show() plt.show()

View File

@ -1,4 +1,4 @@
from individual import Individual, Flag from individual import Individual
from random import Random from random import Random
rand = Random() rand = Random()
@ -67,26 +67,29 @@ class Population(object):
sorted_members = sorted(self.members, key=lambda sorted_members = sorted(self.members, key=lambda
x: x.fitness(), reverse=True)[:amount] x: x.fitness(), reverse=True)[:amount]
for member in sorted_members:
self.members.remove(member)
return sorted_members return sorted_members
def advance_generation(self, n_elite, n_crossover): def advance_generation(self, n_elite, n_crossover):
new_generation = list() new_generation = list()
# elitism # elitism
for member in self.elite(n_elite): #for member in self.elite(n_elite):
new_generation.append(member) #new_generation.append(member)
# parent # parent
for ind in range(0, n_crossover): for ind in range(0, n_crossover):
x, y = self.roulette().crossover(self.roulette()) parent_one = self.roulette()
self.members.append(x) parent_two = self.roulette()
self.members.append(y) x, y = parent_one.crossover(parent_two)
new_generation.append(x)
new_generation.append(y)
# persist while len(new_generation) < len(self.members):
[new_generation.append(member) for member in self.members new_generation.append(self.roulette())
if member.flag is Flag.UNSET]
self.members = new_generation
self.mutate(2) self.mutate(2)
def remove_member(self, member):
self.members.remove(member)