New Initialization Method

This is a test implementation of a potential new initialization method. A testing file - new_initialization_method_testing.py - is included to allow for quick testing.

In summary here is are the major points:
1) Two new attributes of GA were created - gene_input and gene_input_type. gene_input holds the user's custom range(s)/domain(s) after it gets passed to the initialize() function. gene_input_type holds an array with the same length as the chromosomes that holds the input type of the user's gene_input on a gene-by-gene basis. It does this in the same exact way that index-dependent gene ranges/domains are handled. By making the gene_input_type array the same size as the chromosome, the elements can be paired very easily. The acceptable values for this are either "range" or "domain". With a range, any value between the two can be generated; with domain, only the two elements included can be selected from randomly.
2) As mentioned in change 1, the user now has to pass their range(s)/domain(s) to the initialize() function.
3) The package is capable of implicitly determining if a certain input from the user is a range or domain. Strings can only ever be a domain – if given an element that only includes integers, the program assumes range.
4) If the user wishes to use numbers only as a domain, they can specify this by directly interacting with the ga.gene_input_type (or through a setter function).
5) the initialize() function in the GA object determines the implicit range/domain assignments if the user doesn’t do so themselves.
6) The random_initialization() function is effectively the same, except there is now an if/else to determine if the user is using the built-in gene creation function or not. If they are, then pass the gene_input, gene_input_type, and current gene index as arguments to the gene function. If they are using their own function, random_initialization() functions exactly the same way as it does in the current master branch.
7) Based on all the settings mentioned above, the random_gene() function will create a value before passing it back to random_initialization().
This commit is contained in:
RyleyGG
2020-09-25 01:15:53 -04:00
parent 99066e924b
commit 5821e709a3
5 changed files with 105 additions and 16 deletions

View File

@ -19,6 +19,8 @@ class GA:
self.mutation_rate = 0.03
# Defualt EastGA implimentation structure
self.gene_function_impl = random_gene
self.gene_input = []
self.gene_input_type = [] #What if user gives two numbers (i.e. [1,100]) but wants to pick between the two (domain)?
# Set the GA Configuration
self.initialization_impl = random_initialization
#self.mutation_impl = PerGeneMutation(Mutation_rate)
@ -28,12 +30,39 @@ class GA:
#self.evaluation_impl = TestEvaluation()
def initialize(self):
def initialize(self, gene_input):
self.gene_input = gene_input
#assuming domain if string (strings can never be range)
if self.gene_input_type == []:
for x in range(len(self.gene_input)):
if (isinstance(self.gene_input[x], list)):
for y in range(len(self.gene_input[x])):
if isinstance(gene_input[x][y], str):
self.gene_input_type.append("domain")
break
elif y == (len(self.gene_input[x]) -1):
self.gene_input_type.append("range")
else:
if isinstance(gene_input[x], str):
self.gene_input_type.append("domain")
else:
if isinstance(gene_input[x], int):
self.gene_input[x] = [self.gene_input[x], self.gene_input[x]]
self.gene_input_type.append("range")
#If length doesn't correspond to chromosome, update here
while len(self.gene_input_type) != self.chromosome_length:
self.gene_input_type.append(self.gene_input_type[len(self.gene_input_type)-1])
# Create the first population
self.population = self.initialization_impl(
self.population_size,
self.chromosome_length,
self.gene_function_impl)
self.gene_function_impl,
self.gene_input,
self.gene_input_type)
def evolve():
# If you just want to evolve through all generations