def atualizar_h(self, pos_grid_final):
     self.h = func_aux.obter_distancia(self.pos_grid, pos_grid_final)
Ejemplo n.º 2
0
    def a_star_v2(self, nodulo_inicial, nodulo_final):

        nodulo_inicial.g = 0
        nodulo_inicial.atualizar_h(nodulo_final.pos_grid)
        nodulo_inicial.atualizar_f()
        nodulo_inicial.ja_foi_visitado = True

        lista_aberta = HeapCelulasGrid()
        lista_fechada = []
        lista_aberta.add_celula_heap(nodulo_inicial)

        while lista_aberta.qnt_celulas_heap > 0:

            nodulo_atual = lista_aberta.remover_primeira_celula_heap()  # obtendo o nodulo de menor f
            lista_fechada.append(nodulo_atual)

            if nodulo_atual == nodulo_final:

                lista_bruta = [i.pos_grid for i in lista_fechada]
                lista_refinada = []

                nodulo_regresso = nodulo_final

                while nodulo_regresso != nodulo_inicial:
                    lista_refinada.insert(0, nodulo_regresso.pos_grid)
                    nodulo_regresso = nodulo_regresso.parente

                lista_final = (lista_bruta, lista_refinada)

                self.mudar_cor_celulas_procura_caminho(lista_bruta)
                self.mudar_cor_celulas_caminho(lista_refinada)

                lista_celulas_usadas = func_aux.transformar_duas_listas_em_set(lista_aberta.lista_heap_celulas,
                                                                               lista_fechada)
                func_aux.restaurar_estado_inicial_celulas(lista_celulas_usadas)
                self.visualizar_a_star = True

                return lista_final

            lista_nodulos_vizinhos = self.obter_nodulos_vizinhos(nodulo_atual)

            for vizinho in lista_nodulos_vizinhos:

                if vizinho.ja_foi_visitado is False:
                    vizinho.parente = nodulo_atual
                    vizinho.atualizar_g()
                    vizinho.atualizar_h(nodulo_final.pos_grid)
                    vizinho.atualizar_f()
                    vizinho.ja_foi_visitado = True

                if vizinho.andavel is False or vizinho in lista_fechada:
                    continue

                distacia_vizinho = func_aux.obter_distancia(nodulo_atual.pos_grid, vizinho.pos_grid)
                novo_mov_para_vizinho = nodulo_atual.g + distacia_vizinho

                if novo_mov_para_vizinho < vizinho.g or vizinho not in lista_aberta.lista_heap_celulas:
                    vizinho.g = novo_mov_para_vizinho
                    vizinho.atualizar_f()
                    vizinho.parente = nodulo_atual
                    if vizinho not in lista_aberta.lista_heap_celulas:
                        lista_aberta.add_celula_heap(vizinho)

        return None
 def atualizar_g(self):
     self.g = self.parente.g + func_aux.obter_distancia(self.parente.pos_grid, self.pos_grid)
    def a_star_v2(self, nodulo_inicial, nodulo_final):

        nodulo_inicial.g = 0
        nodulo_inicial.atualizar_h(nodulo_final.pos_grid)
        nodulo_inicial.atualizar_f()
        nodulo_inicial.ja_foi_visitado = True

        lista_aberta = []
        lista_fechada = []
        lista_aberta.append(nodulo_inicial)

        while len(lista_aberta) > 0:

            nodulo_atual = lista_aberta.pop(0)  # obtendo o nodulo de menor f
            nodulo_atual.ja_foi_analisado = True
            lista_fechada.append(nodulo_atual)

            if nodulo_atual == nodulo_final:

                lista_bruta = [i.pos_grid for i in lista_fechada]
                lista_refinada = []

                nodulo_regresso = nodulo_final

                while nodulo_regresso != nodulo_inicial:
                    lista_refinada.insert(0, nodulo_regresso.pos_grid)
                    nodulo_regresso = nodulo_regresso.parente

                lista_final = (lista_bruta, lista_refinada)

                self.mudar_cor_celulas_procura_caminho(lista_bruta)
                self.mudar_cor_celulas_caminho(lista_refinada)

                lista_celulas_usadas = func_aux.transformar_duas_listas_em_set(
                    lista_aberta, lista_fechada)
                func_aux.restaurar_estado_inicial_celulas(lista_celulas_usadas)
                self.visualizar_a_star = True

                return lista_final

            lista_nodulos_vizinhos = self.obter_nodulos_vizinhos(nodulo_atual)

            for vizinho in lista_nodulos_vizinhos:

                if vizinho.andavel is False or vizinho.ja_foi_analisado is True:
                    continue

                if vizinho.ja_foi_visitado is False:
                    vizinho.parente = nodulo_atual
                    vizinho.atualizar_g()
                    vizinho.atualizar_h(nodulo_final.pos_grid)
                    vizinho.atualizar_f()
                    vizinho.ja_foi_visitado = True

                distacia_vizinho = func_aux.obter_distancia(
                    nodulo_atual.pos_grid, vizinho.pos_grid)
                novo_mov_para_vizinho = nodulo_atual.g + distacia_vizinho

                vizinho_na_lista_aberta = False

                if vizinho in lista_aberta:
                    vizinho_na_lista_aberta = True

                if novo_mov_para_vizinho < vizinho.g or vizinho_na_lista_aberta is False:
                    vizinho.g = novo_mov_para_vizinho
                    vizinho.atualizar_f()
                    vizinho.parente = nodulo_atual
                    if vizinho_na_lista_aberta is False:
                        if len(lista_aberta) == 0:
                            lista_aberta.append(vizinho)
                        else:
                            for i in range(len(lista_aberta)):
                                if vizinho.f < lista_aberta[i].f:
                                    lista_aberta.insert(i, vizinho)
                                    break
                                elif vizinho.f == lista_aberta[
                                        i].f and vizinho.h < lista_aberta[i].h:
                                    lista_aberta.insert(i, vizinho)
                                    break
                                elif i == len(lista_aberta) - 1:
                                    lista_aberta.append(vizinho)

        return None