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)
Esempio n. 3
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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)