From 858fb48a4bf66d67e03e602aaa160eb370545759 Mon Sep 17 00:00:00 2001 From: George Lacey Date: Wed, 11 Oct 2017 17:31:34 +0100 Subject: [PATCH] Allow multiple instances to run --- src/lifecycle.py | 32 ++++++++++++++++++++++++++++++++ src/main.py | 36 +++++++----------------------------- src/population.py | 9 ++++++--- 3 files changed, 45 insertions(+), 32 deletions(-) create mode 100644 src/lifecycle.py diff --git a/src/lifecycle.py b/src/lifecycle.py new file mode 100644 index 0000000..9b20149 --- /dev/null +++ b/src/lifecycle.py @@ -0,0 +1,32 @@ +from population import Population +import matplotlib.pyplot as plt + + +class Lifecycle(object): + def __init__(self, id, params): + self.id = id + self.params = params + self.population = Population(self.params["population_size"]) + self.best_fit = list() + self.average_fit = list() + + def start(self): + for epoch in range(0, self.params["iter"]): + elite = round(self.params["elite"] * self.params["population_size"]) + crossover = round((self.params["crossover"] + * self.params["population_size"]) / 2) + self.population.advance_generation(elite, crossover) + self.best_fit.append(self.population.best_fitness()) + self.average_fit.append(self.population.avg_fitness()) + + def best_member(self): + return self.population.best_member() + + def generate_graph(self, show=False, location=None): + plt.plot(self.best_fit) + plt.xlabel("Epoch") + plt.ylabel("Best fitness") + if show: + plt.show() + if location is not None: + plt.savefig(location) \ No newline at end of file diff --git a/src/main.py b/src/main.py index d0767b3..ffb3f09 100644 --- a/src/main.py +++ b/src/main.py @@ -1,38 +1,16 @@ import os -import argparse -from population import Population -from time import sleep -import matplotlib.pyplot as plt +from lifecycle import Lifecycle def cls(): os.system('cls' if os.name == 'nt' else 'clear') -best_fit = list() +ga = Lifecycle(1, {'population_size': 10, + 'elite': 0.1, + 'crossover': 0.6, + 'iter': 1000}) -args = argparse.ArgumentParser() -args.add_argument("pop", help="Population size", type=int) -args.add_argument("iter", help="Iterations", type=int) -args.add_argument("-w", "--wait", help="Time in seconds to wait between iterations", type=int, default=0) -args = args.parse_args() +ga.start() -pop = Population(args.pop) - -for i in range(0, args.iter): - cls() - print("Epoch: %d " % i) - elite = round(args.pop * .1) - crossover = round((args.pop * .8) / 2) - pop.advance_generation(elite, crossover) - best_fit.append(pop.best_fitness().fitness()) - #input("...") - sleep(args.wait) - -print("Best: ") -print(pop.best_fitness()) - -plt.plot(best_fit) -plt.xlabel("Epoch") -plt.ylabel("Best fitness") -plt.show() +ga.generate_graph(show=True) diff --git a/src/population.py b/src/population.py index 9bf6491..53021d8 100644 --- a/src/population.py +++ b/src/population.py @@ -39,6 +39,9 @@ class Population(object): return float(self.total_fitness() / len(self.members)) def best_fitness(self): + return self.best_member().fitness() + + def best_member(self): best_member = self.members[0] for member in self.members: @@ -73,8 +76,8 @@ class Population(object): 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): @@ -89,7 +92,7 @@ class Population(object): self.members = new_generation - self.mutate(2) + self.mutate(20) def remove_member(self, member): self.members.remove(member)