Allow multiple instances to run

This commit is contained in:
George Lacey 2017-10-11 17:31:34 +01:00
parent dc111a64f8
commit 858fb48a4b
3 changed files with 45 additions and 32 deletions

32
src/lifecycle.py Normal file
View File

@ -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)

View File

@ -1,38 +1,16 @@
import os import os
import argparse from lifecycle import Lifecycle
from population import Population
from time import sleep
import matplotlib.pyplot as plt
def cls(): def cls():
os.system('cls' if os.name == 'nt' else 'clear') 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() ga.start()
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()
pop = Population(args.pop) ga.generate_graph(show=True)
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()

View File

@ -39,6 +39,9 @@ class Population(object):
return float(self.total_fitness() / len(self.members)) return float(self.total_fitness() / len(self.members))
def best_fitness(self): def best_fitness(self):
return self.best_member().fitness()
def best_member(self):
best_member = self.members[0] best_member = self.members[0]
for member in self.members: for member in self.members:
@ -73,8 +76,8 @@ class Population(object):
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):
@ -89,7 +92,7 @@ class Population(object):
self.members = new_generation self.members = new_generation
self.mutate(2) self.mutate(20)
def remove_member(self, member): def remove_member(self, member):
self.members.remove(member) self.members.remove(member)