diff --git a/src/genetic_algorithm.py b/src/genetic_algorithm.py index 89de321..f7eb2ee 100644 --- a/src/genetic_algorithm.py +++ b/src/genetic_algorithm.py @@ -1,5 +1,5 @@ from numpy import sum, append, arange, delete, where -from numpy.random import randint, choice, shuffle, random +from numpy.random import randint, choice, shuffle from pandas import DataFrame from math import ceil @@ -132,7 +132,8 @@ def mutate(population, n, probability=0.001): genes = [] for _ in range(ceil(expected_mutations)): individuals.append(randint(n)) - genes.append(population[individuals[-1]].sample().index) + current_individual = individuals[-1] + genes.append(population[current_individual].sample().index) for ind, gen in zip(individuals, genes): individual = population[ind] individual["point"].iloc[gen] = select_new_gene(individual, n) @@ -146,39 +147,5 @@ def tournament_selection(solution): return individuals.iloc[best_index] -def replace_worst_element(previous, n, data): - solution = previous.copy() - worst_index = solution["distance"].astype(float).idxmin() - random_element = randint(n) - while element_in_dataframe(solution=solution, element=random_element): - random_element = randint(n) - solution["point"].loc[worst_index] = random_element - solution["distance"].loc[worst_index] = compute_distance( - element=solution["point"].loc[worst_index], solution=solution, data=data - ) - return solution - - -def get_random_solution(previous, n, data): - solution = replace_worst_element(previous, n, data) - while solution["distance"].sum() <= previous["distance"].sum(): - solution = replace_worst_element(previous=solution, n=n, data=data) - return solution - - -def explore_neighbourhood(element, n, data, max_iterations=100000): - neighbourhood = [] - neighbourhood.append(element) - for _ in range(max_iterations): - previous_solution = neighbourhood[-1] - neighbour = get_random_solution(previous=previous_solution, n=n, data=data) - neighbourhood.append(neighbour) - return neighbour - - def genetic_algorithm(n, m, data): first_solution = generate_first_solution(n, m, data) - best_solution = explore_neighbourhood( - element=first_solution, n=n, data=data, max_iterations=100 - ) - return best_solution