Visualizador de algoritmos de búsqueda de caminos

observa cómo distintos algoritmos de búsqueda compiten en la misma cuadrícula, frontera a frontera

Cargando simulación interactiva...

Lección

La teoría — Visualizador de algoritmos de búsqueda de caminos

Tres de los cuatro algoritmos del menú desplegable son el mismo algoritmo. Todos ellos clasifican las celdas a la espera de ser exploradas con una misma expresión, f(n) = g(n) + h(n) —el coste hasta ahora más el coste estimado restante— y solo se diferencian en cuál de los dos términos conservan. Elimina h y obtendrás Dijkstra. Ignora g y obtendrás Greedy Best-First. El cuarto, la búsqueda en anchura, es en lo que se convierte Dijkstra cuando cada paso cuesta lo mismo.

Qué significa cada símbolo

g(n)
el coste de la ruta más barata encontrada hasta ahora desde el inicio hasta la celda n. Un paso lateral o vertical cuesta 1; uno diagonal cuesta √2, porque el paso se mide como una longitud en lugar de contarse como un solo movimiento.
h(n)
la estimación del coste que aún queda por recorrer. Para Dijkstra y la búsqueda en anchura no es que simplemente no se use: es cero, y eso es precisamente lo que los convierte en la misma expresión a la que le falta un término.
f(n)
la clave de clasificación: la celda con el f más pequeño es la siguiente en explorarse. Se muestra encima de la cuadrícula sustituyendo los propios números de la celda actual, de modo que la elección que acaba de hacer el algoritmo es visible en lugar de presunta.
frontier
las celdas ámbar: descubiertas, pero aún no exploradas. Nodos expandidos cuenta lo que ha salido de este conjunto, lo que lo convierte en una medida del trabajo realizado, no de la calidad de la respuesta.

De dónde viene la fórmula

  1. Fija qué significa "más corto" antes de elegir un algoritmo. El coste de un camino es la suma de las longitudes de sus pasos: 1 para un movimiento lateral o vertical, √2 para uno diagonal. No se cuentan las celdas; se suman las distancias.
  2. Ahora el bucle, que es idéntico para los cuatro: saca una celda de la frontera, márcala como explorada y ofrece cada vecina transitable a la frontera con un g actualizado. Fíjate en lo que este bucle nunca menciona: una heurística, la dirección hacia la meta o qué algoritmo has elegido.
  3. Así que la única decisión que queda es cuál celda sacar, y se reduce a una sola expresión. Clasifica por g + h y tendrás A*. Establece h = 0 y la clasificación se basa solo en el coste acumulado; ese es Dijkstra, expandiéndose hacia afuera en anillos porque no tiene idea de dónde está la meta. Ignora g en su lugar y la clasificación dependerá solo de la estimación: Greedy Best-First, corriendo hacia la meta y aceptando cualquier ruta por la que haya llegado.
  4. La búsqueda en anchura no clasifica en absoluto: primero en entrar, primero en salir. Con Permitir diagonales desactivado, cada paso cuesta exactamente 1, por lo que el orden en que llegan las celdas es el orden de g creciente —y, por lo tanto, la búsqueda en anchura explora precisamente lo mismo que explora Dijkstra. Puedes confirmarlo sin volver a generar la cuadrícula: conmuta entre los dos y Nodos expandidos no se moverá ni un ápice. Activa las diagonales y el argumento cae con ello, porque una diagonal cuesta √2 en lugar de 1 y el orden de llegada deja de seguir el coste.

Cómo leer lo que ves

La puntuación de prioridad se sitúa encima de la cuadrícula con los valores de g y h de la propia celda actual completados, para que puedas leer la clasificación que produjo la última elección. Debajo hay dos contadores: Nodos expandidos y Longitud del camino. El ámbar representa la frontera y el índigo lo ya explorado. Cambiar de algoritmo no genera una cuadrícula nueva, y eso es lo que le da valor a la comparación: en la misma distribución de cuatro vías, los Nodos expandidos de Dijkstra nunca son menos que los de A*, y los de Greedy Best-First son una pequeña fracción de cualquiera de los dos.

