Articulo de referencia

Algoritmo de búsqueda A*

O(|E|\\log|V|) = O(b^d) "},"best-time":{"wt":""},"average-time":{"wt":""},"space":{"wt":" O(|V|) = O(b^d) "}},"i":0}}]}"> A* (pronunciado "A-estrella") es un algoritmo de recorr...

A* (pronunciado "A-estrella") es un algoritmo de recorrido de grafos y búsqueda de caminos que se utiliza en muchos campos de la informática debido a su completitud, optimalidad y eficiencia óptima. [ 1 ] Dado un grafo ponderado , un nodo de origen y un nodo de destino, el algoritmo encuentra el camino más corto (con respecto a los pesos dados) desde el origen hasta el destino.

Una desventaja práctica importante es suO(bd){\displaystyle O(b^{d})}complejidad espacial donde d es la profundidad de la solución menos profunda (la longitud del camino más corto desde el nodo de origen a cualquier nodo de destino dado) y b es el factor de ramificación (el número máximo de sucesores para cualquier estado dado). En sistemas prácticos de enrutamiento de viajes , generalmente es superado por algoritmos que pueden preprocesar el grafo para lograr un mejor rendimiento, [ 2 ] así como por enfoques con limitaciones de memoria; sin embargo, A* sigue siendo la mejor solución en muchos casos. [ 3 ]

Peter Hart , Nils Nilsson y Bertram Raphael del Instituto de Investigación de Stanford (ahora SRI International ) publicaron el algoritmo por primera vez en 1968. [ 4 ] Puede considerarse una extensión del algoritmo de Dijkstra . A* logra un mejor rendimiento al utilizar heurísticas para guiar su búsqueda.

El algoritmo A* finaliza una vez que encuentra el camino más corto hacia un objetivo específico, en lugar de generar todo el árbol de caminos más cortos desde un origen específico hasta todos los objetivos posibles.

Historia

El algoritmo A* fue inventado por investigadores que trabajaban en la planificación de rutas del robot Shakey.

A* se creó como parte del proyecto Shakey , cuyo objetivo era construir un robot móvil capaz de planificar sus propias acciones. Nils Nilsson propuso originalmente utilizar el algoritmo Graph Traverser [ 5 ] para la planificación de rutas de Shakey. [ 6 ] Graph Traverser se guía por una función heurística h ( n ) , la distancia estimada del nodo n al nodo objetivo; ignora por completo g ( n ) , la distancia del nodo inicial a n . Bertram Raphael sugirió utilizar la suma g ( n ) + h ( n ) . [ 7 ] Peter Hart inventó los conceptos que ahora denominamos admisibilidad y consistencia de las funciones heurísticas. A* se diseñó originalmente para encontrar rutas de menor coste cuando el coste de una ruta es la suma de sus costes, pero se ha demostrado que A* puede utilizarse para encontrar rutas óptimas para cualquier problema que cumpla las condiciones de un álgebra de costes. [ 8 ]

El artículo original de A* de 1968 [ 4 ] contenía un teorema que afirmaba que ningún algoritmo similar a A* [ a ] podía expandir menos nodos que A* si la función heurística era consistente y la regla de desempate de A* se elegía adecuadamente. Unos años más tarde se publicó una "corrección" [ 9 ] que afirmaba que la consistencia no era necesaria, pero esto se demostró falso en 1985 en el estudio definitivo de Dechter y Pearl sobre la optimalidad de A* (ahora llamada eficiencia óptima), que dio un ejemplo de A* con una heurística que era admisible pero no consistente expandiendo arbitrariamente más nodos que un algoritmo alternativo similar a A*. [ 10 ]

Descripción

Algoritmo de búsqueda de rutas A* para navegar por un laberinto generado aleatoriamente.
Ilustración del algoritmo de búsqueda A* para encontrar un camino entre dos puntos en un grafo. De izquierda a derecha, se utiliza cada vez más una heurística que prioriza los puntos más cercanos al objetivo.

A* es un algoritmo de búsqueda informada , o búsqueda primero el mejor , lo que significa que se formula en términos de grafos ponderados : partiendo de un nodo inicial específico de un grafo, busca encontrar un camino hacia el nodo objetivo dado con el menor costo (menor distancia recorrida, menor tiempo, etc.). Para ello, mantiene un árbol de caminos que se originan en el nodo inicial y extiende esos caminos arista por arista hasta alcanzar el nodo objetivo.

En cada iteración de su bucle principal, A* necesita determinar cuál de sus caminos extender. Lo hace basándose en el costo del camino y una estimación del costo necesario para extender el camino hasta el objetivo. Específicamente, A* selecciona el camino que minimiza

F(norte)=gramo(norte)+h(norte){\displaystyle f(n)=g(n)+h(n)}

donde n es el siguiente nodo en el camino, g ( n ) es el costo del camino desde el nodo inicial hasta n , y h ( n ) es una función heurística que estima el costo del camino más barato desde n hasta el objetivo. La función heurística es específica para cada problema.

