source: framspy/evolalg/structures/population.py @ 1303

Last change on this file since 1303 was 1190, checked in by Maciej Komosinski, 2 years ago

Added the "evolalg" module for evolutionary optimization

File size: 1.5 KB
RevLine 
[1190]1import random
2
3import numpy as np
4
5from ..base.remove_diagonal import remove_diagonal
6
7
8class PopulationStructures:
9    def __init__(self,  initial_individual, archive_size=0, popsize=100) -> None:
10        self.population_size = popsize
11        self.population = [initial_individual.copy()
12                           for _ in range(self.population_size)]
13        self.archive = []
14        self.archive_size = archive_size
15
16    def change_individual(self, dissim):
17        no_diagonal = remove_diagonal(dissim.copy())
18        minval = np.min(no_diagonal)
19        to_remove_pair = list(set(np.where(no_diagonal == minval)[0]))
20        last_index = len(dissim)-1
21        if last_index in to_remove_pair:
22            return last_index
23        else:
24            return random.choice(to_remove_pair)
25
26    def update_archive(self, dissim_matrix, population_archive):
27        if self.archive_size < 1:
28            return
29        current_archive_ind = [i for i in range(
30            self.population_size, len(dissim_matrix))]
31        for i in range(self.population_size):
32            current_archive_ind = current_archive_ind + [i]
33            temp_dissim_matrix = dissim_matrix[current_archive_ind,
34                                               ][:, current_archive_ind]
35            if len(current_archive_ind) > self.archive_size:
36                to_remove = self.change_individual(temp_dissim_matrix)
37                current_archive_ind.pop(to_remove)
38
39        self.archive = np.array(population_archive)[
40            current_archive_ind].tolist()
Note: See TracBrowser for help on using the repository browser.