diff --git a/algorithms/genetic_algorithm.py b/algorithms/genetic_algorithm.py index 556a6b1553b1767ad295aa9377ed04c202635089..87bc1e0e0d7f1a5567a71a2fa89de80a74211f68 100644 --- a/algorithms/genetic_algorithm.py +++ b/algorithms/genetic_algorithm.py @@ -34,16 +34,14 @@ class GeneticAlgorithm(BaseAlgorithm): self.mutation_factor = options.mutation_factor self.check_parameters() - self.chromosomes = [ - Chromosome(self.N, self.bit_count) for i in range(self.sample_size) - ] - self.update_fitness() - self.sort_fitness() def check_parameters(self): super().check_parameters() def solve(self): + self.intialize_sample() + self.update_fitness() + self.sort_fitness() for generation in range(self.gen_to_repeat): for ii in range(self.sample_size // 2, self.sample_size - 1, 2): p1, p2 = random.sample(range(self.sample_size // 2), 2) @@ -53,9 +51,7 @@ class GeneticAlgorithm(BaseAlgorithm): self.sort_fitness() # print(["{:.2f}".format(x.fitness) for x in self.chromosomes[:15]]) - return [ - cmath.exp(1j * self.get_angle(bits)) for bits in self.chromosomes[0].gene - ] + return self.make_weights(self.chromosomes[0]) def mutate_sample(self): for chromosome in self.chromosomes[1:]: # for all except the best chromosome @@ -70,9 +66,7 @@ class GeneticAlgorithm(BaseAlgorithm): for x in compute_pattern( N=self.N, k=self.k, - weights=[ - cmath.exp(1j * self.get_angle(bits)) for bits in chromosome.gene - ], + weights=self.make_weights(chromosome), degrees=self.null_degrees, ) ] @@ -81,10 +75,12 @@ class GeneticAlgorithm(BaseAlgorithm): def sort_fitness(self): self.chromosomes.sort(key=lambda x: x.fitness, reverse=True) - def get_angle(self, bits): - return ( - (bits - (2 ** self.bit_count - 1) / 2) * 2 * pi / (2 ** self.bit_resolution) - ) + def make_weights(self, chromosome): + weights = [] + for bits in chromosome.gene: + angle = (bits - (2 ** self.bit_count - 1) / 2) * 2 * pi / (2 ** self.bit_resolution) + weights.append(cmath.exp(1j * angle)) + return weights def crossover(self, p1, p2, c1, c2): self.chromosomes[c1] = deepcopy(self.chromosomes[p1]) @@ -95,3 +91,8 @@ class GeneticAlgorithm(BaseAlgorithm): self.chromosomes[c1].gene[i], self.chromosomes[c2].gene[i], ) + + def intialize_sample(self): + self.chromosomes = [ + Chromosome(self.N, self.bit_count) for i in range(self.sample_size) + ] \ No newline at end of file