terça-feira, 23 de março de 2010

Programação genética: método de selecção por estado estável (steady-state model)

Neste tipo de abordagem, o pai com pior fitness é seleccionado e substituído por um filho (pela ordem que ocupa na lista ou escolhendo o melhor filho; neste exercício foi implementado o primeiro caso). Apenas nos interessa saber os índices dos indivíduos que participam na troca e não os próprios indivíduos (pois só acrescentam peso computacional). Por fim, sabemos ainda que a população não evolui toda de uma só vez, mas sim uma parte desta.

Então, o que fizemos foi o seguinte:
- escolhemos por torneio n indivíduos de toda a população (n é a dimensão do torneio)
- encontramos o pai com pior fitness- torneio negativo
- este é trocado por um filho, segundo a ordem sequencial de índice
- repetimos tantas vezes quantas a dimensão da população, e devolvemos o resultado.

O método foi implementado com duas funções: negative_tournament e survivors_steady_state. A primeira encontra o prior pai e a segunda faz a troca deste com um filho, devolvendo a população final.


def negative_tournament(population, size):
"""Deterministic"""
pool_index = [choice(range(len(population))) for i in range(size)]
worst_index = pool_index[0]
for j in range(1, size):
if population[pool_index[j]][1] < population[worst_index][1]:
worst_index = pool_index[j]
return worst_index




def survivors_steady_state(population, offspring, size):
"""Swap the worst parent by an offspring element"""
for i in range(len(population)):
worst_parent = negative_tournament(population, size)
population[worst_parent] = offspring[i]
return population


O código completo pode ser descarregado a partir de: aqui.

Nota: no programa principal, deve-se usar a função survivors_steady_state em vez da survivors_elitism.


Ana Nogueira

Sem comentários:

Enviar um comentário