From c212da2426ca056d0afaa90f19705110561e9714 Mon Sep 17 00:00:00 2001 From: SimpleArt <71458112+SimpleArt@users.noreply.github.com> Date: Fri, 20 Nov 2020 09:15:31 -0500 Subject: [PATCH] Further split values to chromosomes decorator --- src/crossover/crossover_methods.py | 47 ++++++++++++++++++------------ 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/crossover/crossover_methods.py b/src/crossover/crossover_methods.py index 8691493..3d9a57d 100644 --- a/src/crossover/crossover_methods.py +++ b/src/crossover/crossover_methods.py @@ -1,27 +1,30 @@ import random def append_children_from_mating_pool(crossover_method): - def helper(ga): - mating_pool = ga.population.mating_pool + return lambda ga:\ 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): - return ga.make_chromosome([ - ga.make_gene(value) - for value in crossover_method(ga, parent_1, parent_2)]) - return helper + +def genes_to_chromosome(crossover_method): + return lambda ga, parent_1, parent_2:\ + return ga.make_chromosome(crossover_method(ga, parent_1, parent_2)) + + +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: def __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) + def __values_to_genes(crossover_method): + return values_to_genes(crossover_method) class Population: @@ -61,30 +64,33 @@ class Crossover_Methods: """Methods for crossing parents.""" + @genes_to_chromosome def single_point(ga, parent_1, parent_2): """Cross two parents by swapping genes at one random point.""" 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): """Cross two parents by swapping genes at multiple points.""" pass + @genes_to_chromosome def uniform(ga, parent_1, parent_2): """Cross two parents by swapping all genes randomly.""" - return ga.make_chromosome([ # Make a new chromosome - random.choice([gene_1, gene_2]) # by randomly selecting genes - for gene_1, gene_2 in zip(parent_1, parent_2)]) # from each parent + for gene_pair in zip(parent_1, parent_2): + yield random.choice(gene_pair) class Arithmetic: """Crossover methods for numerical genes.""" - @values_to_chromosome + @genes_to_chromosome + @values_to_genes def int_random(ga, parent_1, parent_2): """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])) - @values_to_chromosome + @genes_to_chromosome + @values_to_genes def int_weighted(ga, parent_1, parent_2): """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) - @values_to_chromosome + @genes_to_chromosome + @values_to_genes def float_random(ga, parent_one, parent_two): """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]) - @values_to_chromosome + @genes_to_chromosome + @values_to_genes def float_weighted(ga, parent_one, parent_two): """Cross two parents by taking a a weighted average of the genes."""