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