algorithm search a-star

algorithm - Retroceder en una estrella



search a-star (2)

Puede seguir los backpointers de los dos nodos hasta llegar al ancestro común (0,2), luego imprimir los nodos que visitó al seguir desde (2,0), seguidos de los nodos que visitó al seguir desde (3,3) , impreso al revés.

Para encontrar el ancestro común de dos nodos en un árbol de búsqueda A *, simplemente mantenga los dos "nodos actuales" y siga el indicador de retroceso de cualquiera que tenga el mayor costo g, hasta que los dos nodos actuales estén en el mismo lugar.

Sin embargo, vale la pena mencionar que esto es algo extraño. A * no es un recorrido basado en la pila, por lo que no retrocede.

Paredes azules

Celdas resaltadas en verde = lista abierta

Celdas resaltadas en rojo = lista cerrada

Hola, ¿alguien puede decirme cómo puedo implementar el retroceso en un algoritmo de búsqueda en estrella? He implementado la búsqueda de una estrella de acuerdo con wiki, pero no retrocede, lo que quiero decir con retroceso es que la lista abierta (celdas verdes) contiene 2,0 y 3,3 como se muestra en la imagen, al llegar a 2, 0 el nodo actual "saltaría" a 3,3 ya que el costo ahora es más de 3,3 y continuará la búsqueda desde allí, ¿cómo se puede hacer para retroceder desde 2,0-> 2,1-> 2,2 ... todo el camino de regreso a 3,3 y comenzar la búsqueda desde allí?


tu imagen es como un mapa de cuadrícula 2D

Pero su texto sugiere un enfoque gráfico que es un poco confuso.

  • Para el mapa de cuadrícula 2D, los costos deben ser diferentes entre las celdas de la ruta

Obtuviste demasiado cost=100 allí y, por lo tanto, no puedes retroceder en el camino. Debe aumentar o disminuir el costo en cada paso y llenar solo las celdas que están cerca de las últimas celdas llenas. Eso se puede hacer por recursividad en mapas grandes o escaneando un mapa completo o un cuadro delimitador para el último número lleno en mapas pequeños.

  • Busque aquí la implementación mía de C ++ A *

El retroceso

Se puede hacer escaneando vecinos de las celdas de inicio / final después de que el relleno A * se mueva siempre al costo más pequeño / más grande

En este ejemplo, comience a llenar desde (2,0) hasta que se golpee (3,3) y luego retroceda desde (3,2) cost=8 hasta el costo más pequeño (siempre cost-1 para llenado incremental). Si necesita la ruta en orden inverso, comience a llenar desde (3,3) lugar ...

acelerar

A veces, el llenado doble acelera el proceso, así que: comience a llenar desde ambos extremos y pare cuando se unan. Para reconocer qué celda se llena desde qué punto puede usar valores positivos y negativos, o algunos rangos lo suficientemente grandes para los costos.