GeneticAlgorithmPython icon indicating copy to clipboard operation
GeneticAlgorithmPython copied to clipboard

NSGA tournament sorting only compares two solutions each round

Open noahBax opened this issue 1 year ago • 1 comments

Looking at the code for tournament_selection_nsga2 in parent_selection.py only the first two solutions in each round of selection are ever compared.

pareto_fronts, solutions_fronts_indices = self.non_dominated_sorting(fitness)
self.pareto_fronts = pareto_fronts.copy()

# Randomly generate pairs of indices to apply for NSGA-II tournament selection for selecting the parents solutions.
rand_indices = numpy.random.randint(low=0.0, 
                                    high=len(solutions_fronts_indices), 
                                    size=(num_parents, self.K_tournament))

for parent_num in range(num_parents):
    # Return the indices of the current 2 solutions.
    current_indices = rand_indices[parent_num]
    # Return the front index of the 2 solutions.
    parent_fronts_indices = solutions_fronts_indices[current_indices]

    if parent_fronts_indices[0] < parent_fronts_indices[1]:
        # If the first solution is in a lower pareto front than the second, then select it.
        selected_parent_idx = current_indices[0]
    elif parent_fronts_indices[0] > parent_fronts_indices[1]:
        # If the second solution is in a lower pareto front than the first, then select it.
        selected_parent_idx = current_indices[1]
    else:
        # The 2 solutions are in the same pareto front.
        # The selection is made using the crowding distance.
    ...

K_tournament solution indexes are selected with randint though. This also happens for crowding distance as well.

noahBax avatar Mar 05 '25 08:03 noahBax

Thanks so much! The bug is fixed and will be available in the next release soon.

ahmedfgad avatar Jul 09 '25 02:07 ahmedfgad