From 115f82be49944956eef4bb4d16d3f317e881a796 Mon Sep 17 00:00:00 2001 From: Sepehr Madani <ssepehrmadani@gmail.com> Date: Mon, 3 Aug 2020 00:02:40 -0400 Subject: [PATCH] Refactor GeneticAlgorithm for readability --- algorithms/genetic_algorithm.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/algorithms/genetic_algorithm.py b/algorithms/genetic_algorithm.py index ef0266a..6e94f0a 100644 --- a/algorithms/genetic_algorithm.py +++ b/algorithms/genetic_algorithm.py @@ -65,7 +65,7 @@ class GeneticAlgorithm(BaseAlgorithm): Chromosome.init_consts(self.N, self.bit_count, self.mutation_factor) - self.stop_criterion = options.stop_criterion # time, target, iter + self.stop_criterion = options.stop_criterion # time, target, iter self.gen_to_repeat = options.gen_to_repeat self.time_limit = options.time_limit self.stop_after_score = options.stop_after_score @@ -192,15 +192,15 @@ class GeneticAlgorithm(BaseAlgorithm): def make_weights(self, chromosome): """Returns e^{iθ} value for a chromosome's θs""" - angles = [(bits - (2**self.bit_count - 1) / 2) * 2*pi / (2**self.bit_resolution) for bits in chromosome.gene] + angles = [(bits - (2**self.bit_count-1)/2) * (2*pi) / (2**self.bit_resolution) for bits in chromosome.gene] weights = [complex(cos(theta), sin(theta)) for theta in angles] return weights def crossover(self, p1, p2, c1, c2): """Merges two parents' genes to create two children""" - self.chromosomes[c1] = deepcopy(self.chromosomes[p1]) - self.chromosomes[c2] = deepcopy(self.chromosomes[p2]) + self.chromosomes[c1].gene = self.chromosomes[p1].gene.copy() + self.chromosomes[c2].gene = self.chromosomes[p2].gene.copy() for i in range(self.N): if random() >= 0.5: self.chromosomes[c1].gene[i], self.chromosomes[c2].gene[i] = ( @@ -212,10 +212,8 @@ class GeneticAlgorithm(BaseAlgorithm): """Creates two children from parents' genes using the AM-GM approximation""" for ii in range(self.N): - g1 = p1.gene[ii] - g2 = p2.gene[ii] - self.chromosomes[c1].gene[ii] = (g1 + g2) // 2 - self.chromosomes[c2].gene[ii] = (g1 + g2 + 1) // 2 + self.chromosomes[c1].gene[ii] = (p1.gene[ii] + p2.gene[ii]) // 2 + self.chromosomes[c2].gene[ii] = (p1.gene[ii] + p2.gene[ii] + 1) // 2 def initialize_sample(self): """Destroys all chromosomes and creates a new random population""" -- GitLab