La pregunta es, como, ¿qué ocurre si no se puede acceder al nodo más cercano desde el nodo más cercano anterior?
Este paso no es necesario. Como en, no estás calculando un camino desde el anterior más cercano al más cercano, estás tratando de llegar a tu nodo objetivo, y lo más cercano es lo único que importa (por ejemplo, al algoritmo no le importa esa última iteración) estabas a 100 km de distancia, porque esta iteración estás a solo 96 km de distancia).
Como introducción general, A * no construye directamente una ruta: explora hasta que definitivamente sabe que la ruta está contenida dentro de la región que ha explorado, y luego construye la ruta en función de la información registrada durante la exploración .
(voy a utilizar the code in the Wikipedia article como una implementación de referencia para ayudar a mi explicación.)
usted tiene una de dos conjuntos de nodos: closedset
y openset
closedset
sostiene nodos que han sido evaluados por completo, es decir, usted sabe exactamente qué tan lejos están de start
y todos sus vecinos están en uno de los dos conjuntos. No hay más cálculos que puedas hacer con ellos y podamos (más o menos) ignorarlos. (Básicamente estos están completamente contenidos dentro del borde.)
openset
tiene nodos "fronterizos", usted sabe qué tan lejos están de start
, pero todavía no ha tocado a sus vecinos, por lo que están al borde de su búsqueda hasta aquí.
(Implícitamente, hay un tercer grupo:. Nodos completamente intacta, pero que en realidad no tocarlos hasta que estén en openset
por lo que no importan.)
En una iteración dada, si' Si tiene nodos que explorar (es decir, nodos en openset
), necesita averiguar cuál explorar.Este es el trabajo de la heurística, básicamente le da una pista sobre qué punto en el borde será el mejor para explorar a continuación, diciéndole qué nodo cree que tendrá la ruta más corta a goal
.
El nodo más cercano anterior es irrelevante, simplemente expandió el borde un poco, agregando nuevos nodos a openset
. Estos nuevos nodos ahora son candidatos para el nodo más cercano en esta iteración.
Al principio, sólo se openset
contiene start
, pero entonces iterar y en cada paso de la frontera se expande un poco (en la dirección más prometedora), hasta que finalmente llegue a goal
.
Cuando A * está realmente haciendo la exploración, no se preocupa de qué nodos vinieron de dónde. No es necesario, porque conoce su distancia desde start
y la función heurística y eso es todo lo que necesita.
Sin embargo, para reconstruir la ruta más adelante, necesita tener algún registro de la ruta, esto es lo que camefrom
es. Para un nodo determinado, camefrom
lo vincula al nodo que está más cerca de start
, por lo que puede reconstruir la ruta más corta siguiendo los enlaces hacia atrás desde goal
.
¿Cómo se puede tomar un "gráfico" como argumento de función?
Al pasar uno de los representations of a graph.
Realmente no veo cómo A * se aplica al TSP. Quiero decir, encontrar una ruta de A a B, claro, entiendo eso. Pero el TSP? No veo la conexión.
Necesita una heurística diferente y una condición de finalización diferente: goal
ya no es un nodo único, sino el estado de tener todo conectado; y su heurística es una estimación de la longitud de la ruta más corta que conecta los nodos restantes.
[A *] (http://en.wikipedia.org/wiki/A*_search_algorithm) parece que b e un resumen bastante bueno de lo que puedo recordar de un curso de CS. [Algoritmo de Dijkstra] (http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm) es muy similar (pero más simple) por lo que podría ser mejor comenzar con. Una cola de prioridad es útil en ambos casos. –
@pst: A * y el algoritmo de Dijkstra son útiles si quieres ir del punto A al punto B. Si quieres ir del punto A al punto A por un camino con restricciones específicas, bueno, eso es otra cosa. –
Cuando estaba en Uni (durante el milenio anterior) teníamos la tarea de implementar A * en el idioma que queríamos, la mayoría escogíamos C++ con el que todos estábamos más familiarizados pero elegí Prolog porque parecía que se ajustaba mejor al problema. Breve historia, terminé la tarea mucho más rápido que la mayoría de la gente, quizás podrías comenzar en Prolog y saltarte la fase intermedia. – Motti