Erro na função “seleciona_pai”.

Home Fóruns Fórum Algoritmos Genéticos em Python Erro na função “seleciona_pai”.

Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #36503
    Jeiverson Christian
    Participante

      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
      #  ----------------------------------------------------------------------
      #36530
      Denny Ceccon
      Moderador

        Olá 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.

        #36536
        Jeiverson Christian
        Participante

          Entendi.
          Obrigado, Denny!

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.