Las implementaciones típicas de A* utilizan una cola de prioridad para realizar la selección repetida de nodos de costo mínimo (estimado) para expandir. Esta cola de prioridad se conoce como conjunto abierto , frontera o borde . En cada paso del algoritmo, el nodo con el valor f ( x ) más bajo se elimina de la cola, los valores f y g de sus vecinos se actualizan en consecuencia, y estos vecinos se agregan a la cola. El algoritmo continúa hasta que un nodo eliminado (es decir, el nodo con el valor f más bajo de todos los nodos de la frontera) es un nodo objetivo. [ b ] El valor f de ese objetivo es entonces también el costo del camino más corto, ya que h en el objetivo es cero en una heurística admisible.

El algoritmo descrito hasta ahora solo proporciona la longitud del camino más corto. Para hallar la secuencia real de pasos, el algoritmo se puede modificar fácilmente de manera que cada nodo del camino registre a su predecesor. Tras ejecutar este algoritmo, el nodo final apuntará a su predecesor, y así sucesivamente, hasta que el predecesor de algún nodo sea el nodo inicial.

Por ejemplo, al buscar la ruta más corta en un mapa, h ( x ) podría representar la distancia en línea recta hasta el objetivo, ya que físicamente es la distancia mínima posible entre dos puntos cualesquiera. En el caso de un mapa cuadriculado de un videojuego, usar la distancia de Taxicab o la distancia de Chebyshev resulta más adecuado según el conjunto de movimientos disponibles (de 4 u 8 vías).

Si la heurística h satisface la condición adicional h ( x ) ≤ d ( x , y ) + h ( y ) para cada arista ( x , y ) del grafo (donde d denota la longitud de esa arista), entonces h se denomina monótona o consistente . Con una heurística consistente, se garantiza que A* encontrará una ruta óptima sin procesar ningún nodo más de una vez y A* es equivalente a ejecutar el algoritmo de Dijkstra con el coste reducido d' ( x , y ) = d ( x , y ) + h ( y ) − h ( x ) . [ 11 ]

Pseudocódigo

El siguiente pseudocódigo describe el algoritmo:

función reconstruir_ruta ( came_from , current ) ruta_total := {current} mientras current en came_from . keys : current := came_from [ current ] ruta_total . prepend ( current ) return ruta_total// A* encuentra un camino desde el inicio hasta el objetivo. // h es la función heurística. h(n) estima el costo para alcanzar el objetivo desde el nodo n. function a_star ( start , goal , h ) // El conjunto de nodos descubiertos que pueden necesitar ser (re)expandidos. // Inicialmente, solo se conoce el nodo de inicio. // Esto generalmente se implementa como un min-heap o una cola de prioridad en lugar de un hash-set. open_set := {start}// Para el nodo n, came_from[n] es el nodo inmediatamente anterior en el camino más barato desde el inicio // hasta n actualmente conocido. came_from := un mapa vacío// Para el nodo n, g_score[n] es el costo actualmente conocido del camino más barato desde start hasta n. g_score := mapa con valor predeterminado de infinito g_score [ start ] := 0// Para el nodo n, f_score[n] := g_score[n] + h(n). f_score[n] representa nuestra mejor estimación actual sobre // cuán barato podría ser un camino desde el inicio hasta el final si pasa por n. f_score := mapa con valor predeterminado de Infinito f_score [ inicio ] := h ( inicio )mientras open_set no esté vacío // Esta operación puede ocurrir en tiempo O(Log(N)) si open_set es un min-heap o una cola de prioridad current := el nodo en open_set con el valor f_score [] más bajo si current = goal return reconstruct_path ( came_from , current )open_set.remove ( current ) para cada vecino de current // d(current,neighbor) es el peso de la arista de current a neighbor // tentative_g_score es la distancia desde start hasta neighbor a través de current tentative_g_score := g_score [ current ] + d ( current , neighbor ) if tentative_g_score < g_score [ neighbor ] // Este camino a neighbor es mejor que cualquiera anterior. ¡Regístralo! came_from [ neighbor ] : = current g_score [ neighbor ] := tentative_g_score f_score [ neighbor ] : = tentative_g_score + h ( neighbor ) if neighbor not in open_set open_set.add ( neighbor )// El conjunto abierto está vacío, pero el objetivo nunca se alcanzó. Devolver error.

Nota: En este pseudocódigo, si un nodo es alcanzado por una ruta, eliminado de open_set, y posteriormente alcanzado por una ruta más barata, se agregará open_setnuevamente a . Esto es esencial para garantizar que la ruta devuelta sea óptima si la función heurística es admisible pero no consistente . Si la heurística es consistente, cuando un nodo es eliminado de open_setla ruta a se garantiza que es óptimo por lo que la prueba ' tentative_g_score < g_score[neighbor]' siempre fallará si el nodo es alcanzado nuevamente. El pseudocódigo implementado aquí a veces se llama la versión de búsqueda en grafo de A*. [ 12 ] Esto está en contraste con la versión sin la tentative_g_score < g_score[neighbor]prueba '' para agregar nodos de nuevo a open_set, que a veces se llama la versión de búsqueda en árbol de A* y requiere una heurística consistente para garantizar la optimalidad.

Ilustración del algoritmo A* para encontrar la ruta desde un nodo de inicio hasta un nodo de destino en un problema de planificación de movimiento de un robot . Los círculos vacíos representan los nodos del conjunto abierto , es decir, aquellos que aún no se han explorado, y los círculos rellenos pertenecen al conjunto cerrado. El color de cada nodo cerrado indica la distancia al destino: cuanto más verde, más cerca. Inicialmente, se observa que el algoritmo A* se mueve en línea recta hacia el destino; luego, al encontrar un obstáculo, explora rutas alternativas a través de los nodos del conjunto abierto.

