¿Por qué no podemos aplicar el algoritmo de Dijkstra para un gráfico con pesos negativos?¿Por qué no podemos aplicar el algoritmo de Dijkstra para un gráfico con pesos negativos?
Respuesta
¿Qué significa encontrar la ruta menos costosa de A a B, si cada vez que viaja de C a D obtiene pagado?
Si hay un peso negativo entre dos nodos, la "ruta más corta" es hacer un ciclo hacia atrás y hacia adelante entre esos dos nodos para siempre. Cuanto más saltos, más "corta" es la ruta.
Esto no tiene nada que ver con el algoritmo, y todo tiene que ver con la imposibilidad de responder a esa pregunta.
Editar:
La afirmación anterior asume enlaces bidireccionales. Si no hay ciclos que tengan un peso negativo en general, no hay forma de dar vueltas para siempre, de que se les pague.
En tal caso, el algoritmo de Dijkstra todavía puede fallar:
considerar dos caminos:
- un camino óptimo que bastidores hasta un costo de 100, antes de cruzar el borde final que tiene un -25 peso, dando un total de 75, y
- un camino subóptimo que no tiene bordes negativamente ponderados con un costo total de 90.
algoritmo de Dijkstra se Inves Seleccione primero la ruta subóptima y se declarará terminada cuando la encuentre. Nunca seguirá el subpaso peor que la primera solución encontrada
Pero - Bellman-Ford funciona correctamente en presencia de bordes de peso negativos, siempre que no haya ciclos de peso negativos. Por lo tanto, hay algo sobre el algoritmo de Dijkstra que hace que falle, incluso si no se puede pasar entre dos nodos en un ciclo de peso negativo. – dsolimano
@dsolimano: Sí. Considere dos caminos: (1) un camino óptimo que acumula un costo total de 100, antes de cruzar el borde final que tiene un peso de -25, dando un total de 75, y (2) un camino subóptimo que no tiene ponderación negativa bordes con un costo total de 90. El algoritmo de Dijkstra primero investigará el camino subóptimo y se declarará terminado cuando lo encuentre. Nunca seguirá el subpaso que sea peor que la primera solución encontrada. – Oddthinking
@Oddthinking: Entonces, conoce la respuesta real (sí, tiene algo que ver con el algoritmo), por lo que debe promocionarla desde el comentario al texto de respuesta. –
Imagine que tiene un gráfico dirigido con un ciclo dirigido, y la "distancia" total alrededor de eso tiene un peso negativo. Si en su camino desde el vértice de inicio al final puede pasar por ese ciclo dirigido, puede simplemente dar vueltas y vueltas al ciclo dirigido un número arbitrario de veces.
Y eso significa que puede hacer que su camino a través del gráfico tenga una distancia infinitamente negativa (o efectivamente).
Sin embargo, mientras no haya ciclos dirigidos alrededor de su gráfico, podría salirse con la suya utilizando el Algoritmo de Dijkstra sin que explote nada.
Dicho todo esto, si tiene un gráfico con pesos negativos, puede usar el algoritmo Belman-Ford. Debido a la generalidad de este algoritmo, sin embargo, es un poco más lento. El algoritmo de Bellman-Ford toma O (V · E), donde el Dijkstra toma el tiempo O (E + VlogV)
Le daré un contraejemplo. Considere siguiente gráfico
http://img853.imageshack.us/img853/7318/3fk8.png
Supongamos que se inició en el vértice A
y quieres camino más corto a D
.el algoritmo de Dijkstra haría siguientes pasos:
- Marcos
A
que visitó y añadir vérticesB
yC
que hacer cola - Fetch desde el vértice cola con la distancia mínima. Es
B
- Marcos
B
que visitó y añadir vérticeD
que hacer cola. - Recuperar de la cola. No es el vértice
D
. - Marcar como visitado
D
Dijkstra dice más corto camino desde A
a D
tiene una longitud de 2, pero es obvio que no es cierto.
- 1. ¿Por qué funciona el algoritmo de Dijkstra?
- 2. ¿Por qué el algoritmo de Dijkstra usa la tecla disminuir? algoritmo de Dijkstra
- 3. ¿Cómo construir un gráfico ponderado con Ruby's RGL o GRATR para realizar el algoritmo de Dijkstra?
- 4. Algoritmo de Dijkstra con una matriz 2d
- 5. Implementación del algoritmo de Dijkstra
- 6. ¿El árbol de expansión mínimo teme los pesos negativos?
- 7. ¿Cómo resuelves el 15-puzzle con A-Star o el algoritmo de Dijkstra?
- 8. Algoritmo de dijkstra en iOS
- 9. aplicar cruce y mutación a un gráfico (algoritmo genético)
- 10. ¿Por qué usar el algoritmo de Dijkstra en lugar de la primera búsqueda mejor (más barata)?
- 11. Tutorial del algoritmo de Dijkstra de Boost
- 12. Relajación de un borde en el algoritmo de Dijkstra
- 13. Encontrar la ruta más corta usando el algoritmo de Dijkstra
- 14. Gráfico de barras con valores negativos
- 15. Algoritmo de gráfico (gráfico)
- 16. Dijkstra para la ruta más larga en un DAG
- 17. Algoritmo para encontrar el agujero en un gráfico infinito unidimensional
- 18. kadane algoritmo números negativos
- 19. Algoritmo de Tickmark para un eje gráfico
- 20. Algoritmo de propósito general para triangular un gráfico no dirigido?
- 21. El mejor algoritmo para determinar si un gráfico no dirigido es un árbol
- 22. ruta más corta utilizando el algoritmo de Dijkstra
- 23. Encuentra el ciclo de menor longitud en un gráfico dirigido con pesos positivos
- 24. Algoritmo de Dijkstra para matriz 2D en Java
- 25. ¿Hay algoritmos más rápidos que Dijkstra?
- 26. ¿Por qué no podemos bloquear un tipo de valor?
- 27. Diferencia entre DIjkstra y el algoritmo de BellmanFord
- 28. ¿Por qué no podemos usar assertion para métodos públicos?
- 29. elemento de azar por pesos definidos por el usuario
- 30. ¿Hay un algoritmo para "simplificar" un gráfico de dependencia?
Esta pregunta es más adecuado hacia math.stackexchange.com. Como tal, recomiendo que sea reubicado. –