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
    Profile photo ofJeiversonChristianJeiverson 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
    Profile photo ofdennyDenny 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
    Profile photo ofJeiversonChristianJeiverson 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.