Ejemplo

Un ejemplo de un algoritmo A* en acción donde los nodos son ciudades conectadas por carreteras y h(x) es la distancia en línea recta al punto objetivo:

Un ejemplo del algoritmo A* en acción (los nodos son ciudades conectadas por carreteras, h(x) es la distancia en línea recta al punto objetivo). Verde: Inicio, Azul: Destino, Naranja: Visitado.

Clave: verde: inicio; azul: meta; naranja: visitado

El algoritmo A* tiene aplicaciones prácticas. En este ejemplo, las aristas representan vías férreas y h(x) es la distancia geodésica (la distancia más corta posible en una esfera) hasta el destino. El algoritmo busca un camino entre Washington D. C. y Los Ángeles.

El algoritmo A* encuentra una ruta de vías férreas entre Washington, DC y Los Ángeles.

Detalles de implementación

Existen varias optimizaciones sencillas o detalles de implementación que pueden afectar significativamente el rendimiento de una implementación de A*. El primer detalle a tener en cuenta es que la forma en que la cola de prioridad maneja los empates puede tener un efecto significativo en el rendimiento en ciertas situaciones. Si los empates se resuelven de manera que la cola se comporte como LIFO (último en entrar, primero en salir ), A* se comportará como una búsqueda en profundidad entre rutas de igual costo (evitando explorar más de una solución igualmente óptima).

Cuando se requiere una ruta al final de la búsqueda, es común mantener con cada nodo una referencia a su padre. Al final de la búsqueda, estas referencias se pueden usar para recuperar la ruta óptima. Si se mantienen estas referencias, puede ser importante que el mismo nodo no aparezca en la cola de prioridad más de una vez (cada entrada corresponde a una ruta diferente hacia el nodo, y cada una con un costo diferente). Un enfoque estándar aquí es verificar si un nodo que está a punto de agregarse ya aparece en la cola de prioridad. Si es así, entonces los punteros de prioridad y padre se cambian para que correspondan a la ruta de menor costo. Una cola de prioridad estándar basada en un montón binario no admite directamente la operación de búsqueda de uno de sus elementos, pero se puede ampliar con una tabla hash que mapea los elementos a su posición en el montón, lo que permite que esta operación de disminución de prioridad se realice en tiempo logarítmico. Alternativamente, un montón de Fibonacci puede realizar las mismas operaciones de disminución de prioridad en tiempo amortizado constante .

Casos especiales

El algoritmo de Dijkstra , como otro ejemplo de un algoritmo de búsqueda de costo uniforme, puede considerarse un caso especial de A* dondeh(incógnita)=0{\displaystyle h(x)=0}para todo x . [ 13 ] [ 14 ] La búsqueda general en profundidad se puede implementar usando A* considerando que hay un contador global C inicializado con un valor muy grande. Cada vez que procesamos un nodo, asignamos C a todos sus vecinos recién descubiertos. Después de cada asignación, disminuimos el contador C en uno. Por lo tanto, cuanto antes se descubra un nodo, mayor será suh(incógnita){\displaystyle h(x)} valor. Tanto el algoritmo de Dijkstra como la búsqueda en profundidad se pueden implementar de manera más eficiente sin incluir unh(incógnita){\displaystyle h(x)}valor en cada nodo.

Propiedades

Terminación y finalización

En grafos finitos con pesos de aristas no negativos, A* tiene garantizado terminar y es completo , es decir, siempre encontrará una solución (un camino desde el inicio hasta el objetivo) si existe. En grafos infinitos con un factor de ramificación finito y costos de aristas que están acotados lejos de cero (d(incógnita,y)>ε>0{\textstyle d(x,y)>\varepsilon >0}para algún fijoε{\displaystyle \varepsilon }), A* tiene garantizado terminar solo si existe una solución. [ 1 ]

Admisibilidad

Se dice que un algoritmo de búsqueda es admisible si garantiza la obtención de una solución óptima. Si la función heurística utilizada por A* es admisible , entonces A* es admisible. Una "prueba" intuitiva de esto es la siguiente:

Llamamos cerrado a un nodo si ha sido visitado y no está en el conjunto abierto. Cerramos un nodo cuando lo eliminamos del conjunto abierto. Una propiedad básica del algoritmo A*, de la cual esbozaremos una demostración a continuación, es que cuandonorte{\displaystyle n}Está cerrado ,F(norte){\displaystyle f(n)} es una estimación optimista (límite inferior) de la distancia real desde el inicio hasta el objetivo. Entonces, cuando el nodo objetivo,gramo{\displaystyle g} , está cerrado,F(gramo){\displaystyle f(g)}No es más que la distancia real. Por otro lado, tampoco es menos que la distancia real, ya que es la longitud de un camino hacia el objetivo más un término heurístico.

