Further split values to chromosomes decorator
This commit is contained in:
@ -1,27 +1,30 @@
|
|||||||
import random
|
import random
|
||||||
|
|
||||||
def append_children_from_mating_pool(crossover_method):
|
def append_children_from_mating_pool(crossover_method):
|
||||||
def helper(ga):
|
return lambda ga:\
|
||||||
mating_pool = ga.population.mating_pool
|
|
||||||
ga.population.append_children(
|
ga.population.append_children(
|
||||||
[chromosome for chromosome in crossover_method(ga, mating_pool)]
|
[chromosome for chromosome in crossover_method(ga, ga.population.mating_pool)]
|
||||||
)
|
)
|
||||||
return helper
|
|
||||||
|
|
||||||
def values_to_chromosome(crossover_method):
|
|
||||||
def helper(ga, parent_1, parent_2):
|
def genes_to_chromosome(crossover_method):
|
||||||
return ga.make_chromosome([
|
return lambda ga, parent_1, parent_2:\
|
||||||
ga.make_gene(value)
|
return ga.make_chromosome(crossover_method(ga, parent_1, parent_2))
|
||||||
for value in crossover_method(ga, parent_1, parent_2)])
|
|
||||||
return helper
|
|
||||||
|
def values_to_genes(crossover_method):
|
||||||
|
return lambda ga, parent_1, parent_2:\
|
||||||
|
return (ga.make_gene(value) for value in crossover_method(ga, parent_1, parent_2))
|
||||||
|
|
||||||
|
|
||||||
class Crossover_Methods:
|
class Crossover_Methods:
|
||||||
|
|
||||||
def __append_children_from_mating_pool(crossover_method):
|
def __append_children_from_mating_pool(crossover_method):
|
||||||
return append_children_from_mating_pool(crossover_method)
|
return append_children_from_mating_pool(crossover_method)
|
||||||
def __values_to_chromosome(crossover_method):
|
def __genes_to_chromosome(crossover_method):
|
||||||
return values_to_chromosome(crossover_method)
|
return values_to_chromosome(crossover_method)
|
||||||
|
def __values_to_genes(crossover_method):
|
||||||
|
return values_to_genes(crossover_method)
|
||||||
|
|
||||||
|
|
||||||
class Population:
|
class Population:
|
||||||
@ -61,30 +64,33 @@ class Crossover_Methods:
|
|||||||
"""Methods for crossing parents."""
|
"""Methods for crossing parents."""
|
||||||
|
|
||||||
|
|
||||||
|
@genes_to_chromosome
|
||||||
def single_point(ga, parent_1, parent_2):
|
def single_point(ga, parent_1, parent_2):
|
||||||
"""Cross two parents by swapping genes at one random point."""
|
"""Cross two parents by swapping genes at one random point."""
|
||||||
|
|
||||||
swap_index = random.randint(0, len(parent_1)-1)
|
swap_index = random.randint(0, len(parent_1)-1)
|
||||||
return ga.make_chromosome(parent_1[:swap_index] + parent_2[swap_index:])
|
return parent_1[:swap_index] + parent_2[swap_index:]
|
||||||
|
|
||||||
|
|
||||||
|
@genes_to_chromosome
|
||||||
def multi_point(ga, parent_1, parent_2):
|
def multi_point(ga, parent_1, parent_2):
|
||||||
"""Cross two parents by swapping genes at multiple points."""
|
"""Cross two parents by swapping genes at multiple points."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@genes_to_chromosome
|
||||||
def uniform(ga, parent_1, parent_2):
|
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
|
for gene_pair in zip(parent_1, parent_2):
|
||||||
random.choice([gene_1, gene_2]) # by randomly selecting genes
|
yield random.choice(gene_pair)
|
||||||
for gene_1, gene_2 in zip(parent_1, parent_2)]) # from each parent
|
|
||||||
|
|
||||||
|
|
||||||
class Arithmetic:
|
class Arithmetic:
|
||||||
"""Crossover methods for numerical genes."""
|
"""Crossover methods for numerical genes."""
|
||||||
|
|
||||||
@values_to_chromosome
|
@genes_to_chromosome
|
||||||
|
@values_to_genes
|
||||||
def int_random(ga, parent_1, parent_2):
|
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."""
|
||||||
|
|
||||||
@ -95,7 +101,8 @@ class Crossover_Methods:
|
|||||||
yield random.randint(*sorted([value_1, value_2]))
|
yield random.randint(*sorted([value_1, value_2]))
|
||||||
|
|
||||||
|
|
||||||
@values_to_chromosome
|
@genes_to_chromosome
|
||||||
|
@values_to_genes
|
||||||
def int_weighted(ga, parent_1, parent_2):
|
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."""
|
||||||
|
|
||||||
@ -109,7 +116,8 @@ class Crossover_Methods:
|
|||||||
yield int(weight*value_1+(1-weight)*value_2)
|
yield int(weight*value_1+(1-weight)*value_2)
|
||||||
|
|
||||||
|
|
||||||
@values_to_chromosome
|
@genes_to_chromosome
|
||||||
|
@values_to_genes
|
||||||
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."""
|
||||||
|
|
||||||
@ -120,7 +128,8 @@ class Crossover_Methods:
|
|||||||
yield random.uniform([value_1, value_2])
|
yield random.uniform([value_1, value_2])
|
||||||
|
|
||||||
|
|
||||||
@values_to_chromosome
|
@genes_to_chromosome
|
||||||
|
@values_to_genes
|
||||||
def float_weighted(ga, parent_one, parent_two):
|
def float_weighted(ga, parent_one, parent_two):
|
||||||
"""Cross two parents by taking a a weighted average of the genes."""
|
"""Cross two parents by taking a a weighted average of the genes."""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user