def family_competition(self, k=2): parent_fitness = [(solution, Fitness.get_fitness(solution, function=self.fitness_function)) for solution in self.parent] child_fitness = [(solution, Fitness.get_fitness(solution, function=self.fitness_function)) for solution in self.children] failed_reproduction = [ baby_fitness[1] <= max(parent_fitness, key=itemgetter(1))[1] for baby_fitness in child_fitness ] family_fitness = parent_fitness + child_fitness sorted_family = sorted(family_fitness, key=lambda x: x[1], reverse=True) kth_best, kth1_best = sorted_family[k - 1], sorted_family[k] if kth_best[1] == kth_best[1]: if kth1_best[0] in self.parent and not kth_best in self.parent: sorted_family[k - 1] = kth1_best sorted_family[k] = kth_best return [solution[0] for solution in sorted_family[:k]], failed_reproduction
def population_stats(self): return [ Fitness.get_fitness(solution, function=self.fitness_function) for solution in self.population ]