mattia wrote: > Hi, I'm new to python, and as the title says, can I improve this snippet > (readability, speed, tricks): > > def get_fitness_and_population(fitness, population): > return [(fitness(x), x) for x in population] > > def selection(fitness, population): > ''' > Select the parent chromosomes from a population according to their > fitness (the better fitness, the bigger chance to be selected) > ''' > selected_population = [] > fap = get_fitness_and_population(fitness, population) > pop_len = len(population) > # elitism (it prevents a loss of the best found solution) > # take the only 2 best solutions > elite_population = sorted(fap) > selected_population += [elite_population[pop_len-1][1]] + > [elite_population[pop_len-2][1]] > # go on with the rest of the elements > for i in range(pop_len-2): > # do something
def selection1(fitness, population, N=2): rest = sorted(population, key=fitness, reverse=True) best = rest[:N] del rest[:N] # work with best and rest def selection2(fitness, population, N=2): decorated = [(-fitness(p), p) for p in population] heapq.heapify(decorated) best = [heapq.heappop(decorated)[1] for _ in range(N)] rest = [p for f, p in decorated] # work with best and rest Both implementations assume that you are no longer interested in the individuals' fitness once you have partitioned the population in two groups. In theory the second is more efficient for "small" N and "large" populations. Peter -- http://mail.python.org/mailman/listinfo/python-list