Simplified a lot of code by zipping data lists
This commit is contained in:
@ -46,8 +46,8 @@ class Crossover_Methods:
|
|||||||
def single_point(ga, parent_one, parent_two):
|
def single_point(ga, parent_one, parent_two):
|
||||||
"""Cross two parents by swapping genes at one random point."""
|
"""Cross two parents by swapping genes at one random point."""
|
||||||
|
|
||||||
index = random.randint(0, parent_one.size()-1)
|
swap_index = random.randint(0, parent_one.size()-1)
|
||||||
return ga.make_chromosome(parent_one.get_gene_list()[:index] + parent_two.get_gene_list()[index:])
|
return ga.make_chromosome(parent_one.get_gene_list()[:swap_index] + parent_two.get_gene_list()[swap_index:])
|
||||||
|
|
||||||
|
|
||||||
def multi_point(ga, parent_one, parent_two):
|
def multi_point(ga, parent_one, parent_two):
|
||||||
@ -55,56 +55,44 @@ class Crossover_Methods:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def uniform(ga, parent_one, parent_two):
|
def uniform(ga, parent_1, parent_2):
|
||||||
"""Cross two parents by swapping all genes randomly."""
|
"""Cross two parents by swapping all genes randomly."""
|
||||||
|
|
||||||
return ga.make_chromosome([ # Make a new chromosome
|
return ga.make_chromosome([ # Make a new chromosome
|
||||||
random.choice([ # by selecting random genes from
|
random.choice([gene_1, gene_2]) # by randomly selecting genes
|
||||||
parent_one.get_gene(i), # each parent
|
for gene_1, gene_2 in zip(parent_1.gene_list, parent_2.gene_list)]) # from each parent
|
||||||
parent_two.get_gene(i) #
|
|
||||||
]) #
|
|
||||||
for i in range(parent_one.size())]) # for each gene
|
|
||||||
|
|
||||||
class Arithmetic:
|
class Arithmetic:
|
||||||
"""Crossover methods for numerical genes."""
|
"""Crossover methods for numerical genes."""
|
||||||
|
|
||||||
def int_random(ga, parent_one, parent_two):
|
def int_random(ga, parent_1, parent_2):
|
||||||
"""Cross two parents by taking a random integer value between each of the genes."""
|
"""Cross two parents by taking a random integer value between each of the genes."""
|
||||||
|
|
||||||
return ga.make_chromosome([ # Make a new chromosome
|
return ga.make_chromosome([ # Make a new chromosome
|
||||||
ga.make_gene( # filled with new genes
|
ga.make_gene(random.randint(*sorted([data_1, data_2]))) # by randomly selecting integer genes between
|
||||||
random.randint(*sorted([ # by choosing random integers between
|
for data_1, data_2 in zip(parent_1.data_list(), parent_2.data_list())]) # each parents' genes
|
||||||
parent_one.get_gene(i).get_value(), # the parents' genes
|
|
||||||
parent_two.get_gene(i).get_value() #
|
|
||||||
]))) #
|
|
||||||
for i in range(parent_one.size())]) # for each gene
|
|
||||||
|
|
||||||
|
|
||||||
def int_weighted(ga, parent_one, parent_two):
|
def int_weighted(ga, parent_1, parent_2):
|
||||||
"""Cross two parents by taking a a weighted average of the genes."""
|
"""Cross two parents by taking a a weighted average of the genes."""
|
||||||
|
|
||||||
# the percentage of genes taken from the first gene
|
# the percentage of genes taken from the first gene
|
||||||
weight = 0.25
|
weight = 0.25
|
||||||
|
|
||||||
return ga.make_chromosome([ # Make a new chromosome
|
return ga.make_chromosome([ # Make a new chromosome
|
||||||
ga.make_gene(int( # filled with new integer genes
|
ga.make_gene(int( # filled with new integer genes
|
||||||
weight*parent_one.get_gene(i).get_value()+ # with weight% from parent one and
|
weight*data_1+(1-weight)*data_2 # with weight% from gene 1 and
|
||||||
(1-weight)*parent_two.get_gene(i).get_value() # (100-weight)% from parent two
|
)) # (100-weight)% from gene 2
|
||||||
)) #
|
for data_1, data_2 in zip(parent_1.data_list(), parent_2.data_list())]) # from each parents' genes
|
||||||
for i in range(parent_one.size())]) # for each gene
|
|
||||||
|
|
||||||
|
|
||||||
def float_random(ga, parent_one, parent_two):
|
def float_random(ga, parent_one, parent_two):
|
||||||
"""Cross two parents by taking a random numeric value between each of the genes."""
|
"""Cross two parents by taking a random numeric value between each of the genes."""
|
||||||
|
|
||||||
return ga.make_chromosome([ # Make a new chromosome
|
return ga.make_chromosome([ # Make a new chromosome
|
||||||
ga.make_gene( # filled with new genes
|
ga.make_gene(random.uniform([data_1, data_2])) # by randomly selecting integer genes between
|
||||||
random.uniform( # by taking a random float between
|
for data_1, data_2 in zip(parent_1.data_list(), parent_2.data_list())]) # from each parents' genes
|
||||||
parent_one.get_gene(i).get_value(), # the parents' genes
|
|
||||||
parent_two.get_gene(i).get_value() #
|
|
||||||
) #
|
|
||||||
) #
|
|
||||||
for i in range(parent_one.size())]) # for each gene
|
|
||||||
|
|
||||||
|
|
||||||
def float_weighted(ga, parent_one, parent_two):
|
def float_weighted(ga, parent_one, parent_two):
|
||||||
@ -113,9 +101,8 @@ class Crossover_Methods:
|
|||||||
# the percentage of genes taken from the first gene
|
# the percentage of genes taken from the first gene
|
||||||
weight = 0.25
|
weight = 0.25
|
||||||
|
|
||||||
return ga.make_chromosome([ # Make a new chromosome
|
return ga.make_chromosome([ # Make a new chromosome
|
||||||
ga.make_gene( # filled with new float genes
|
ga.make_gene( # filled with new float genes
|
||||||
weight*parent_one.get_gene(i).get_value()+ # with weight% from parent one and
|
weight*data_1+(1-weight)*data_2 # with weight% from gene 1 and
|
||||||
(1-weight)*parent_two.get_gene(i).get_value() # (100-weight)% from parent two
|
) # (100-weight)% from gene 2
|
||||||
) #
|
for data_1, data_2 in zip(parent_1.data_list(), parent_2.data_list())]) # from each parents' genes
|
||||||
for i in range(parent_one.size())]) # for each gene
|
|
||||||
|
|||||||
Reference in New Issue
Block a user