def geraCruzamento(self, Frase):  # Método para gera os filhos
        x1 = 4  # Ponto de corte 1
        x2 = 9  # Ponto de corte 2
        x3 = 14  # Ponto de corte 3
        cnt = 0
        listTmp = []
        while (
                len(listTmp) < self.Tamanho_Populacao
        ):  # lopp. Enquanto o tamanho da lista filhos for menor que tamanho da população
            ind = self.populacao[
                cnt]  # Variável 'ind' recebe o primeiro indivíduo
            p1 = ind[:x1]  # corta o indivíduo em 3 pontos
            p2 = ind[x1:x2]
            p3 = ind[x2:x3]  #

            cnt += 1
            ind = self.populacao[
                cnt]  # Variável 'ind' recebe o segundo indivíduo
            p4 = ind[0:x1]  # corta o indivíduo em 3 pontos
            p5 = ind[x1:x2]
            p6 = ind[x2:x3]  #

            t1 = p1 + p5 + p3  # Produz um novo indivíduo(filho) com as partes cortadas
            t2 = p4 + p2 + p6  # Produz um novo indivíduo(filho) com as partes cortadas
            t1.append(0)  # Adiciona o valor 0 do fitness ao individuo 1
            t2.append(0)  # Adiciona o valor 0 do fitness ao individuo 2

            F = Fitness(Frase,
                        self.numCrom)  # Calcula o fitness dos indivíduos
            listTmp.append(
                F.Calc_Fitness(t1))  # Adiciona o indivíduo na lista de filhos
            F = Fitness(Frase,
                        self.numCrom)  # Calcula o fitness dos indivíduos
            listTmp.append(
                F.Calc_Fitness(t2))  # Adiciona o indivíduo na lista de filhos
            # repete o procedimento com mais dois individuos
        print("filhos")  # imprimi a lista de filhos
        for i in listTmp:
            print(i)
        return listTmp
Beispiel #2
0
    def Gera_PopInic(self, caracter, TAM_Pop,
                     NUM_CROM):  # Gera uma população inicial

        for x in range(0, TAM_Pop):  # Laço para
            IND = Individuo(caracter)  # Variável recebe indivíduo
            F = Fitness(
                self.Frase,
                NUM_CROM)  # A Variável F recebe instancia da classe fitness
            self.listPop.append(
                F.Calc_Fitness(IND.Gera_Individuo(NUM_CROM))
            )  # Adiciona o individuo na lista de populações e calcula o Fitness
            print(self.listPop[x])  # imprimi o indivíduo
        return self.listPop  # retorna a lista de indivíduos
Beispiel #3
0
    def gera_Mutacao(self, Frase):                 # Método para gerar mutação no filhos
        listaTmp = []
        listaFin = []
        listaFinal = []
        TX_Mut_A = round(random.random())          # Número aleatorio entre 0 e 1
        for x in self.lista_Filho:
            
            if(TX_Mut_A  <= self.TX_Mutac):       # Se o número aleatorio for menor e igual que taxa de mutação, o indivíduo sofre a mutação em 2 duas posições aleatorias
                x1 = random.randint(0, self.NUM_CROM-1)  # x1 = valor de posição aleatoria
                x2 = random.randint(0, self.NUM_CROM-1)  # x2 = valor de posição aleatoria
                I = Individuo(self.Caract)               # instancia clase indivíduo
                x[x1] = I.get_caracter()                 # Modifica o caracter na posição x1 por um novo caracter na mesma posição
                x[x2] = I.get_caracter()                 # Modifica o caracter na posição x2 por um novo caracter na mesma posição
                F =  Fitness(Frase, self.NUM_CROM)       # Recalcula o Fitness
                listaTmp.append(F.Calc_Fitness(x))
            else:                                        # Caso a condição não seja aceita
                listaTmp.append(x)                       # Adicione o indivíduo na lista sem alteração

        print('Mutação nos Filhos')                      # imprimi os filhos com ou sem mutação
        for y in listaTmp:
            print(y)

        for z in self.lista_Selec:                      # Adiciona os filhos e pais dentro de uma lista
            listaFin.append(z)
        for z in listaTmp:
            listaFin.append(z)

        listaFin.sort(key=lambda x: x[self.NUM_CROM]) # Ordena a lista de pais e filhos
        for x in range(self.TAM_Pop, len(listaFin)):  # gera uma lista com o melhor dos pais e filhos
            listaFinal.append(listaFin[x])

        print('Nova População')                       # imprimi a lista com os melhores
        for y in listaFinal:
            print(y)

        return listaFinal                             # retorna a lista com nova população