Exemplo n.º 1
0
    def executa(self) -> None:
        raiz = No(self.grafo.cidades[self.grafo.id_inicio])

        if self.grafo.id_inicio == self.grafo.id_fim:
            self.gera_solucao(raiz)
            return

        no = raiz

        fechados = [False] * len(self.grafo.cidades)
        descartados = list()
        patamar = self.grafo.heuristicas[self.grafo.id_inicio][
            self.grafo.id_fim]

        while True:
            if len(no.cidade.vizinhos) > no.cont_filho:
                if self.confere_ancestral(
                        no, no.cidade.vizinhos[no.cont_filho].id):
                    no.cont_filho += 1
                else:
                    filho = self.gera_filho(no)
                    if filho.valor + self.grafo.heuristicas[filho.cidade.id][
                            self.grafo.id_fim] > patamar + 0.00001:
                        descartados.append(filho)
                    elif filho.cidade.id == self.grafo.id_fim:
                        self.gera_solucao(filho, 0, -1)
                        return
                    else:
                        no = filho
            elif no == raiz:
                if len(descartados) == 0:
                    self.gera_solucao()
                    return

                menor = descartados[0]

                for i in range(1, len(descartados)):
                    if self.grafo.heuristicas[descartados[i].cidade.id][self.grafo.id_fim] + descartados[i].valor < \
                            self.grafo.heuristicas[menor.cidade.id][self.grafo.id_fim] + menor.valor:
                        menor = descartados[i]

                if self.grafo.heuristicas[menor.cidade.id][
                        self.grafo.id_fim] + menor.valor == patamar:
                    self.gera_solucao()
                    return

                fechados = [False] * len(self.grafo.cidades)
                descartados = list()
                patamar = self.grafo.heuristicas[menor.cidade.id][
                    self.grafo.id_fim] + menor.valor
                raiz.cont_filho = 0
            else:
                fechados[no.cidade.id] = True
                temp = no.pai
                temp.filhos.remove(no)
                no = temp
Exemplo n.º 2
0
    def gera_filho(self, no):
        no.expandido = True

        filho = No(no.cidade.vizinhos[no.cont_filho])
        filho.pai = no
        filho.valor = no.valor + self.grafo.distancias[no.cidade.id][
            filho.cidade.id]
        no.filhos.append(filho)
        no.cont_filho += 1

        return filho
    def executa(self) -> None:
        raiz = No(self.grafo.cidades[self.grafo.id_inicio])

        if self.grafo.id_inicio == self.grafo.id_fim:
            self.gera_solucao(raiz)
            return

        no = raiz

        fechados = [False] * len(self.grafo.cidades)

        pilha = LifoQueue()

        self.gera_filhos(raiz, fechados)

        for i in reversed(range(len(self.grafo.cidades))):
            if len(no.filhos) > i:
                pilha.put(no.filhos[i])

        while not pilha.empty():
            aux = pilha.get()
            aux.pai.cont_filho += 1
            if aux.cidade.id == self.grafo.id_fim:
                self.gera_solucao(aux, pilha.qsize(), fechados.count(True))
                return

            if not aux.expandido:
                self.gera_filhos(aux, fechados)

            for j in reversed(range(len(self.grafo.cidades))):
                if len(aux.filhos) > j:
                    pilha.put(aux.filhos[j])

        self.gera_solucao()
        return
    def executa(self) -> None:
        raiz = No(self.grafo.cidades[self.grafo.id_inicio])

        if self.grafo.id_inicio == self.grafo.id_fim:
            self.gera_solucao(raiz)
            return

        no = raiz

        while True:
            if len(no.cidade.vizinhos) > no.cont_filho:
                if self.confere_ancestral(
                        no, no.cidade.vizinhos[no.cont_filho].id):
                    no.cont_filho += 1
                else:
                    filho = self.gera_filho(no)
                    if filho.cidade.id == self.grafo.id_fim:
                        self.gera_solucao(filho, 0, -1)
                        return
                    no = filho
            elif no == raiz:
                self.gera_solucao()
                return
            else:
                temp = no.pai
                temp.filhos.remove(no)
                no = temp
Exemplo n.º 5
0
    def gera_filhos(self, no, fechados):
        no.expandido = True
        fechados[no.cidade.id] = True

        while len(no.cidade.vizinhos) > no.cont_filho:
            proximo = no.cidade.vizinhos[no.cont_filho].id

            if not self.confere_ancestral(no,
                                          proximo) and not fechados[proximo]:
                filho = No(no.cidade.vizinhos[no.cont_filho])
                filho.pai = no
                filho.valor = no.valor + self.grafo.distancias[no.cidade.id][
                    filho.cidade.id]
                no.filhos.append(filho)

            no.cont_filho += 1

        no.cont_filho = 0
    def executa(self) -> None:
        raiz = No(self.grafo.cidades[self.grafo.id_inicio])

        if self.grafo.id_inicio == self.grafo.id_fim:
            self.gera_solucao(raiz)
            return

        no = raiz

        fechados = [False] * len(self.grafo.cidades)

        abertos = list()

        self.gera_filhos(raiz, fechados)

        abertos += [
            no.filhos[i]
            for i in range(len(self.grafo.cidades))
            if len(no.filhos) > i
        ]

        tamanho = len(abertos)

        while True:
            if len(abertos) == 0:
                self.gera_solucao()
                return

            menor = abertos[0]

            for i in range(1, tamanho):
                if self.grafo.heuristicas[abertos[i].cidade.id][self.grafo.id_fim] < \
                        self.grafo.heuristicas[menor.cidade.id][self.grafo.id_fim]:
                    menor = abertos[i]

            if menor.cidade.id == self.grafo.id_fim:
                self.gera_solucao(menor, len(abertos), fechados.count(True))
                return
            else:
                no = menor
                if not no.expandido:
                    self.gera_filhos(no, fechados)

                abertos.remove(menor)

                abertos += [
                    no.filhos[i]
                    for i in range(len(self.grafo.cidades))
                    if len(no.filhos) > i
                ]

                if len(abertos) == tamanho:
                    fechados[no.cidade.id] = True
                else:
                    tamanho = len(abertos)