def atualizar_h(self, pos_grid_final): self.h = func_aux.obter_distancia(self.pos_grid, pos_grid_final)
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