Added tolerance-based termination

This commit is contained in:
SimpleArt
2020-11-09 15:58:09 -05:00
parent 4902e7c931
commit 7a8f16c622
2 changed files with 24 additions and 3 deletions

View File

@ -12,12 +12,31 @@ class Termination_Methods:
if ga.fitness_goal is not None:
# If minimum fitness goal reached, stop ga.
if ga.target_fitness_type == 'min' and ga.get_chromosome_fitness(0) >= ga.convert_fitness(ga.fitness_goal):
if ga.target_fitness_type == 'min' and ga.population.get_chromosome(0).get_fitness() <= ga.fitness_goal:
return False
# If maximum fitness goal reached, stop ga.
elif ga.target_fitness_type == 'max' and ga.get_chromosome_fitness(0) >= ga.convert_fitness(ga.fitness_goal):
elif ga.target_fitness_type == 'max' and ga.population.get_chromosome(0).get_fitness() >= ga.fitness_goal:
return False
# If generation goal is set, check it.
return ga.generation_goal is None or ga.current_generation < ga.generation_goal
if ga.generation_goal is not None and ga.current_generation >= ga.generation_goal:
return False
# If tolerance is set, check it.
if ga.tolerance_goal is not None:
best_fitness = ga.population.get_chromosome(0).get_fitness()
convergence_count = 0
tol = ga.tolerance_goal * (1 + abs(best_fitness))
# Find out how many chromosomes have converged
for chromosome in ga.population.get_chromosome_list():
if abs(best_fitness - chromosome.get_fitness()) < tol:
convergence_count += 1
# Terminate if 10% of the population has converged
if convergence_count > 0.1*ga.population.size():
return False
return True