Ahora veremos que siempre que un nodonorte{\displaystyle n}Está cerrado ,F(norte){\displaystyle f(n)}Es una estimación optimista. Basta con ver que siempre que el conjunto abierto no esté vacío, tiene al menos un nodo .norte{\displaystyle n}en una ruta óptima hacia la meta para la cualgramo(norte){\displaystyle g(n)} es la distancia real desde el inicio, ya que en ese casogramo(norte){\displaystyle g(n)}+h(norte){\displaystyle h(n)} subestima la distancia al objetivo y, por lo tanto, también lo hace el valor más pequeño elegido para el vértice cerrado. SeaPAG{\displaystyle P}Sea un camino óptimo desde el inicio hasta el objetivo.pag{\displaystyle p} ser el último nodo cerrado enPAG{\displaystyle P}para el cualgramo(pag){\displaystyle g(p)} es la distancia real desde el inicio hastapag{\displaystyle p} (el inicio es uno de esos vértices). El siguiente nodo enPAG{\displaystyle P} tiene el correctogramo{\displaystyle g}valor , ya que se actualizó cuandopag{\displaystyle p}Estaba cerrado, y está abierto ya que no está cerrado.

Optimalidad y consistencia

El algoritmo A es óptimamente eficiente con respecto a un conjunto de algoritmos alternativos Alts en un conjunto de problemas P si para cada problema P en P y cada algoritmo A′ en Alts , el conjunto de nodos expandidos por A al resolver P es un subconjunto (posiblemente igual) del conjunto de nodos expandidos por A′ al resolver P. El estudio definitivo de la eficiencia óptima de A* se debe a Rina Dechter y Judea Pearl. [ 10 ] Consideraron una variedad de definiciones de Alts y P en combinación con la heurística de A* siendo meramente admisible o siendo consistente y admisible. El resultado positivo más interesante que demostraron es que A*, con una heurística consistente, es óptimamente eficiente con respecto a todos los algoritmos de búsqueda admisibles tipo A* en todos los problemas de búsqueda "no patológicos". En términos generales, su noción de problema no patológico es lo que ahora entendemos por "salvo desempate". Este resultado no se cumple si la heurística de A* es admisible pero no consistente. En ese caso, Dechter y Pearl demostraron que existen algoritmos admisibles similares a A* que pueden expandir arbitrariamente menos nodos que A* en algunos problemas no patológicos.

La eficiencia óptima se refiere al conjunto de nodos expandidos, no al número de expansiones de nodos (el número de iteraciones del bucle principal de A*). Cuando la heurística utilizada es admisible pero no consistente, es posible que un nodo sea expandido por A* muchas veces, un número exponencial de veces en el peor de los casos. [ 15 ] En tales circunstancias, el algoritmo de Dijkstra podría superar a A* por un amplio margen. Sin embargo, investigaciones más recientes han descubierto que este caso patológico solo ocurre en ciertas situaciones artificiales donde el peso de las aristas del grafo de búsqueda es exponencial con el tamaño del grafo y que ciertas heurísticas inconsistentes (pero admisibles) pueden conducir a un número reducido de expansiones de nodos en las búsquedas de A*. [ 16 ] [ 17 ]

Relajación limitada

Búsqueda A* que utiliza una heurística que es 5,0 (=ε) veces una heurística consistente y obtiene una ruta subóptima.

Si bien el criterio de admisibilidad garantiza una ruta de solución óptima, también implica que A* debe examinar todas las rutas igualmente meritorias para encontrar la óptima. Para calcular rutas aproximadas más cortas, es posible acelerar la búsqueda a costa de la optimalidad relajando el criterio de admisibilidad. A menudo, se busca limitar esta relajación para garantizar que la ruta de solución no sea peor que (1 + ε ) veces la ruta de solución óptima. Esta nueva garantía se denomina ε -admisible.

