Home › Fóruns › Fórum Algoritmos Genéticos em Python › Erro na função “seleciona_pai”.
- Este tópico contém 3 respostas, 3 vozes e foi atualizado pela última vez 10 meses, 1 semana atrás por
Jones Granatyr.
- AutorPosts
- 26 de agosto de 2022 às 11:06 #36503
Olá!
Acredito que encontrei um erro no curso “Algoritmos Genéticos em Python” – aula “Seleção dos indivíduos – implementação”. Se puderem olhar minha explicação, agradeço:Depois da explicação, seguem os dois algoritmos (o do professor e o meu):
Explicação:
O objetivo é selecionar um “indivíduo” para ser o “pai”. Quanto maior for a “nota” deste indivíduo, maior deve ser a probabilidade dele ser selecionado. O que vai definir esta probabilidade é “valor_sorteado = random() * soma_avaliacao”. Sendo assim, o “indivíduo” que tiver a “nota” mais próxima deste “valor_sorteado” é o que deve ser selecionado.
No algoritmo do professor, nem sempre o “indivíduo” que tiver a “nota” mais próxima deste “valor_sorteado” é o que será selecionado, pois a “soma” (ver o código) pode ultrapassar o “valor_sorteado” depois que se passar do “indivíduo” com a “nota” mais próxima do “valor_sorteado”, assim selecionando outro “indivíduo” para ser o “pai”.
No meu algoritmo, sempre será selecionado o “indivíduo” que tiver a “nota” mais próxima deste “valor_sorteado”, pois ele calcula a “distância” destes dois valores usando a função “abs()”. Obs.: Também é necessário tomar cuidado com o caso de haver dois (ou mais) “indivíduos” que tem as “notas” com a mesma distância em relação ao “valor_sorteado”. Neste caso, basta selecionar o “indivíduo” com a maior “nota”.
Espero ter ajudado. Se eu estiver errado, por favor, me mostrem onde está o equívoco.
Desde já agradeço.# Do professor -------------------------------------------------------- def seleciona_pai(self, soma_avaliacao): pai = -1 valor_sorteado = random() * soma_avaliacao soma = 0 i = 0 while i < len(self.populacao) and soma < valor_sorteado: soma += self.populacao[i].nota_avaliacao pai += 1 i += 1 return pai # ----------------------------------------------------------------------- # Meu ----------------------------------------------------------------- def seleciona_pai(self, soma_avaliacao): pai = -1 distancia = soma_avaliacao valor_sorteado = random() * soma_avaliacao for i in range(len(self.populacao)): if abs(valor_sorteado - self.populacao[i].nota_avaliacao) < distancia: distancia = abs(valor_sorteado - self.populacao[i].nota_avaliacao) pai = i elif abs(valor_sorteado - self.populacao[i].nota_avaliacao) == distancia: if self.populacao[pai].nota_avaliacao < self.populacao[i].nota_avaliacao: pai = i return pai # ----------------------------------------------------------------------
30 de agosto de 2022 às 10:11 #36530Olá Jeiverson,
Suas colocações estão corretas, mas a ideia por trás da roleta viciada é de selecionar o indivíduo na posição onde o valor sorteado está mesmo, não o mais próximo. Pense como uma roleta física mesmo, quando a gente gira, a escolha vale para onde a flecha está apontando, não para a fatia mais próxima. O
valor_sorteado
nada mais é do que a posição da flecha, e nós usamos o restante do código para determinar quem é o indivíduo presente naquela porção da roleta.31 de agosto de 2022 às 16:19 #36536Entendi.
Obrigado, Denny!8 de maio de 2024 às 08:00 #44718Qualquer outra dúvida é só avisar!
- AutorPosts
- Você deve fazer login para responder a este tópico.