From 7a8f16c6221838d77b877ba6e58ab1d52f6c1cf9 Mon Sep 17 00:00:00 2001 From: SimpleArt <71458112+SimpleArt@users.noreply.github.com> Date: Mon, 9 Nov 2020 15:58:09 -0500 Subject: [PATCH] Added tolerance-based termination --- src/attributes.py | 2 ++ src/termination_point/termination_methods.py | 25 +++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/attributes.py b/src/attributes.py index 896d97f..664a1f6 100644 --- a/src/attributes.py +++ b/src/attributes.py @@ -49,6 +49,7 @@ class Attributes: current_fitness = 0, generation_goal = 15, fitness_goal = None, + tolerance_goal = 1e-3, chromosome_mutation_rate = 0.15, gene_mutation_rate = 0.03, initialization_impl = Initialization_Methods.random_initialization, @@ -93,6 +94,7 @@ class Attributes: self.current_fitness = deepcopy(current_fitness) self.generation_goal = deepcopy(generation_goal) self.fitness_goal = deepcopy(fitness_goal) + self.tolerance_goal = deepcopy(tolerance_goal) # Mutation variables self.chromosome_mutation_rate = deepcopy(chromosome_mutation_rate) diff --git a/src/termination_point/termination_methods.py b/src/termination_point/termination_methods.py index b2b62fc..2cacdca 100644 --- a/src/termination_point/termination_methods.py +++ b/src/termination_point/termination_methods.py @@ -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