def ssi(domain,size, min_dist):
"""not controlling max trials."""
pop = [generate_one(domain)]
for i in range(size-1):
indiv = generate_one(domain)
while not accept(indiv,pop,min_dist):
indiv = generate_one(domain)
pop.append(indiv)
return pop
def accept(indiv,population, distance):
for elem in population:
if euclidean_distance(indiv,elem) < distance:
return False
return True
Como foi observado na aula, existe o risco de não conseguirmos gerar um novo indivíduo que satisfaça a condição de afastamento. A ser assim, o nosso programa nunca pára pois não conseguew abandonar o ciclo while. Vejamos como podemos remediar essa situação.
def ssi_b(domain_size, min_dist, max_reject):
"""Controlling max trials."""
pop = [generate_one(domain)]
for i in range(size-1):
reject = 0
indiv = generate_one(domain)
while not accept(indiv,pop,min_dist):
if reject == max_reject:
return []
else:
reject += 1
indiv = generate_one(domain)
pop.append(indiv)
return pop
A ideia é trivial: fixamos um número máximo de tentativas. Se esse valor for ultrapassado o programa termina devolvendo uma população vazia. Claro que isto não resolve a questão essencial de precisarmos mesmo de uma população inicial! Por isso, teremos que lançar este programa o número de vezes necessário até que seja gerada uma população satisfazendo o pretendido. Cada vez que repetimos o programa, podemos, por exemplo, diminuir a distância que separa os indivíduos entre si, para aumentar a possibilidade de sucesso.

Sem comentários:
Enviar um comentário