Ingeniería civil y estructural
Aprovechando el Algoritmo de Johnson para todos los pagos Problemas de Sendero más corto
Table of Contents
Comprender el problema de Sendero más corto de todos los padres
El problema de la ruta más corta (APSP) busca la distancia más corta entre cada par de vértices en un gráfico ponderado. Es un reto fundamental en la teoría de gráficos con implicaciones directas para el diseño de red, optimización de flujo de tráfico, análisis de redes sociales y logística. A diferencia de los problemas de ruta más corto de un solo proveedor, la solución APSP requiere distancias de computación de cada vértice a todos los demás, que escala cuadrática con el número de no.
Los enfoques comunes abordan este problema pero los cambios de cara. Floyd-Warshall, un algoritmo de programación dinámica, funciona en gráficos densos pero funciona en O(V3) tiempo y no puede manejar ciclos de peso negativos.
Comparación de los Algoritmos Comunes
Para apreciar el algoritmo de Johnson, ayuda a contrastar los solvers APSP más utilizados:
- Floyd-Warshall – Simple de implementar, utiliza una matriz de distancia 2D, actualizaciones a través de bucles triples. Funciona en bordes negativos pero no ciclos negativos. Impráctico para gráficos con miles de vértices debido al tiempo cúbico.
- Repetida Dijkstra] – Corre Dijkstra desde cada vértice. Acelerada en gráficos escasos (]O(V E log V) utilizando montones de Fibonacci), pero restringida a pesos no negativos.
- Fordo-Bellman (repetido)] – Maneja los bordes negativos pero corre en O(V2E), que es más lento que ambas alternativas.
- Algorithm de Johnson – Repesa el gráfico para que todos los bordes se conviertan en no negativo, luego aplica Dijkstra repetido. Rendirá O(V E + V2 log V) con un peso negativo preferido, haciendo que sea la elección más adecuada.
Cómo funciona el Algoritmo de Johnson
El algoritmo de Johnson transforma inteligentemente un gráfico que contiene bordes negativos en uno con sólo pesos de borde no negativo, preservando la estructura de caminos más cortos. Esta transformación se basa en una función potencial] derivada de una sola carrera de Bellman‐Ford. Una vez re ponderado, el algoritmo de Dijkstra se puede utilizar de cada nodo con seguridad.
Paso 1: Agregar un Nodo de Super Fuente
Un nuevo vértice s] se añade al gráfico, conectado a cada vértice existente con un borde de peso 0. Este nodo extra no altera las distancias más cortas porque cualquier camino que use s] puede ser aprehendido sin costo.
Paso 2: Funciones potenciales de computación con Bellman-Ford
Corrir el algoritmo Bellman‐Ford de la super fuente s]. Porque s tiene bordes de peso cero a todos los vértices, el algoritmo calcula la distancia más corta h(v)]s
Paso 3: Repesar el Gráfico
Utilizando los potenciales h(v)], cada borde (u, v)] con peso original w(u, v)] se vuelve a ponderar a:
w'(u, v) = w(u, v) + h(u) – h(v)
Esta transformación garantiza que todo peso repelido no es negativo. La prueba se basa en la desigualdad del triángulo: porque h(v) ≤ h(u) + w(u, v) (de la salida de Bellman‐Ford), sigue que w'(u, v) ≥ 0 path preservado).
Paso 4: Correr el Algoritmo de Dijkstra de cada Vertex
Con el gráfico repelido que contiene sólo bordes no negativo, el algoritmo de Dijkstra se ejecuta una vez desde cada vértice. Cada carrera calcula las distancias más cortas a todos los otros vértices. Las distancias resultantes se convierten luego en pesos de borde originales utilizando la fórmula:
distoriginal(u, v) = distreweighted(u, v) – h(u) + h(v)]
Este paso final asegura que las distancias reportadas sean precisas para el gráfico original.
Complejidad y análisis de rendimiento
[LT:] El algoritmo de la V[LT] [FLT] [FLT]][FLT][FLT]][FLT]][FLT] ] [FLT] [FLT] [FLT]]
Usando un montón de Fibonacci puede reducir la parte de Dijkstra a O(V E + V2 log V) amortizado, aunque en la práctica los montones binarios son más simples y a menudo suficientemente rápidos. La huella de memoria es O(V[LT:5]
Aplicaciones Prácticas
El algoritmo de Johnson se emplea en dominios donde los bordes de gráficos pueden llevar costos negativos y se requieren distancias más cortas de todo el espacio. Ejemplos del mundo real incluyen:
- Red routing:] Los proveedores de servicios de Internet y las redes de telecomunicaciones utilizan protocolos de enrutamiento distribuidos que deben calcular de forma adaptativa la ruta más barata entre los dos routers, incluso cuando los costos de enlace fluctúan o se vuelven negativos (por ejemplo, debido a la congestión o descuentos de políticas).
- Planificación de transporte:] Las empresas de mampara y logística (por ejemplo, Google Maps, OpenStreetMap motores de enrutamiento) computan caminos más cortos entre muchos pares de enderecimiento de origen para la optimización de flotas. Los pesos negativos pueden modelar subvenciones o descuentos basados en el tiempo.
- minimización costos de cadenas: En redes de producción multietapa, los costos de un nodo a otro podrían ser negativos (por ejemplo, rebates). El algoritmo de Johnson encuentra las rutas más rentables a través de toda la cadena de suministro.
- Análisis de red social: La centralidad de cercanías o la centralidad de la intersección requiere distancias de pago completos. Los bordes negativos pueden representar enlaces de descuento “amigo” o relaciones adversarias.
- Modelos de salida económica: Los modelos de Leontief y los análisis de flujo suelen implicar coeficientes negativos; el algoritmo de Johnson calcula el efecto neto de propagar cambios a través de una economía interconectada.
Para más lectura sobre las bases matemáticas, véase La entrada detallada de Wikipedia y el papel original de Donald B. Johnson (1977). Una aplicación práctica en Python se puede encontrar en Repositorio GitHub de NetworkX, que incluye el algoritmo de paso de Johnson como una técnica más clara.
Conclusión
El algoritmo de Johnson destaca como una solución elegante y práctica al problema de la trayectoria más corto de todos los puntos cuando hay pesos de borde negativos. Combinando la robustez de Bellman‐Ford (para detectar ciclos negativos y potenciales de cálculo) con la velocidad de Dijkstra (para gráficos no negativos), logra un excelente rendimiento en redes escasas. La técnica de re ponderación es una hermosa aplicación de las funciones de teoría más cortas.
Cuando se enfrenta a un problema de APSP real donde los gráficos son escasos y pueden contener bordes negativos, el algoritmo de Johnson debe ser la primera consideración. Sus garantías teóricas y la implementación generalizada en las bibliotecas (por ejemplo, ]NetworkX], ]Boost Graph Library) hacen práctico adoptar.