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