Actualmente estoy estudiando los caminos más cortos en gráficos dirigidos. Existen muchos algoritmos eficientes para encontrar el camino más corto en una red, como el de dijkstra o el de bellman-ford. Pero, ¿y si el gráfico es dinámico? Al decir dinámico quiero decir que podemos insertar o eliminar vértices durante la ejecución del programa. Estoy tratando de encontrar un algoritmo eficiente para actualizar las rutas más cortas desde un vértice a cualquier otro vértice , después de insertar un borde , sin necesidad de volver a ejecutar el algoritmo de ruta más corta en el nuevo gráfico. ¿Cómo puedo hacer esto? Gracias por adelantado.u e
- Nota: los cambios se pueden realizar después de la primera iteración del algoritmo
- Nota [2]: se dan dos nodos, la fuente el objetivo. Necesito encontrar el camino más corto entre estos nodos. Cuando se actualiza el gráfico sólo tengo que actualizar , que es el camino más corto entre y .t π ( s , t ) s t
- Nota [3]: solo me interesa el caso de inserción de borde.
Una definición formal : dado un gráfico . Definir una operación de actualización como 1) una inserción de un borde a o 2) aa eliminación de un borde de . El objetivo es encontrar de manera eficiente el costo de todos los pares de rutas más cortas después de una operación de actualización. Por eficiente, queremos decir al menos mejor que ejecutar un algoritmo de Todos los pares de ruta más corta, como el algoritmo Bellman-Ford, después de cada operación de actualización.e E e E
Editar: a continuación hay una versión simplificada del problema:
Se proporciona un gráfico ponderado , que consta de bordes unidireccionales y dos vértices críticos y . También se proporciona un conjunto de bordes bidireccionales candidatos . Tengo que construir una arista para minimizar la distancia de a .s t Cs t
fuente
Respuestas:
El problema como probablemente haya notado es un problema bastante difícil. Verificar la web conducirá a algunas instancias complejas que probablemente no necesitará. Aquí hay una solución, según sea necesario (es decir, no es necesario volver a calcular todo desde cero).
para el caso de agregar un borde , luego usar su matriz de distancia ya construida, haga lo siguiente:(u,v)
Para cada par de nodos e verifique si - esto se puede hacer en ya que está comparando cada par de nodos.y d ( ( x , u ) ) + c ( ( u , v ) ) + d ( ( v , y ) ) < d ( ( x , y ) ) O ( n 2 )x y d((x,u))+c((u,v))+d((v,y))<d((x,y)) O(n2)
Para el caso de la eliminación de bordes: dada la matriz de distancia ya construida, puede tener para cada nodo un árbol de ruta más corta enraizado en . Si el borde eliminado no está en ese árbol, entonces los caminos más cortos desde hasta todos los demás no se ven afectados (siguen siendo los mismos).u e uu u e u
Si está en el árbol de la ruta más corta de , entonces para cada nodo tal que la ruta más corta incluya , las rutas cambiarán. Por lo tanto, calcule la ruta más corta de a . Ahora, repita lo anterior para cada nodo; esta no es la mejor solución. De hecho, en el peor de los casos, es asintóticamente equivalente a hacer todo desde cero, pero puede ser mejor en promedio. u v π ( u , v ) e u ve u v π(u,v) e u v
si desea obtener mejores resultados que esto, eche un vistazo a:
Demetrescu, Camil y Giuseppe F. Italiano. "Un nuevo enfoque dinámico para todos los pares de caminos más cortos". Revista de la ACM (JACM) 51.6 (2004): 968-992. (se puede encontrar libremente en Google)
o echa un vistazo a esta encuesta bien escrita
fuente
El problema que está solicitando es un problema algorítmico bien conocido. En realidad todavía está abierto, cuán difícil es exactamente este problema. También debe saber que hay diferentes encarnaciones de este problema. En contraste con lo que está pidiendo, generalmente solo se devuelven las distancias, mientras que está solicitando los caminos más cortos reales. Tenga en cuenta que estos caminos ya pueden ser muy largos. Los algoritmos de gráficos dinámicos distinguen solo entre eliminaciones de bordes (algoritmos de dg decrementales), solo inserciones de bordes (algoritmos de dg incrementales) e inserciones y eliminaciones de bordes (algoritmos de dg completamente dinámicos). Por lo tanto, está interesado en algoritmos incrementales .
Los algoritmos mencionados en la publicación de AJed están ligeramente desactualizados. Hay nuevos resultados de Thorup, vea aquí, en la página 8 para una breve encuesta. El algoritmo APSP exacto completamente dinámico actualmente mejor de Thorup (para consultas de distancia, no la ruta), necesita tiempo de actualización amortizado, mientras que admite peor tiempo de consulta. Tenga en cuenta que si tiene bordes , entonces podría recalcular desde cero con Dijkstra y montones de Fibonacci y obtener el mismo tiempo de ejecución que en el algoritmo de Thorup. Entonces, si sus gráficos no son densos, recomendaría usar Dijkstra.O ( 1 ) O ( n log n )O(n2(logn+log2(1+m/n)) O(1) O(nlogn)
No conozco ningún mejor algoritmo incremental . Pero debe hacer una búsqueda en la web si existen resultados más recientes para este problema especializado.
fuente
Creo que el algoritmo AD * podría ayudarte.
http://www.cs.cmu.edu/~ggordon/likhachev-etal.anytime-dstar.pdf
Aspectos destacados de AD *: es "en cualquier momento", lo que significa que puede darle una "solución subóptima" muy rápidamente, aunque puede que no sea la mejor. Sin embargo, dado el tiempo suficiente, devolverá la solución óptima. Además, puede restringir la solución subóptima para que no sea peor que la solución óptima mediante alguna constante definida por el usuario. Esto le brinda la posibilidad de usar esto en un escenario de planificación en tiempo real donde tener una solución correcta (donde 'bien' está teóricamente limitado) es mejor que no tener ninguna solución.
http://www.cs.cmu.edu/~maxim/software.html
fuente