From dc111a64f8bb3dc91b8f9bf00ef50f11812e15df Mon Sep 17 00:00:00 2001 From: George Lacey Date: Mon, 9 Oct 2017 22:41:27 +0100 Subject: [PATCH] Fully migrate from flags - Copy members to new array - Replace members - Don't remove members from population --- src/main.py | 4 ++-- src/population.py | 27 +++++++++++++++------------ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main.py b/src/main.py index b19beb7..d0767b3 100644 --- a/src/main.py +++ b/src/main.py @@ -23,7 +23,7 @@ for i in range(0, args.iter): cls() print("Epoch: %d " % i) elite = round(args.pop * .1) - crossover = round(args.pop * .8) + crossover = round((args.pop * .8) / 2) pop.advance_generation(elite, crossover) best_fit.append(pop.best_fitness().fitness()) #input("...") @@ -34,5 +34,5 @@ print(pop.best_fitness()) plt.plot(best_fit) plt.xlabel("Epoch") -plt.ylabel("Fitness") +plt.ylabel("Best fitness") plt.show() diff --git a/src/population.py b/src/population.py index 65bc378..9bf6491 100644 --- a/src/population.py +++ b/src/population.py @@ -1,4 +1,4 @@ -from individual import Individual, Flag +from individual import Individual from random import Random rand = Random() @@ -67,26 +67,29 @@ class Population(object): sorted_members = sorted(self.members, key=lambda x: x.fitness(), reverse=True)[:amount] - for member in sorted_members: - self.members.remove(member) - return sorted_members def advance_generation(self, n_elite, n_crossover): new_generation = list() # elitism - for member in self.elite(n_elite): - new_generation.append(member) + #for member in self.elite(n_elite): + #new_generation.append(member) # parent for ind in range(0, n_crossover): - x, y = self.roulette().crossover(self.roulette()) - self.members.append(x) - self.members.append(y) + parent_one = self.roulette() + parent_two = self.roulette() + x, y = parent_one.crossover(parent_two) + new_generation.append(x) + new_generation.append(y) - # persist - [new_generation.append(member) for member in self.members - if member.flag is Flag.UNSET] + while len(new_generation) < len(self.members): + new_generation.append(self.roulette()) + + self.members = new_generation self.mutate(2) + + def remove_member(self, member): + self.members.remove(member)