def buscaLocal01(self, individuo, fluxo, distancias): original = copy(individuo) for i in range(self.parametros.TAMCROMOSSOMO - 1): fitness = individuo[self.parametros.TAMCROMOSSOMO - 1] for j in range(self.parametros.TAMCROMOSSOMO - 1): if i != j: aux = individuo[i] individuo[i] = individuo[j] individuo[j] = aux auxilioFitness = individuo[self.parametros.TAMCROMOSSOMO - 1] self.funcaoObjetivo.avaliarIndividuo( individuo, fluxo, distancias) if (individuo[self.parametros.TAMCROMOSSOMO - 1] > fitness): aux2 = individuo[j] individuo[j] = individuo[i] individuo[i] = aux2 individuo[self.parametros.TAMCROMOSSOMO - 1] = auxilioFitness else: fitness = individuo[self.parametros.TAMCROMOSSOMO - 1] # print(original, individuo) self.calcularScore(original[self.parametros.TAMCROMOSSOMO - 1], individuo[self.parametros.TAMCROMOSSOMO - 1]) salvarHeuristicaUsada(self.parametros.idExecucao, self.parametros.BUSCALOCAL, 1, self.score)
def subOrdenacao(self, individuo, fluxo, distancias): original = copy(individuo) indice = randint(0, self.parametros.TAMCROMOSSOMO - 4) # print("Antes ", individuo) for i in range(self.parametros.TAMCROMOSSOMO - 2): if (individuo[indice + 1] > individuo[indice]): fitnessAnterior = individuo[self.parametros.TAMCROMOSSOMO - 1] aux = individuo[indice] individuo[indice] = individuo[indice + 1] individuo[indice + 1] = aux self.funcaoObjetivo.avaliarIndividuo(individuo, fluxo, distancias) if (fitnessAnterior < individuo[self.parametros.TAMCROMOSSOMO - 1]): individuo[indice + 1] = individuo[indice] individuo[indice] = aux individuo[self.parametros.TAMCROMOSSOMO - 1] = fitnessAnterior while (indice + 1 == self.parametros.TAMCROMOSSOMO - 2): indice = randint(0, self.parametros.TAMCROMOSSOMO - 2) self.calcularScore(original[self.parametros.TAMCROMOSSOMO - 1], individuo[self.parametros.TAMCROMOSSOMO - 1]) salvarHeuristicaUsada(self.parametros.idExecucao, self.parametros.BUSCALOCAL, 3, self.score)
def aux_mutacao(self, novoIndividuo, fluxo, distancias): if (self.mutacao.chanceMutar()): individuoCopia = copy.deepcopy(novoIndividuo) self.mutacao.mutar(novoIndividuo, self.codMutacao, fluxo, distancias) self.funcaoObjetivo.avaliarIndividuo(novoIndividuo, fluxo, distancias) self.mutacao.calcularScore( individuoCopia[self.parametros.TAMCROMOSSOMO - 1], novoIndividuo[self.parametros.TAMCROMOSSOMO - 1]) if (individuoCopia[self.parametros.TAMCROMOSSOMO - 1] < novoIndividuo[self.parametros.TAMCROMOSSOMO - 1]): novoIndividuo = copy.deepcopy(individuoCopia) salvarHeuristicaUsada(self.parametros.idExecucao, self.parametros.MUTACAO, self.codMutacao, self.score) else: self.mutacao.score = 0
def buscaLocal02(self, individuo, fluxo, distancias): original = copy(individuo) for i in range(self.parametros.TAMCROMOSSOMO - 1): fitness = individuo[self.parametros.TAMCROMOSSOMO - 1] direitaToEsquerda = self.parametros.TAMCROMOSSOMO - 1 for esquerdaToDireita in range(self.parametros.TAMCROMOSSOMO - 1): direitaToEsquerda = direitaToEsquerda - 1 if direitaToEsquerda != esquerdaToDireita: aux = individuo[direitaToEsquerda] individuo[direitaToEsquerda] = individuo[esquerdaToDireita] individuo[esquerdaToDireita] = aux auxilioFitness = individuo[self.parametros.TAMCROMOSSOMO - 1] self.funcaoObjetivo.avaliarIndividuo( individuo, fluxo, distancias) if (individuo[self.parametros.TAMCROMOSSOMO - 1] > fitness): aux2 = individuo[esquerdaToDireita] individuo[esquerdaToDireita] = individuo[ direitaToEsquerda] individuo[direitaToEsquerda] = aux2 individuo[self.parametros.TAMCROMOSSOMO - 1] = auxilioFitness else: fitness = individuo[self.parametros.TAMCROMOSSOMO - 1] self.calcularScore(original[self.parametros.TAMCROMOSSOMO - 1], individuo[self.parametros.TAMCROMOSSOMO - 1]) salvarHeuristicaUsada(self.parametros.idExecucao, self.parametros.BUSCALOCAL, 2, self.score)
def reproduzir01(self, populacao, fluxo, distancias, pai01, pai02): utils = Utils(self.parametros) escolhido = 0 novoIndividuo = [0] * (self.parametros.TAMCROMOSSOMO) genePassado = 0 listaAuxiliar = [[0 for y in range(self.parametros.TAMCROMOSSOMO)] for x in range(self.parametros.NUMMAXIMOFILHOS + 2)] contadorAuxiliar = 0 utils.inserir(listaAuxiliar[contadorAuxiliar], populacao[pai01]) contadorAuxiliar = contadorAuxiliar + 1 utils.inserir(listaAuxiliar[contadorAuxiliar], populacao[pai02]) for filho in range(self.parametros.NUMMAXIMOFILHOS): contadorAuxiliar = contadorAuxiliar + 1 genePassado = 0 escolhido = 0 novoIndividuo = [0] * self.parametros.TAMCROMOSSOMO utils.zerar(novoIndividuo) for i in range(self.parametros.N): escolhido = randint(0, 1) genePassado = randint(0, self.parametros.TAMCROMOSSOMO - 2) if (escolhido == 0): while (populacao[pai01][genePassado] in novoIndividuo): genePassado = randint( 0, self.parametros.TAMCROMOSSOMO - 2) novoIndividuo[i] = populacao[pai01][genePassado] else: while (populacao[pai02][genePassado] in novoIndividuo): genePassado = randint( 0, self.parametros.TAMCROMOSSOMO - 2) novoIndividuo[i] = populacao[pai02][genePassado] self.funcaoObjetivo.avaliarIndividuo(novoIndividuo, fluxo, distancias) self.aux_mutacao(novoIndividuo, fluxo, distancias) utils.inserir(listaAuxiliar[contadorAuxiliar], novoIndividuo) # self.log(populacao[pai01], populacao[pai02], novoIndividuo) utils.ordenar(listaAuxiliar) if (listaAuxiliar[0] != novoIndividuo): self.calcularScore(populacao[pai01], populacao[pai02], listaAuxiliar) utils.persistirMelhores(listaAuxiliar, populacao, pai01, pai02) # print(f'manteve {listaAuxiliar[0]} | {listaAuxiliar[1]}') salvarHeuristicaUsada(self.parametros.idExecucao, self.parametros.REPRODUCAO, 1, self.score)
def reproduzir02(self, populacao, fluxo, distancias, pai01, pai02): utils = Utils(self.parametros) numeroFilhos = randint(1, self.parametros.NUMMAXIMOFILHOS) maisPrivilegiado = 0 listaAuxiliar = [[0 for y in range(self.parametros.TAMCROMOSSOMO)] for x in range(self.parametros.NUMMAXIMOFILHOS + 2)] contadorAuxiliar = 0 utils.inserir(listaAuxiliar[contadorAuxiliar], populacao[pai01]) contadorAuxiliar = contadorAuxiliar + 1 utils.inserir(listaAuxiliar[contadorAuxiliar], populacao[pai02]) for filho in range(self.parametros.NUMMAXIMOFILHOS): contadorAuxiliar = contadorAuxiliar + 1 if (populacao[pai01][self.parametros.TAMCROMOSSOMO - 1] < populacao[pai02][self.parametros.TAMCROMOSSOMO - 1]): maisPrivilegiado = pai01 menosPrivilegiado = pai02 else: maisPrivilegiado = pai02 menosPrivilegiado = pai01 novoIndividuo = [self.parametros.INFINITO ] * self.parametros.TAMCROMOSSOMO for i in range(self.parametros.TAMCROMOSSOMO): i = randint(0, self.parametros.TAMCROMOSSOMO - 4) if (i + 2 >= self.parametros.TAMCROMOSSOMO - 1): i = 0 novoIndividuo[i] = populacao[maisPrivilegiado][i] else: novoIndividuo[i] = populacao[maisPrivilegiado][i] i = i + 2 for i in range(self.parametros.TAMCROMOSSOMO): indice = populacao[menosPrivilegiado][i] if ((indice not in novoIndividuo) and utils.posicaoVazia(novoIndividuo) != None): novoIndividuo[utils.posicaoVazia( novoIndividuo)] = populacao[menosPrivilegiado][i] self.funcaoObjetivo.avaliarIndividuo(novoIndividuo, fluxo, distancias) self.aux_mutacao(novoIndividuo, fluxo, distancias) # self.log(populacao[pai01], populacao[pai02], novoIndividuo) utils.inserir(listaAuxiliar[contadorAuxiliar], novoIndividuo) utils.ordenar(listaAuxiliar) if (listaAuxiliar[0] != novoIndividuo): self.calcularScore(populacao[pai01], populacao[pai02], listaAuxiliar) utils.persistirMelhores(listaAuxiliar, populacao, pai01, pai02) # print(f'manteve {listaAuxiliar[0][self.parametros.TAMCROMOSSOMO - 1]} | {listaAuxiliar[1][self.parametros.TAMCROMOSSOMO - 1]} score: {self.score}') salvarHeuristicaUsada(self.parametros.idExecucao, self.parametros.REPRODUCAO, 2, self.score)