def tournament(self, pop, evaluated_pop, tournament_size, min_func=False, max_func=False): copy_evaluated_pop = evaluated_pop[:] tour = [] division = [] i = 0 while (i < tournament_size and len(copy_evaluated_pop) > tournament_size): select_index = np.random.randint(len(copy_evaluated_pop) - 1) division.append(copy_evaluated_pop[select_index]) copy_evaluated_pop = np.delete(copy_evaluated_pop, select_index) i = i + 1 if (i == tournament_size or len(copy_evaluated_pop) == tournament_size): tour.append(division) i = 0 division = [] if (len(copy_evaluated_pop) <= tournament_size): tour.append(copy_evaluated_pop) new_pop = [] # selection the best from every tour best_individuals = [] best_value_in_division = 0 for el in tour: if max_func: best_value_in_division = max(el) new_pop.append(pop[np.argmax(el)]) if min_func: best_value_in_division = min(el) new_pop.append(pop[np.argmin(el)]) best_individuals.append(best_value_in_division) return new_pop