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
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
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