diff --git a/src/genetic_algorithm.py b/src/genetic_algorithm.py index f7eb2ee..ca3b16b 100644 --- a/src/genetic_algorithm.py +++ b/src/genetic_algorithm.py @@ -12,9 +12,9 @@ def get_row_distance(source, destination, data): return row["distance"].values[0] -def compute_distance(element, solution, data): +def compute_distance(element, individual, data): accumulator = 0 - distinct_elements = solution.query(f"point != {element}") + distinct_elements = individual.query(f"point != {element}") for _, item in distinct_elements.iterrows(): accumulator += get_row_distance( source=element, destination=item.point, data=data @@ -22,18 +22,18 @@ def compute_distance(element, solution, data): return accumulator -def generate_first_solution(n, m, data): - solution = DataFrame(columns=["point", "distance"]) - solution["point"] = choice(n, size=m, replace=False) - solution["distance"] = solution["point"].apply( - func=compute_distance, solution=solution, data=data +def generate_individual(n, m, data): + individual = DataFrame(columns=["point", "distance", "fitness"]) + individual["point"] = choice(n, size=m, replace=False) + individual["distance"] = individual["point"].apply( + func=compute_distance, individual=individual, data=data ) - return solution + return individual -def evaluate_element(element, data): +def evaluate_individual(individual, data): fitness = [] - genotype = element.point.values + genotype = individual.point.values distances = data.query(f"source in @genotype and destination in @genotype") for item in genotype[:-1]: element_df = distances.query(f"source == {item} or destination == {item}") @@ -114,15 +114,15 @@ def crossover(mode, parents, m): return position_crossover(parents, m) -def element_in_dataframe(solution, element): - duplicates = solution.query(f"point == {element}") +def element_in_dataframe(individual, element): + duplicates = individual.query(f"point == {element}") return not duplicates.empty def select_new_gene(individual, n): while True: new_gene = randint(n) - if not element_in_dataframe(solution=individual, element=new_gene): + if not element_in_dataframe(individual=individual, element=new_gene): return new_gene @@ -141,9 +141,9 @@ def mutate(population, n, probability=0.001): return population -def tournament_selection(solution): - individuals = solution.sample(n=2) - best_index = solution["distance"].astype(float).idxmax() +def tournament_selection(population): + individuals = population.sample(n=2) + best_index = population["distance"].idxmax() return individuals.iloc[best_index]