Implement mutation

This commit is contained in:
George Lacey 2017-09-26 16:17:54 +01:00
parent dcfb7f2e34
commit a5a8108e99

View File

@ -18,7 +18,10 @@ class Population(object):
return_string += "%d:\tx: %e\ty: %e\tfit: %e\n" %\ return_string += "%d:\tx: %e\ty: %e\tfit: %e\n" %\
(position, member.x, member.y, member.fitness()) (position, member.x, member.y, member.fitness())
position += 1 position += 1
return_string += "Average fit:\t%e" % self.avg_fitness() return_string += "Average fit:\t%e\n" % self.avg_fitness()
best = self.best_fitness()
return_string += "Best fit:\tx:%e,\ty:%e\tf:%e" %\
(best.x, best.y, best.fitness())
return return_string return return_string
def fitness_function(self): def fitness_function(self):
@ -34,6 +37,14 @@ class Population(object):
def avg_fitness(self): def avg_fitness(self):
return float(self.total_fitness() / len(self.members)) return float(self.total_fitness() / len(self.members))
def best_fitness(self):
best_member = self.members[0]
for member in self.members:
if float(member.fitness()) > best_member.fitness():
best_member = member
return best_member
def roulette(self, divisor=1): def roulette(self, divisor=1):
total = self.total_fitness() / divisor total = self.total_fitness() / divisor
position = rand.uniform(0, total) position = rand.uniform(0, total)
@ -43,6 +54,11 @@ class Population(object):
if position <= 0: if position <= 0:
return member return member
def mutate(self, chance):
for member in self.members:
if rand.randint(0, 1/chance) == 0:
member.mutate()
def advance_generation(self): def advance_generation(self):
self.fitness_function() self.fitness_function()
parents = list() parents = list()
@ -54,4 +70,5 @@ class Population(object):
one, two = self.members[i].crossover(parents[i + 1]) one, two = self.members[i].crossover(parents[i + 1])
children.append(one) children.append(one)
children.append(two) children.append(two)
self.mutate(0.1)
self.members = children self.members = children