diff --git a/src/fitness_function/fitness_examples.py b/src/fitness_function/fitness_examples.py index ccac36c..a5bbd83 100644 --- a/src/fitness_function/fitness_examples.py +++ b/src/fitness_function/fitness_examples.py @@ -19,7 +19,7 @@ class Fitness_Examples: """Test of the GA's ability to improve fitness when the value is index-dependent""" """If a gene is equal to its index in the chromosome + 1, fitness is incremented""" fitness = 0 - for i in range(len(chromosome.gene_list)): + for i in range(chromosome.size()): if (chromosome.gene_list[i].value == i+1): fitness += 1 diff --git a/src/initialization/chromosome_structure/chromosome.py b/src/initialization/chromosome_structure/chromosome.py index 871c61f..6e418a1 100644 --- a/src/initialization/chromosome_structure/chromosome.py +++ b/src/initialization/chromosome_structure/chromosome.py @@ -9,6 +9,10 @@ class Chromosome: # If the chromosome has been selected then the flag would switch to true self.selected = False + def size(self): + """Returns the number of genes in the chromosome""" + return len(self.gene_list) + def add_gene(self, gene, index = -1): """Add a gene to the chromosome at the specified index, defaulted to end of the chromosome""" if index == -1: diff --git a/src/parent_selection/parent_selection_methods.py b/src/parent_selection/parent_selection_methods.py index 1cf0f87..14b348e 100644 --- a/src/parent_selection/parent_selection_methods.py +++ b/src/parent_selection/parent_selection_methods.py @@ -12,14 +12,14 @@ class Parent_Selection: The total number of parents selected is determined by parent_ratio, an attribute to the GA object. """ - tournament_size = int(len(ga.population.get_all_chromosomes())*ga.tournament_size_ratio) + tournament_size = int(ga.population.size()*ga.tournament_size_ratio) if tournament_size < 5: tournament_size = 5 # Probability used for determining if a chromosome should enter the mating pool. selection_probability = ga.selection_probability # Repeat tournaments until the mating pool is large enough. - while (len(ga.population.mating_pool) < len(ga.population.get_all_chromosomes())*ga.parent_ratio): + while (len(ga.population.mating_pool) < ga.population.size()*ga.parent_ratio): # Generate a random tournament group and sort by fitness. tournament_group = ga.sort_by_best_fitness([random.choice(ga.population.get_all_chromosomes()) for n in range(tournament_size)]) @@ -41,7 +41,7 @@ class Parent_Selection: Where the chromosomes are the numbers to be selected and the board size for those numbers are directly proportional to the chromosome's current fitness. Where the ball falls is a randomly generated number between 0 and 1""" - total_fitness = sum(ga.population.chromosome_list[i].get_fitness() for i in range(len(ga.population.chromosome_list))) + total_fitness = sum(ga.population.chromosome_list[i].get_fitness() for i in range(ga.population.size())) rel_fitnesses = [] for chromosome in ga.population.chromosome_list: @@ -50,7 +50,7 @@ class Parent_Selection: probability = [sum(rel_fitnesses[:i+1]) for i in range(len(rel_fitnesses))] - while (len(ga.population.mating_pool) < len(ga.population.get_all_chromosomes())*ga.parent_ratio): + while (len(ga.population.mating_pool) < ga.population.size()*ga.parent_ratio): rand_number = random.random() # Loop through the list of probabilities diff --git a/src/termination_point/termination_methods.py b/src/termination_point/termination_methods.py index 8b3cd73..f382dd4 100644 --- a/src/termination_point/termination_methods.py +++ b/src/termination_point/termination_methods.py @@ -3,19 +3,15 @@ class Termination_Methods: def fitness_based(ga): """Fitness based approach to terminate when the goal fitness has been reached""" - - status = True + if ga.population == None: - return status - for i in range(len(ga.population.get_all_chromosomes())): + return True + for i in range(ga.population.size()): if(ga.population.get_all_chromosomes()[i].fitness >= ga.fitness_goal): - status = False - break - return status + return False + return True def generation_based(ga): """Generation based approach to terminate when the goal generation has been reached""" - status = True - if(ga.current_generation > ga.generation_goal): - status = False - return status + + return ga.current_generation < ga.generation_goal