Existen varios algoritmos ε -admisibles:

  • Ponderación estática/A* ponderada. [ 18 ] Si h a ( n ) es una función heurística admisible, en la versión ponderada de la búsqueda A* se utiliza h w ( n ) = ε h a ( n ) , ε > 1 como función heurística, y se realiza la búsqueda A* como de costumbre (lo que finalmente ocurre más rápido que usando h a ya que se expanden menos nodos). El camino encontrado por el algoritmo de búsqueda puede tener un costo de como máximo ε veces el del camino de menor costo en el grafo. [ 19 ]
  • Parábola convexa ascendente/descendente (XUP/XDP). [ 20 ] Modificación de la función de costo en A* ponderado para desplazar la optimalidad hacia el inicio o el objetivo. XDP proporciona caminos que son casi óptimos cerca del inicio, y los caminos XUP son casi óptimos cerca del objetivo. Ambos producenϵ{\displaystyle \epsilon }-rutas óptimas en general.
    FXDP(norte)=12ϵ[ gramo(norte)+(2ϵ1)+(gramo(norte)h(norte))2+4ϵgramo(norte)h(norte) ]{\displaystyle f_{\text{XDP}}(n)={\frac {1}{2\epsilon }}\left[\ g(n)+(2\epsilon -1)+{\sqrt {(g(n)-h(n))^{2}+4\epsilon g(n)h(n)}}\ \right]}.
    FXUP(norte)=12ϵ[ gramo(norte)+h(norte)+(gramo(norte)+h(norte))2+4ϵ(ϵ1)h(norte)2 ]{\displaystyle f_{\text{XUP}}(n)={\frac {1}{2\epsilon }}\left[\ g(n)+h(n)+{\sqrt {(g(n)+h(n))^{2}+4\epsilon (\epsilon -1)h(n)^{2}}}\ \right]}.
  • Curva ascendente/descendente por partes (pwXU/pwXD). [ 21 ] Similar a XUP/XDP pero con funciones por partes en lugar de parábolas. Las trayectorias de solución también sonϵ{\displaystyle \epsilon }-óptimo.
    FpwXD(norte)={gramo(norte)+h(norte),si h(norte)>gramo(norte)gramo(norte)+(2ϵ1)h(norte)/ϵ,si h(norte)gramo(norte){\displaystyle f_{\text{pwXD}}(n)={\begin{cases}g(n)+h(n),&{\text{if }}h(n)>g(n)\\g(n)+(2\epsilon -1)h(n)/\epsilon ,&{\text{if }}h(n)\leq g(n)\end{cases}}}
    FpwXU(norte)={gramo(norte)/(2ϵ1)+h(norte),si gramo(norte)<(2ϵ1)h(norte)(gramo(norte)+h(norte))/ϵ,si gramo(norte)(2ϵ1)h(norte){\displaystyle f_{\text{pwXU}}(n)={\begin{cases}g(n)/(2\epsilon -1)+h(n),&{\text{if }}g(n)<(2\epsilon -1)h(n)\\(g(n)+h(n))/\epsilon ,&{\text{if }}g(n)\geq (2\epsilon -1)h(n)\end{cases}}}
  • La ponderación dinámica [ 22 ] utiliza la función de coste F(norte)=gramo(norte)+(1+εw(norte))h(norte){\displaystyle f(n)=g(n)+(1+\varepsilon w(n))h(n)}, dondew(norte)={1d(norte)norted(norte)norte0de lo contrario{\displaystyle w(n)={\begin{cases}1-{\frac {d(n)}{N}}&d(n)\leq N\\0&{\text{otherwise}}\end{cases}}}y dónded(norte){\displaystyle d(n)} es la profundidad de la búsqueda y N es la longitud prevista de la ruta de la solución.
  • El ponderado dinámico muestreado [ 23 ] utiliza el muestreo de nodos para estimar mejor y desviar el error heurístico.
  • Aε{\displaystyle A_{\varepsilon }^{*}}. [ 24 ] utiliza dos funciones heurísticas. La primera es la lista FOCAL, que se utiliza para seleccionar nodos candidatos, y la segunda h F se utiliza para seleccionar el nodo más prometedor de la lista FOCAL.
  • Un ε [ 25 ] selecciona nodos con la función AF(norte)+BhF(norte){\displaystyle Af(n)+Bh_{F}(n)} , donde A y B son constantes. Si no se puede seleccionar ningún nodo, el algoritmo retrocederá con la funcióndoF(norte)+DhF(norte){\displaystyle Cf(n)+Dh_{F}(n)}donde C y D son constantes.
  • AlphA* [ 26 ] intenta promover la explotación en profundidad dando preferencia a los nodos expandidos recientemente. AlphA* utiliza la función de costeFα(norte)=(1+wα(norte))F(norte){\displaystyle f_{\alpha }(n)=(1+w_{\alpha }(n))f(n)}, dóndewα(norte)={λgramo(π(norte))gramo(norte~)Λde lo contrario{\displaystyle w_{\alpha }(n)={\begin{cases}\lambda &g(\pi (n))\leq g({\tilde {n}})\\\Lambda &{\text{otherwise}}\end{cases}}}, donde λ y Λ son constantes conλΛ{\displaystyle \lambda \leq \Lambda }, π ( n ) es el padre de n , y ñ es el nodo expandido más recientemente.

Complejidad

Como algoritmo de búsqueda heurística, el rendimiento de A* está fuertemente influenciado por la calidad de la función heurística.h(norte){\textstyle h(n)}Si la heurística se aproxima bien al coste real para alcanzar el objetivo, A* puede reducir significativamente el número de expansiones de nodos. Por otro lado, una heurística deficiente puede dar lugar a muchas expansiones innecesarias.

En el peor de los casos

En el peor de los casos, A* expande todos los nodos.norte{\textstyle n}para quéF(norte)=gramo(norte)+h(norte)do{\textstyle f(n)=g(n)+h(n)\leq C^{*}}, dóndedo{\textstyle C^{*}}es el costo del nodo objetivo óptimo.

Por qué no puede ser peor

Supongamos que hay un nodonorte{\textstyle N'}en la lista abierta conF(norte)>do{\textstyle f(N')>C^{*}}y es el siguiente nodo que se expandirá. Dado que el nodo objetivo tieneF(gramooal)=gramo(gramooal)+h(gramooal)=gramo(gramooal)=do{\textstyle f(goal)=g(goal)+h(goal)=g(goal)=C^{*}}, yF(norte)>do{\textstyle f(N')>C^{*}}, el nodo objetivo tendrá un valor f más bajo y se expandirá antesnorte{\textstyle N'}Por lo tanto, A* nunca expande nodos conF(norte)>do{\textstyle f(n)>C^{*}}.

Por qué no puede ser mejor

Supongamos que existe un algoritmo óptimo que expande menos nodos quedo{\textstyle C^{*}}en el peor de los casos usando la misma heurística. Eso significa que debe haber algún nodonorte{\textstyle N'}de tal manera queF(norte)<do{\textstyle f(N')<C^{*}}, sin embargo, el algoritmo opta por no expandirlo.

Ahora consideremos un grafo modificado donde una nueva arista de costoε{\textstyle \varepsilon }(conε>0{\textstyle \varepsilon >0}) se agrega desdenorte{\textstyle N'}hacia la meta. SiF(norte)+ε<do{\textstyle f(N')+\varepsilon <C^{*}}, entonces el nuevo camino óptimo pasa pornorte{\textstyle N'}Sin embargo, dado que el algoritmo aún evita la expansiónnorte{\textstyle N'}, no alcanzará la nueva ruta óptima, violando así su optimalidad.

Por lo tanto, ningún algoritmo óptimo que incluya A* podría expandir menos nodos quedo{\textstyle C^{*}}en el peor de los casos.

Notación matemática

La complejidad del peor caso de A* se describe a menudo comoO(bd){\textstyle O(b^{d})}, dóndeb{\displaystyle b}es el factor de ramificación yd{\textstyle d}es la profundidad del objetivo más superficial. Si bien esto da una idea aproximada, no refleja con precisión el comportamiento real de A*.

Un límite más preciso considera el número de nodos conF(norte)do{\textstyle f(n)\leq C^{*}}. Siε{\displaystyle \varepsilon }es la diferencia más pequeña posible enF{\textstyle f}-costo entre nodos distintos, entonces A* puede expandirse hasta:

O(doε){\displaystyle O\left({\frac {C^{*}}{\varepsilon }}\right)}

Esto representa la complejidad temporal y espacial en el peor de los casos.

Complejidad espacial

La complejidad espacial de A* es aproximadamente la misma que la de todos los demás algoritmos de búsqueda de grafos, ya que mantiene todos los nodos generados en memoria. [ 1 ] En la práctica, esto resulta ser el mayor inconveniente de la búsqueda A*, lo que lleva al desarrollo de búsquedas heurísticas con memoria limitada, como A* de profundización iterativa , A* con memoria limitada y SMA* .

Aplicaciones

A* se usa frecuentemente para el problema común de búsqueda de rutas en aplicaciones como videojuegos, pero fue diseñado originalmente como un algoritmo general de recorrido de grafos. [ 4 ] Encuentra aplicaciones en diversos problemas, incluyendo el problema del análisis sintáctico usando gramáticas estocásticas en PLN . [ 27 ] Otros casos incluyen la búsqueda de información en el aprendizaje en línea. [ 28 ]

Relaciones con otros algoritmos

Lo que distingue a A* de un algoritmo de búsqueda voraz primero en amplitud es que toma en cuenta el costo/distancia ya recorrida, g ( n ) .

Algunas variantes comunes del algoritmo de Dijkstra pueden considerarse un caso especial de A* donde la heurísticah(norte)=0{\displaystyle h(n)=0}para todos los nodos; [ 13 ] [ 14 ] a su vez, tanto Dijkstra como A* son casos especiales de programación dinámica . [ 29 ] A* en sí mismo es un caso especial de una generalización de ramificación y acotación . [ 30 ]

A* es similar a la búsqueda en haz, excepto que la búsqueda en haz mantiene un límite en el número de caminos que tiene que explorar. [ 31 ]

Variantes

A* también puede adaptarse a un algoritmo de búsqueda bidireccional , pero se debe tener especial cuidado con el criterio de parada. [ 35 ]

Véase también

Notas

  1. «Similar a A*» significa que el algoritmo busca extendiendo caminos que parten del nodo inicial, un borde a la vez, tal como lo hace A*. Esto excluye, por ejemplo, los algoritmos que buscan hacia atrás desde el objetivo o en ambas direcciones simultáneamente. Además, los algoritmos cubiertos por este teorema deben ser admisibles y no estar «más informados» que A*.
  2. Los nodos objetivo pueden ser sobrepasados ​​varias veces si quedan otros nodos con valores f más bajos , ya que pueden conducir a un camino más corto hacia un objetivo.

Referencias

  1. 1 2 3 Russell, Stuart J.; Norvig , Peter (2018). Inteligencia artificial: un enfoque moderno (4.ª  ed.). Boston: Pearson. ISBN 978-0134610993OCLC 1021874142 
  2. Delling, D.; Sanders, P .; Schultes, D.; Wagner, D. (2009). «Ingeniería de algoritmos de planificación de rutas». Algoritmia de redes grandes y complejas: diseño, análisis y simulación . Lecture Notes in Computer Science. Vol. 5515. Springer. pp. 117–139 . doi : 10.1007/978-3-642-02094-0_7 . ISBN   978-3-642-02093-3.
  3. Zeng, W.; Church, RL (2009). "Encontrar rutas más cortas en redes viales reales: el caso de A*" . Revista Internacional de Ciencias de la Información Geográfica . 23 (4): 531– 543. Bibcode : 2009IJGIS..23..531Z . doi : 10.1080/13658810801949850 . S2CID 14833639 . 
  4. 1 2 3 Hart, PE ; Nilsson, NJ ; Raphael, B. (1968). "Una base formal para la determinación heurística de rutas de costo mínimo". IEEE Transactions on Systems Science and Cybernetics . 4 (2): 100– 7. Bibcode : 1968IJSSC...4..100H . doi : 10.1109/TSSC.1968.300136 .
  5. Doran, JE; Michie, D. (1966-09-20). "Experimentos con el programa Graph Traverser". Proc. R. Soc. Lond. A . 294 (1437): 235– 259. Bibcode : 1966RSPSA.294..235D . doi : 10.1098/rspa.1966.0205 . S2CID 21698093 . 
  6. Nilsson, Nils J. (30 de octubre de 2009). La búsqueda de la inteligencia artificial (PDF) . Cambridge: Cambridge University Press. ISBN 9780521122931Uno de los primeros problemas que consideramos fue cómo planificar una secuencia de "puntos de referencia" que Shakey pudiera usar para navegar de un lugar a otro. […] El problema de navegación de Shakey es un problema de búsqueda, similar a los que he mencionado anteriormente .
  7. Nilsson, Nils J. (30 de octubre de 2009). La búsqueda de la inteligencia artificial (PDF) . Cambridge: Cambridge University Press. ISBN 9780521122931Bertram Raphael, quien dirigía el trabajo en Shakey en ese momento, observó que un mejor valor para la puntuación sería la suma de la distancia recorrida hasta el momento desde la posición inicial más mi estimación heurística de la distancia que el robot tenía que recorrer .
  8. Edelkamp, ​​Stefan; Jabbar, Shahid; Lluch-Lafuente, Alberto (2005). «Búsqueda heurística algebraica de costes». Actas de la Vigésima Conferencia Nacional sobre Inteligencia Artificial (AAAI) (PDF) . págs. 1362–1367 . ISBN  978-1-57735-236-5.
  9. Hart, Peter E.; Nilsson, Nils J .; Raphael, Bertram (1972-12-01). "Corrección a 'Una base formal para la determinación heurística de rutas de costo mínimo'" (PDF) . Boletín ACM SIGART (37): 28– 29. doi : 10.1145/1056777.1056779 . S2CID 6386648 . 
  10. 1 2 Dechter, Rina; Judea Pearl (1985). "Estrategias generalizadas de búsqueda primero en el mejor y la optimalidad de A*" . Journal of the ACM . 32 (3): 505– 536. doi : 10.1145/3828.3830 . S2CID 2092415 . 
  11. Nannicini, Giacomo; Delling, Daniel; Schultes, Dominik; Liberti, Leo (2012). "Búsqueda A* bidireccional en redes viales dependientes del tiempo" (PDF) . Networks . 59 (2): 240– 251. doi : 10.1002/NET.20438 .
  12. Russell, Stuart J.; Norvig , Peter (2009). Inteligencia artificial: Un enfoque moderno (3.ª ed.). Boston: Pearson. pág. 95. ISBN   978-0136042594.
  13. 1 2 De Smith, Michael John; Goodchild, Michael F.; Longley, Paul (2007), Análisis geoespacial: una guía completa de principios, técnicas y herramientas de software , Troubadour Publishing Ltd, pág. 344, ISBN  9781905886609.
  14. 1 2 Hetland, Magnus Lie (2010), Python Algorithms: Mastering Basic Algorithms in the Python Language , Apress, p. 214, ISBN  9781430232377Archivado del original el 15 de febrero de 2022..
  15. Martelli, Alberto (1977). "Sobre la complejidad de los algoritmos de búsqueda admisibles". Inteligencia Artificial . 8 (1): 1– 13. doi : 10.1016/0004-3702(77)90002-9 .
  16. Felner, Ariel; Uzi Zahavi (2011). "Heurísticas inconsistentes en teoría y práctica" . Inteligencia Artificial . 175 ( 9–10 ): 1570–1603 . doi : 10.1016/j.artint.2011.02.001 .
  17. Zhang, Zhifu; NR Sturtevant (2009). Uso de heurísticas inconsistentes en la búsqueda A* . Vigésimo primera Conferencia Internacional Conjunta sobre Inteligencia Artificial. págs. 634–639 . 
  18. Pohl, Ira (1970). «Primeros resultados sobre el efecto del error en la búsqueda heurística». Machine Intelligence 5. Edinburgh University Press: 219–236 . ISBN 978-0-85224-176-9OCLC 1067280266 .​ 
  19. Pearl, Judea (1984). Heurísticas: Estrategias de búsqueda inteligentes para la resolución de problemas informáticos . Addison-Wesley. ISBN 978-0-201-05594-8.
  20. Chen, Jingwei; Sturtevant, Nathan R. (2019). "Condiciones para evitar reexpansiones de nodos en búsqueda subóptima acotada" . Actas de la Vigésimo Octava Conferencia Internacional Conjunta sobre Inteligencia Artificial . Organización de Conferencias Internacionales Conjuntas sobre Inteligencia Artificial: 1220–1226 .
  21. Chen, Jingwei; Sturtevant, Nathan R. (18 de mayo de 2021). "Condiciones necesarias y suficientes para evitar reaperturas en la búsqueda subóptima de mejor primero con funciones de acotación generales" . Actas de la Conferencia AAAI sobre Inteligencia Artificial . 35 (5): 3688–3696 . doi : 10.1609/aaai.v35i5.16485 . ISSN 2374-3468 . 
  22. Pohl, Ira (agosto de 1973). «Evitación de catástrofes (relativas), competencia heurística, ponderación dinámica genuina y cuestiones computacionales en la resolución heurística de problemas» (PDF) . Actas de la Tercera Conferencia Internacional Conjunta sobre Inteligencia Artificial (IJCAI-73) . Vol. 3. California, EE. UU., págs. 11-17 .  
  23. Köll, Andreas; Hermann Kaindl (agosto de 1992). «Un nuevo enfoque para la ponderación dinámica» . Actas de la Décima Conferencia Europea sobre Inteligencia Artificial (ECAI-92) . Viena, Austria: Wiley. págs. 16-17 . ISBN  978-0-471-93608-4.
  24. Pearl, Judea; Jin H. Kim (1982). "Estudios sobre heurísticas semiadmisibles". IEEE Transactions on Pattern Analysis and Machine Intelligence . 4 (4): 392– 399. Bibcode : 1982ITPAM...4..392P . doi : 10.1109 / TPAMI.1982.4767270 . PMID 21869053. S2CID 3176931 .  
  25. Ghallab, Malik; Dennis Allard (agosto de 1983). " A ε – un algoritmo de búsqueda heurística casi admisible eficiente" (PDF) . Actas de la Octava Conferencia Internacional Conjunta sobre Inteligencia Artificial (IJCAI-83) . Vol. 2. Karlsruhe, Alemania. págs. 789–791 . Archivado del original (PDF) el 6 de agosto de 2014.  
  26. Reese, Bjørn (1999). AlphaA*: Un algoritmo de búsqueda heurística ε -admisible (Informe). Instituto de Tecnología de Producción, Universidad del Sur de Dinamarca. Archivado del original el 31 de enero de 2016. Recuperado el 5 de noviembre de 2014 .
  27. Klein, Dan; Manning, Christopher D. (2003). "A* parsing: fast exact Viterbi parse selection" (PDF) . Actas de la Conferencia de Tecnología del Lenguaje Humano de 2003 del Capítulo Norteamericano de la Asociación de Lingüística Computacional . págs. 119–126 . doi : 10.3115/1073445.1073461 . 
  28. Kagan E.; Ben-Gal I. (2014). "Un algoritmo de pruebas grupales con aprendizaje informacional en línea" (PDF) . IIE Transactions . 46 (2): 164– 184. doi : 10.1080/0740817X.2013.803639 . S2CID 18588494. Archivado del original (PDF) el 5 de noviembre de 2016. Recuperado el 12 de febrero de 2016 . 
  29. Ferguson, Dave; Likhachev, Maxim; Stentz, Anthony (2005). "Una guía para la planificación de rutas basada en heurísticas" (PDF) . Actas del taller internacional sobre planificación bajo incertidumbre para sistemas autónomos, conferencia internacional sobre planificación y programación automatizadas (ICAPS) . págs. 9–18 . Archivado (PDF) del original el 29 de junio de 2016. 
  30. Nau, Dana S.; Kumar, Vipin; Kanal, Laveen (1984). "Ramificación y acotación general, y su relación con A* y AO*" (PDF) . Inteligencia Artificial . 23 (1): 29–58 . doi : 10.1016/0004-3702(84)90004-3 . Archivado (PDF) del original el 4 de octubre de 2012.
  31. "Variantes de A*" . theory.stanford.edu . Consultado el 9 de junio de 2023 .
  32. Hansen, Eric A.; Zhou, Rong (2007). "Búsqueda heurística en cualquier momento" . Journal of Artificial Intelligence Research . 28 : 267–297 . arXiv : 1110.2737 . doi : 10.1613/jair.2096 . S2CID 9832874 . 
  33. Fareh, Raouf; Baziyad, Mohammed; Rahman, Mohammad H.; Rabie, Tamer; Bettayeb, Maamar (2019-05-14). "Investigating Reduced Path Planning Strategy for Differential Wheeled Mobile Robot" . Robotica . 38 (2): 235–255 . doi : 10.1017/S0263574719000572 . ISSN 0263-5747 . S2CID 181849209 .  
  34. Pijls, Wim; Post, Henk. Otro algoritmo bidireccional para encontrar las rutas más cortas (PDF) (Informe técnico). Instituto de Econometría, Universidad Erasmus de Róterdam. EI 2009-10. Archivado (PDF) del original el 11 de junio de 2014.
  35. Goldberg, Andrew V.; Harrelson, Chris; Kaplan, Haim; Werneck, Renato F. "Algoritmos eficientes para encontrar la ruta más corta entre dos puntos" (PDF) . Universidad de Princeton . Archivado (PDF) del original el 18 de mayo de 2022.

Lecturas adicionales

  • Nilsson, NJ (1980). Principios de inteligencia artificial . Palo Alto, California: Tioga Publishing Company. ISBN 978-0-935382-01-3.
  • Walsh, Toby. La historia más breve de la IA .
  • Variación del algoritmo A* denominada A* de búsqueda de rutas jerárquicas (HPA*).
  • Brian Grinstead. "Algoritmo de búsqueda A* en JavaScript (actualizado)" . Archivado del original el 15 de febrero de 2020. Consultado el 8 de febrero de 2021 .
Obtenido de " https://en.wikipedia.org/w/index.php?title=A*_search_algorithm&oldid=1352790550 "