Supone
Costes de paso que nunca son negativos y una cuadrícula que no cambia mientras la búsqueda se ejecuta. El inicio es siempre la celda superior izquierda y la meta la inferior derecha. Cerrar una celda es definitivo —el bucle nunca reconsidera una— y esto solo es seguro porque ninguna ruta posterior puede llegar de forma más barata cuando cada paso añade una cantidad no negativa.
Falla cuando
Nodos expandidos es la cifra que varía de forma más drástica, y no es una medida de calidad. Elige Greedy Best-First: en la misma cuadrícula explora una pequeña fracción de lo que explora A*, y en la mayoría de las distribuciones devuelve una Longitud del camino mayor. Genera unas cuantas cuadrículas nuevas y observa cómo los dos contadores se mueven en direcciones opuestas. Examinar menos celdas es una afirmación sobre cuán duro trabajó el algoritmo, nunca sobre lo buena que fue su respuesta.

por qué importan las heurísticas 🖖

La fórmula f(n)=g(n)+h(n) hace que A* prefiera los nodos que son baratos hasta ahora y aún parecen cercanos a la meta. Si h nunca sobreestima el costo restante, A* conserva su garantía de camino más corto; una h admisible más fuerte explora menos celdas innecesarias. Cambia el menú desplegable de algoritmo para ver qué pasa si eliminas la heurística (Dijkstra), el costo acumulado (Greedy) o toda puntuación (BFS).

Un bucle, cuatro personalidades 🖖

Los cuatro algoritmos repiten exactamente el mismo ciclo: extraen la celda más prometedora de una lista de espera (la frontera ámbar), la marcan como visitada (índigo) y añaden a la lista sus vecinas libres. Solo cambia el criterio con el que deciden qué celda parece más prometedora. El número de nodos expandidos sirve para comparar los resultados y no se comporta como cabría esperar. En una cuadrícula vacía, A* expande todas las celdas: con la distancia de Manhattan, todas las rutas monótonas hasta la esquina obtienen el mismo valor de f, así que no hay motivo para preferir una. Al añadir obstáculos, el número disminuye.

Las diagonales pueden romper la garantía 🖖

Activa 'Permitir diagonal' junto con la heurística Manhattan y A* puede devolver sin avisar un camino que no es el más corto. Aquí un paso diagonal cuesta solo √2 ≈ 1.41, pero la distancia Manhattan lo cobra como 2 — así la heurística sobreestima, se vuelve no admisible y se pierde la garantía de optimalidad. Cambia a Euclidiana, que nunca supera la distancia en línea recta, y el camino más corto regresa.

Ruta de aprendizaje

Contar trabajo, no segundos

Referencias (3)

Problemas de ejemplo

  • cuadrícula abierta - En una cuadrícula de 20 × 20 con una décima parte bloqueada, A* todavía expande casi todas las celdas: cualquier ruta monótona obtiene f = 38, así que el empate persiste.
  • tipo laberinto - Los obstáculos aceleran A*. Una densidad de bloqueo de 0,28 elimina los empates que encarecen la búsqueda en una cuadrícula abierta, y basta con explorar alrededor de la mitad de las celdas libres.
  • heurística débil - En una cuadrícula abierta con conectividad 4, la distancia de Manhattan es exacta, mientras que la euclídea siempre da una estimación inferior. Por eso, de las dos heurísticas admisibles, la euclídea es la menos informativa. La ruta es la misma, pero se exploran alrededor de una tercera parte más de celdas.
  • Dijkstra explora - La misma cuadrícula de 24 × 24 y la misma densidad de 0,22 que en «Heurística deficiente», esta vez sin heurística. Como no tiene información sobre la meta, Dijkstra expande alrededor de la mitad más de celdas que A*.
  • trampa greedy - La búsqueda voraz solo tiene en cuenta h, por lo que avanza directamente hacia la meta y expande menos de la mitad de las celdas que A*. A cambio, casi siempre encuentra una ruta más larga.
  • bfs + diagonales - BFS no dispone de información sobre la meta, así que alcanza casi todas las celdas libres. Cuando se permiten diagonales, cuenta cada movimiento diagonal como un solo paso; por tanto, minimiza el número de pasos, no la distancia.