quinta-feira, 1 de maio de 2014

De novo as chaves aleatórias

Já aqui abordámos neste blogue o conceito de chaves aleatórias. Elas permitem representar através de um vector de reais entre zero e um uma permutação de inteiros. A vantagem desta representação está em podermos utilizar os operadores genéticos “normais” (e mais simples!) sobre números reais e não os operadores especializados (e mais complexos) sobre permutações de inteiros. Claro que vamos depois precisar de um descodificados quando se tratar de avaliar a qualidade de cada indivíduo. Uma implementação ingénua do descodificador é a seguinte:
def decode_rk(vector):
    aux = vector[:]
    aux.sort()
    permutation =[ vector.index(elem) + 1 for elem in aux]
    return permutation
Nesta implementação geramos permutações entre 1 e n. Se quisermos entre 0 e (n-1) basta retirar a soma de 1 que aparece na lista por compreensão. Esta solução funciona bem caso não existam elementos repetidos. Se tal acontecer temos um problema… Alterar a solução acima para que a existência de números repetidos não cause problemas não é difícil:
from copy import deepcopy

def decode_rk(vector):
    """Work even with repeated elements."""
    copia = deepcopy(vector)
    aux = deepcopy(vector)
    aux.sort()
    permutation = []
    for i,elem in enumerate(aux):
        permutation.append(copia.index(elem))
        copia[copia.index(elem)] = None
    return permutation
A solução passa por alterar um elemento cada vez que ele é considerado, substituindo-o por None. Experimente e verifique que agora já não tem que se preocupar com os elementos repetidos.

Sem comentários:

Enviar um comentário