File name changes to match the rest of framework. generation goal was setup twice in EasyGA.
This commit is contained in:
@ -32,14 +32,13 @@ class GA:
|
|||||||
|
|
||||||
# Termination variables
|
# Termination variables
|
||||||
self.current_generation = 0
|
self.current_generation = 0
|
||||||
self.generation_goal = 50
|
|
||||||
|
|
||||||
self.current_fitness = 0
|
self.current_fitness = 0
|
||||||
|
|
||||||
self.generation_goal = 250
|
self.generation_goal = 250
|
||||||
self.fitness_goal = 9
|
self.fitness_goal = 9
|
||||||
|
|
||||||
# Mutation variables
|
# Mutation variables
|
||||||
self.mutation_rate = 0.10
|
self.mutation_rate = 0.10
|
||||||
|
|
||||||
# Default EasyGA implimentation structure
|
# Default EasyGA implimentation structure
|
||||||
self.initialization_impl = Initialization_Methods.random_initialization
|
self.initialization_impl = Initialization_Methods.random_initialization
|
||||||
@ -52,7 +51,7 @@ class GA:
|
|||||||
self.mutation_impl = Mutation_Methods.per_gene_mutation
|
self.mutation_impl = Mutation_Methods.per_gene_mutation
|
||||||
# The type of termination to impliment
|
# The type of termination to impliment
|
||||||
self.termination_impl = Termination_Methods.generation_based
|
self.termination_impl = Termination_Methods.generation_based
|
||||||
|
|
||||||
|
|
||||||
def evolve_generation(self, number_of_generations = 1, consider_termination = True):
|
def evolve_generation(self, number_of_generations = 1, consider_termination = True):
|
||||||
"""Evolves the ga the specified number of generations."""
|
"""Evolves the ga the specified number of generations."""
|
||||||
@ -121,7 +120,7 @@ class GA:
|
|||||||
else:
|
else:
|
||||||
not_sorted_check += 1
|
not_sorted_check += 1
|
||||||
|
|
||||||
chromosome_set = chromosome_set_temp
|
chromosome_set = chromosome_set_temp
|
||||||
|
|
||||||
return chromosome_set
|
return chromosome_set
|
||||||
|
|
||||||
|
|||||||
@ -9,13 +9,13 @@ class Crossover_Methods:
|
|||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def single_point_crossover(ga):
|
def single_point_crossover(ga):
|
||||||
"""Single point crossover is when a "point" is selected and the genetic
|
"""Single point crossover is when a "point" is selected and the genetic
|
||||||
make up of the two parent chromosomes are "Crossed" or better known as swapped"""
|
make up of the two parent chromosomes are "Crossed" or better known as swapped"""
|
||||||
|
|
||||||
crossover_pool = ga.population.mating_pool
|
crossover_pool = ga.population.mating_pool
|
||||||
|
|
||||||
new_population = Population()
|
new_population = Population()
|
||||||
for i in range(len(crossover_pool)):
|
for i in range(len(crossover_pool)):
|
||||||
if i + 1 < len(crossover_pool):
|
if i + 1 < len(crossover_pool):
|
||||||
@ -23,14 +23,14 @@ class Crossover_Methods:
|
|||||||
parent_one = crossover_pool[i].get_genes()
|
parent_one = crossover_pool[i].get_genes()
|
||||||
parent_two = crossover_pool[i+1].get_genes()
|
parent_two = crossover_pool[i+1].get_genes()
|
||||||
#halfway_point = int(ga.chromosome_length/2)
|
#halfway_point = int(ga.chromosome_length/2)
|
||||||
split_point = random.randint(0,ga.chromosome_length)
|
split_point = random.randint(0,ga.chromosome_length)
|
||||||
new_gene_set.extend(parent_one[0:split_point])
|
new_gene_set.extend(parent_one[0:split_point])
|
||||||
new_gene_set.extend(parent_two[split_point:])
|
new_gene_set.extend(parent_two[split_point:])
|
||||||
new_chromosome = Chromosome(new_gene_set)
|
new_chromosome = Chromosome(new_gene_set)
|
||||||
new_population.add_chromosome(new_chromosome)
|
new_population.add_chromosome(new_chromosome)
|
||||||
|
|
||||||
return new_population
|
return new_population
|
||||||
|
|
||||||
def multi_point_crossover(ga, number_of_points = 2):
|
def multi_point_crossover(ga, number_of_points = 2):
|
||||||
"""Multi point crossover is when a specific number (More then one) of
|
"""Multi point crossover is when a specific number (More then one) of
|
||||||
"points" are created to merge the genetic makup of the chromosomes."""
|
"points" are created to merge the genetic makup of the chromosomes."""
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
class Crossover_methods:
|
|
||||||
"""Mutation examples will go here """
|
|
||||||
pass
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
class Fitness_methods:
|
|
||||||
"""Fitness function examples used"""
|
|
||||||
|
|
||||||
def is_it_5(chromosome):
|
|
||||||
"""A very simple case test function - If the chromosomes gene value is a 5 add one
|
|
||||||
to the chromosomes overall fitness value."""
|
|
||||||
# Overall fitness value
|
|
||||||
fitness = 0
|
|
||||||
# For each gene in the chromosome
|
|
||||||
for gene in chromosome.gene_list:
|
|
||||||
# Check if its value = 5
|
|
||||||
if(gene.value == 5):
|
|
||||||
# If its value is 5 then add one to
|
|
||||||
# the overal fitness of the chromosome.
|
|
||||||
fitness += 1
|
|
||||||
return fitness
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
class test_fitness_funciton:
|
|
||||||
def get_fitness(self, chromosome):
|
|
||||||
# For every gene in chromosome
|
|
||||||
for i in range(len(chromosome.genes)):
|
|
||||||
# If the gene has a five then add one to the fitness
|
|
||||||
# Example -> Chromosome = [5],[2],[2],[5],[5] then fitness = 3
|
|
||||||
if (chromosome.genes[i].get_value == 5):
|
|
||||||
# Add to the genes fitness
|
|
||||||
chromosome.genes[i].fitness += 1
|
|
||||||
# Add to the chromosomes fitness
|
|
||||||
chromosome.fitness += 1
|
|
||||||
return chromosome.fitness
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
class Mutation_methods:
|
|
||||||
"""Mutation examples will go here """
|
|
||||||
pass
|
|
||||||
@ -1,2 +1,2 @@
|
|||||||
# FROM (. means local) file_name IMPORT function_name
|
# FROM (. means local) file_name IMPORT function_name
|
||||||
from .parent_selection import Parent_Selection
|
from .parent_selection_methods import Parent_Selection
|
||||||
|
|||||||
@ -13,4 +13,5 @@ ga.gene_impl = [random.randrange,1,100]
|
|||||||
ga.evolve()
|
ga.evolve()
|
||||||
|
|
||||||
# Print the current population
|
# Print the current population
|
||||||
|
print(f"Current Generation: {ga.current_generation}")
|
||||||
ga.population.print_all()
|
ga.population.print_all()
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
# FROM (. means local) file_name IMPORT function_name
|
# FROM (. means local) file_name IMPORT function_name
|
||||||
from .survivor_selection import Survivor_Selection
|
from .survivor_selection_methods import Survivor_Selection
|
||||||
|
|||||||
@ -1,16 +0,0 @@
|
|||||||
class Termination_methods:
|
|
||||||
"""Example functions that can be used to terminate the the algorithms loop"""
|
|
||||||
|
|
||||||
def fitness_based(ga):
|
|
||||||
"""Fitness based approach to terminate when the goal fitness has been reached"""
|
|
||||||
status = True
|
|
||||||
if(ga.current_fitness > ga.fitness_goal):
|
|
||||||
status = False
|
|
||||||
return status
|
|
||||||
|
|
||||||
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
|
|
||||||
Reference in New Issue
Block a user