From 5c5d6920b237c2ee71d8a132687cb858fe4c025c Mon Sep 17 00:00:00 2001 From: SimpleArt <71458112+SimpleArt@users.noreply.github.com> Date: Thu, 24 Sep 2020 23:51:21 -0400 Subject: [PATCH 1/6] Domain update Can set the domain to either a range or a list of values. --- src/EasyGA.py | 7 ++++-- .../gene_function/gene_random.py | 12 ++-------- .../population_structure/population.py | 3 +-- src/initialization/random_initialization.py | 4 ++-- src/run_testing.py | 22 +++++++------------ 5 files changed, 18 insertions(+), 30 deletions(-) diff --git a/src/EasyGA.py b/src/EasyGA.py index ef9dff8..98a3f7a 100644 --- a/src/EasyGA.py +++ b/src/EasyGA.py @@ -12,6 +12,7 @@ from initialization.random_initialization import random_initialization class GA: def __init__(self): # Default variables + self.domain = range(1, 100) self.population = None self.generations = 3 self.chromosome_length = 4 @@ -27,13 +28,15 @@ class GA: #self.termination_impl = GenerationTermination(Total_generations) #self.evaluation_impl = TestEvaluation() - def initialize(self): + if isinstance(self.domain, range): + self.domain = [x/float(100) for x in range(int(min(self.domain)*100), int(max(self.domain)*100))] # Create the first population self.population = self.initialization_impl( self.population_size, self.chromosome_length, - self.gene_function_impl) + self.gene_function_impl, + self.domain) def evolve(): # If you just want to evolve through all generations diff --git a/src/initialization/gene_function/gene_random.py b/src/initialization/gene_function/gene_random.py index dbcc874..8d75556 100644 --- a/src/initialization/gene_function/gene_random.py +++ b/src/initialization/gene_function/gene_random.py @@ -1,13 +1,5 @@ # Imported library import random -def check_values(low,high): - #Check to make sure its not less then zero - assert low > 0 , "The random gene low can not be less then zero" - # Check to make sure the high value is not - # lower than or equal to low and not 0. - assert high > low , "High value can not be smaller then low value" - assert high != 0, "High value can not be zero" - -def random_gene(): - return random.randint(1,100) +def random_gene(domain): + return domain[random.randint(0, len(domain)-1)] diff --git a/src/initialization/population_structure/population.py b/src/initialization/population_structure/population.py index 2aaf699..f2167bc 100644 --- a/src/initialization/population_structure/population.py +++ b/src/initialization/population_structure/population.py @@ -36,8 +36,7 @@ class population: self.fitness = fitness def __repr__(self): - for index in range(len(self.chromosomes)): - return f'{self.chromosomes[index]}' + return ''.join([chromosome.__repr__() for chromosome in self.chromosomes]) def print_all(self): # Ex .Current population diff --git a/src/initialization/random_initialization.py b/src/initialization/random_initialization.py index cdef3ef..1e82457 100644 --- a/src/initialization/random_initialization.py +++ b/src/initialization/random_initialization.py @@ -3,7 +3,7 @@ from .population_structure.population import population as create_population from .chromosome_structure.chromosome import chromosome as create_chromosome from .gene_structure.gene import gene as create_gene -def random_initialization(chromosome_length,population_size,gene_function): +def random_initialization(chromosome_length, population_size, gene_function, domain): # Create the population object population = create_population() # Fill the population with chromosomes @@ -11,6 +11,6 @@ def random_initialization(chromosome_length,population_size,gene_function): chromosome = create_chromosome() #Fill the Chromosome with genes for j in range(chromosome_length): - chromosome.add_gene(create_gene(gene_function())) + chromosome.add_gene(create_gene(gene_function(domain))) population.add_chromosome(chromosome) return population diff --git a/src/run_testing.py b/src/run_testing.py index 7259af4..fa2e265 100644 --- a/src/run_testing.py +++ b/src/run_testing.py @@ -3,18 +3,12 @@ import EasyGA # Create the Genetic algorithm ga = EasyGA.GA() -#Creating a gene with no fitness -gene1 = ga.make_gene("Im a gene") -gene2 = ga.make_gene("Im also a gene") -#Creating a Chromosome with no genes -chromosome = ga.make_chromosome() -chromosome.add_gene(gene1) -chromosome.add_gene(gene2) -# Creating a populaiton -populaiton = ga.make_population() -populaiton.add_chromosome(chromosome) +# input domain +#ga.domain = range(3, 10) +ga.domain = ['left', 'right'] -print(gene1) -print(chromosome) -print(populaiton) -populaiton.print_all() +# initialize random population +ga.initialize() + +# Print population +ga.population.print_all() From 78d63aa4aac12d6e0b377b2c8c5a37f38859def8 Mon Sep 17 00:00:00 2001 From: danielwilczak101 <44122838+danielwilczak101@users.noreply.github.com> Date: Thu, 24 Sep 2020 23:51:40 -0400 Subject: [PATCH 2/6] Testing --- src/initialization/focused_initialization.py | 16 +++++++++++++ src/run_testing.py | 24 ++++++++------------ 2 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 src/initialization/focused_initialization.py diff --git a/src/initialization/focused_initialization.py b/src/initialization/focused_initialization.py new file mode 100644 index 0000000..34a5e6f --- /dev/null +++ b/src/initialization/focused_initialization.py @@ -0,0 +1,16 @@ +# Import the data structure +from .population_structure.population import population as create_population +from .chromosome_structure.chromosome import chromosome as create_chromosome +from .gene_structure.gene import gene as create_gene + +def focused_initialization(chromosome_length,population_size,gene_function): + # Create the population object + population = create_population() + # Fill the population with chromosomes + for i in range(population_size): + chromosome = create_chromosome() + #Fill the Chromosome with genes + for j in range(chromosome_length): + chromosome.add_gene(create_gene(gene_function())) + population.add_chromosome(chromosome) + return population diff --git a/src/run_testing.py b/src/run_testing.py index 7259af4..4dd14cf 100644 --- a/src/run_testing.py +++ b/src/run_testing.py @@ -1,20 +1,16 @@ import EasyGA +import random # Create the Genetic algorithm ga = EasyGA.GA() -#Creating a gene with no fitness -gene1 = ga.make_gene("Im a gene") -gene2 = ga.make_gene("Im also a gene") -#Creating a Chromosome with no genes -chromosome = ga.make_chromosome() -chromosome.add_gene(gene1) -chromosome.add_gene(gene2) -# Creating a populaiton -populaiton = ga.make_population() -populaiton.add_chromosome(chromosome) +def user_defined_gene(): + return random.choice(["left","right","up","down"]) -print(gene1) -print(chromosome) -print(populaiton) -populaiton.print_all() +ga.gene_function_impl = user_defined_gene + +# Creating population +ga.initialize() + +# Print the current population +ga.population.print_all() From 7409ffb8ba6fcff652127fc5ec8742d5b5f8798c Mon Sep 17 00:00:00 2001 From: SimpleArt <71458112+SimpleArt@users.noreply.github.com> Date: Fri, 25 Sep 2020 00:27:13 -0400 Subject: [PATCH 3/6] Update gene_random.py Simplified random gene --- src/initialization/gene_function/gene_random.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/initialization/gene_function/gene_random.py b/src/initialization/gene_function/gene_random.py index 8d75556..897e9a0 100644 --- a/src/initialization/gene_function/gene_random.py +++ b/src/initialization/gene_function/gene_random.py @@ -2,4 +2,4 @@ import random def random_gene(domain): - return domain[random.randint(0, len(domain)-1)] + return random.choice(domain) From 9d9d0b750c964b5450d8c9cf49ad8b1551e9a133 Mon Sep 17 00:00:00 2001 From: danielwilczak101 <44122838+danielwilczak101@users.noreply.github.com> Date: Fri, 25 Sep 2020 15:12:02 -0400 Subject: [PATCH 4/6] Change domain feature --- src/EasyGA.py | 15 +++++++-------- src/initialization/random_initialization.py | 14 ++++++++++++-- src/run_testing.py | 20 ++++++++++++++------ 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/EasyGA.py b/src/EasyGA.py index 98a3f7a..c79a7ad 100644 --- a/src/EasyGA.py +++ b/src/EasyGA.py @@ -1,3 +1,4 @@ +import random # Import all the data prebuilt modules from initialization.population_structure.population import population as create_population from initialization.chromosome_structure.chromosome import chromosome as create_chromosome @@ -12,14 +13,15 @@ from initialization.random_initialization import random_initialization class GA: def __init__(self): # Default variables - self.domain = range(1, 100) + self.domain = None + self.new_range = None self.population = None self.generations = 3 - self.chromosome_length = 4 + self.chromosome_length = 3 self.population_size = 5 self.mutation_rate = 0.03 # Defualt EastGA implimentation structure - self.gene_function_impl = random_gene + # Set the GA Configuration self.initialization_impl = random_initialization #self.mutation_impl = PerGeneMutation(Mutation_rate) @@ -29,14 +31,11 @@ class GA: #self.evaluation_impl = TestEvaluation() def initialize(self): - if isinstance(self.domain, range): - self.domain = [x/float(100) for x in range(int(min(self.domain)*100), int(max(self.domain)*100))] - # Create the first population self.population = self.initialization_impl( self.population_size, self.chromosome_length, - self.gene_function_impl, - self.domain) + self.domain, + self.new_range) def evolve(): # If you just want to evolve through all generations diff --git a/src/initialization/random_initialization.py b/src/initialization/random_initialization.py index 1e82457..4c4e048 100644 --- a/src/initialization/random_initialization.py +++ b/src/initialization/random_initialization.py @@ -3,7 +3,7 @@ from .population_structure.population import population as create_population from .chromosome_structure.chromosome import chromosome as create_chromosome from .gene_structure.gene import gene as create_gene -def random_initialization(chromosome_length, population_size, gene_function, domain): +def random_initialization(population_size, chromosome_length, domain, new_range): # Create the population object population = create_population() # Fill the population with chromosomes @@ -11,6 +11,16 @@ def random_initialization(chromosome_length, population_size, gene_function, dom chromosome = create_chromosome() #Fill the Chromosome with genes for j in range(chromosome_length): - chromosome.add_gene(create_gene(gene_function(domain))) + if domain != None: + # Each chromosome location is specified with its own function + chromosome.add_gene(create_gene(domain(j))) + # Will break if chromosome_length != lists in domain + elif new_range != None: + # new_rnage = [range function,lowerbound,upperbound] + function = new_range[0] + chromosome.add_gene(create_gene(function(new_range[1],new_range[2]))) + else: + #Exit because either were not specified + print("Your domain or range were not specified") population.add_chromosome(chromosome) return population diff --git a/src/run_testing.py b/src/run_testing.py index fa2e265..98f5b37 100644 --- a/src/run_testing.py +++ b/src/run_testing.py @@ -1,14 +1,22 @@ import EasyGA - +import random # Create the Genetic algorithm ga = EasyGA.GA() -# input domain -#ga.domain = range(3, 10) -ga.domain = ['left', 'right'] +def user_gene_domain(gene_index): + """Each gene index is assosiated to its index in the chromosome""" + domain = [ + random.randrange(1,100), + random.uniform(10,5), + random.choice(["up","down"]) + ] + return domain[gene_index] + +# If the user wants to use a domain +ga.domain = user_gene_domain +# If the user wants to use a custom range +#ga.new_range = [random.randrange,1,100] -# initialize random population ga.initialize() -# Print population ga.population.print_all() From 044cc9d1f6e85b622230561669937247fc3a86e4 Mon Sep 17 00:00:00 2001 From: danielwilczak101 <44122838+danielwilczak101@users.noreply.github.com> Date: Fri, 25 Sep 2020 15:12:47 -0400 Subject: [PATCH 5/6] Removed function that is not required --- src/initialization/gene_function/gene_random.py | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/initialization/gene_function/gene_random.py diff --git a/src/initialization/gene_function/gene_random.py b/src/initialization/gene_function/gene_random.py deleted file mode 100644 index 897e9a0..0000000 --- a/src/initialization/gene_function/gene_random.py +++ /dev/null @@ -1,5 +0,0 @@ -# Imported library -import random - -def random_gene(domain): - return random.choice(domain) From 9b77d3619bd2d875dca3d141e6dfa9bad42c31d2 Mon Sep 17 00:00:00 2001 From: danielwilczak101 <44122838+danielwilczak101@users.noreply.github.com> Date: Fri, 25 Sep 2020 16:52:09 -0400 Subject: [PATCH 6/6] Remove random gene function --- src/EasyGA.py | 4 ---- src/run_testing.py | 8 +++++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/EasyGA.py b/src/EasyGA.py index c79a7ad..f00a29a 100644 --- a/src/EasyGA.py +++ b/src/EasyGA.py @@ -4,8 +4,6 @@ from initialization.population_structure.population import population as create_ from initialization.chromosome_structure.chromosome import chromosome as create_chromosome from initialization.gene_structure.gene import gene as create_gene -# Import functions for defaults -from initialization.gene_function.gene_random import random_gene # Import functionality defaults from initialization.random_initialization import random_initialization @@ -21,8 +19,6 @@ class GA: self.population_size = 5 self.mutation_rate = 0.03 # Defualt EastGA implimentation structure - - # Set the GA Configuration self.initialization_impl = random_initialization #self.mutation_impl = PerGeneMutation(Mutation_rate) #self.selection_impl = TournamentSelection() diff --git a/src/run_testing.py b/src/run_testing.py index 98f5b37..8103acf 100644 --- a/src/run_testing.py +++ b/src/run_testing.py @@ -6,17 +6,19 @@ ga = EasyGA.GA() def user_gene_domain(gene_index): """Each gene index is assosiated to its index in the chromosome""" domain = [ - random.randrange(1,100), + random.randrange(1,100,5), random.uniform(10,5), random.choice(["up","down"]) ] return domain[gene_index] +print(user_gene_domain(0)) + # If the user wants to use a domain ga.domain = user_gene_domain # If the user wants to use a custom range -#ga.new_range = [random.randrange,1,100] +#ga.new_range = [random.randrange,1,100,None] ga.initialize() -ga.population.print_all() +#ga.population.print_all()