mattia wrote:
... The last question: how can I improve readability in this piece of code?

def crossover(pop, prob=0.6):
    """
    With a crossover probability cross over the parents to form new
    offspring. If no crossover was performed, offspring is the exact copy of 
parents.
    """
    cpop = []
    for i in range(0, len(pop), 2):
        # crossover
        if prob > random():
            crossover_point = randint(0, len(pop[i])-1)
            nchromosome1 = pop[i][:crossover_point] + pop[i+1][crossover_point:]
            nchromosome2 = pop[i+1][:crossover_point] + pop[i][crossover_point:]
        else:
            nchromosome1 = pop[i][:]
            nchromosome2 = pop[i+1][:]
        cpop += [nchromosome1] + [nchromosome2]
    return cpop

Python encourages iterating over data, not indices.
Just for fun, I'll do it as a generator:
    def crossover(pop, prob=0.6):
        '''<keep original comment, say "produces">
        note the population is treated pairwise, so any individual
        is only likely to cross with one particular other individual.
        '''
        for first, second in zip(pop[::2], pop[1::2]):
            if prob > random():
                spot = randint(1, len(first) - 1) # avoid non-crossings
                yield first[: spot] + second[spot :]
                yield second[: spot] + first[spot :]
            else:
                # consider not even producing the duplicates
                yield first
                yield second


    def random_crossing(population, probability=0.6):
        '''This chooses random pairs from the population.
        '''
        shuffled = list(population) # make a copy
        random.shuffle(shuffled) # mix it up
        return list(crossover(shuffled)) # convert back to a list.


--Scott David Daniels
scott.dani...@acm.org
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to