A* es un conjunto de pasos (un algoritmo) que los ordenadores pueden utilizar para averiguar cómo llegar rápidamente de un punto a otro en un mapa o grafo. Si tienes una lista de nodos (lugares) y conoces el coste para ir de uno a otro (por ejemplo, distancia o tiempo), A* puede decirte el camino más corto. Está relacionado con el algoritmo de Dijkstra, pero añade conjeturas inteligentes (heurísticas) para evitar explorar caminos que probablemente sean largos. A* es una buena opción cuando solo quieres la ruta entre dos sitios concretos; si necesitas todas las rutas entre muchos pares, hay algoritmos diferentes (por ejemplo, Floyd–Warshall). A* tampoco resuelve problemas para visitar muchos lugares en un único viaje, como el problema del vendedor ambulante.
Cómo funciona (explicación simple)
A* mantiene dos conjuntos de nodos: abierto (candidatos por explorar) y cerrado (ya explorados). Para cada nodo n calcula:
- g(n): coste conocido desde el nodo inicial hasta n.
- h(n): estimación heurística del coste desde n hasta el objetivo.
- f(n) = g(n) + h(n): estimación del coste total de la ruta que pasa por n.
En cada paso, A* extrae del conjunto abierto el nodo con el menor f(n), lo expande (genera sus vecinos) y actualiza sus costes. Si h(n) es una buena estimación, A* explora mucho menos que Dijkstra.
Propiedades importantes
- Óptimo (con heurística admisible): si la heurística no sobreestima el coste real hasta el objetivo (es admisible), A* garantiza encontrar un camino de coste mínimo.
- Completo: si hay un número finito de nodos y cada paso tiene coste mínimo mayor que cero, A* encontrará una solución si existe.
- Eficiencia: cuanto más informativa sea la heurística (más cercana al coste real), menos nodos necesitará explorar. En el peor caso, la complejidad puede ser exponencial en el tamaño del problema.
- Consistencia/Monotonía: si la heurística cumple h(n) ≤ coste(n,n') + h(n') para cada arista (es consistente), entonces f(n) nunca disminuye a lo largo de una ruta y no es necesario reabrir nodos cerrados.
Heurísticas comunes
- Distancia Euclidiana: para movimiento en espacio continuo o cuando se permite moverse en cualquier dirección en el plano.
- Distancia Manhattan: para rejillas donde el movimiento se limita a ejes ortogonales (arriba/abajo/izquierda/derecha).
- Distancia Chebyshev: para rejillas donde se permiten movimientos diagonales a coste igual.
- Heurística cero (h(n)=0): A* se convierte en Dijkstra.
Ejemplo sencillo
En una cuadrícula con obstáculos, si queremos ir de A a B y solo podemos movernos en las cuatro direcciones, usar la distancia Manhattan como h es admisible y suele guiar la búsqueda hacia el objetivo evitando explorar grandes zonas irrelevantes.
Pseudocódigo breve
Inicializar abierto con el nodo inicial (g=inicial=0, f=h(inicial)) Mientras abierto no esté vacío: sacar el nodo n con menor f(n) si n es el objetivo: reconstruir y devolver la ruta mover n a cerrado para cada vecino m de n: costeTentativo = g(n) + coste(n,m) si m en cerrado y costeTentativo ≥ g(m): continuar si m no en abierto o costeTentativo < g(m): g(m) = costeTentativo h(m) = heurística(m) f(m) = g(m) + h(m) establecer padre(m) = n si m no en abierto: añadir m a abierto
Variantes y mejoras
- Weighted A*: pondera la heurística (f = g + w·h) para obtener soluciones más rápidas pero posiblemente subóptimas si w>1.
- Greedy Best-First Search: usa f = h, priorizando la cercanía al objetivo; es rápido pero no garantiza optimalidad.
- IDA* (Iterative Deepening A*): versión con menor uso de memoria, adecuada cuando la memoria es limitada.
- A* bidireccional: busca desde el inicio y desde el objetivo simultáneamente para acelerar la búsqueda en grafos grandes.
- D* y D* Lite: variantes para grafos dinámicos donde los costes cambian y se necesita replanificar eficientemente.
Limitaciones y consideraciones prácticas
- El principal consumo de A* suele ser memoria: guarda nodos abiertos y cerrados, lo que puede ser prohibitivo en problemas grandes.
- Si la heurística no es buena, A* explorará casi tantos nodos como Dijkstra.
- Para consultas repetidas en el mismo mapa existen algoritmos más adecuados (por ejemplo, preprocesamiento de rutas).
- A* funciona en grafos y espacios continuos (discretizados) siempre que se pueda definir una heurística adecuada.
Aplicaciones comunes
- Pathfinding en videojuegos y simulaciones.
- Navegación para robots y vehículos autónomos.
- Sistemas de enrutamiento y planificación de rutas en mapas.
- Problemas de búsqueda en inteligencia artificial donde hay un estado inicial, acciones y un objetivo.
En resumen, A* es un algoritmo potente y versátil para encontrar rutas cortas cuando se dispone de una heurística informativa. Su rendimiento depende en gran medida de la calidad de esa heurística y del tamaño del espacio de búsqueda; en escenarios con memoria limitada o consultas múltiples puede convenir usar variantes o algoritmos alternativos.