Is there a better way of doing this?
Peter Otten
__peter__ at web.de
Fri Mar 6 08:06:14 EST 2009
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
More information about the Python-list
mailing list