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