¿Por qué BFS no puede resolver todos los problemas de ruta más corta de una sola fuente?

La razón se reduce a los pesos de borde.

BFS SIEMPRE PUEDE resolver el problema de la ruta más corta de una sola fuente SI el peso de cada borde entre dos vértices en el gráfico es el mismo. Esto se debe a que BFS encontrará todas las rutas que están a 1 borde de la fuente, seguidas de todas las rutas que están a dos bordes de la fuente, y así sucesivamente. Si los bordes son todos de longitud x = 1 (o la misma longitud), entonces BFS encontrará todas las rutas de longitud 1x desde la fuente, seguidas por todas las rutas de longitud 2x, seguidas por todas las rutas de longitud 3x, y así sucesivamente. Esto permitirá que BFS encuentre la ruta más corta desde el nodo fuente a cualquier nodo receptor predeterminado.

¿Qué sucede si los pesos de los bordes no son los mismos? Entonces BFS no funciona. Esto se debe a que BFS termina cuando encuentra por primera vez el nodo sumidero en su búsqueda del gráfico.

Tomemos, por ejemplo, el gráfico que construí a continuación.

Hay dos caminos desde la fuente hasta el sumidero. La ruta A es de longitud 3 y la ruta B es de longitud 501. Sin embargo, la ruta B solo tiene dos aristas mientras que la ruta A tiene 3 aristas. Para comprender por qué BFS no funcionará, debe observar la mecánica de cómo se ejecutaría en este caso. BFS termina cuando descubre por primera vez el nodo sumidero. Lo que esto significa es que encuentra el camino más corto desde la fuente hasta el sumidero. Como mencioné anteriormente, BFS examina todas las rutas que están a un borde de distancia, seguido de todas las rutas que están a dos bordes de distancia, y así sucesivamente, hasta que encuentra el nodo sumidero (ignorando los ciclos marcando qué nodos ya han sido visitados). En este caso, lo que eso significa es que BFS primero descubrirá el nodo de sumidero G a lo largo de la ruta B, ya que B solo tiene dos bordes y todas las rutas de longitud a dos bordes del nodo de origen se buscan antes de todas las rutas de longitud 3 bordes. El algoritmo BFS devolvería erróneamente que la ruta B es más corta que la ruta A, a pesar de que la longitud ponderada de la ruta B es 501, mientras que la longitud ponderada de la ruta A es solo 3. Esto se debe a que BFS nunca se ocupa de la ponderación de la bordes, en cambio, solo se tiene en cuenta la cantidad de bordes en una ruta en particular.

Es por eso que si tiene un gráfico con bordes ponderados, debe usar el Algoritmo de Dijkstra [1] en lugar de BFS. La disparidad fundamental aquí es que BFS supone (si todos los bordes están ponderados 1) que el número de bordes en una ruta es igual a la longitud de esa ruta. Sin embargo, este no es siempre el caso.

Aparte: ahora, lo que podría hacer si está configurado en BFS es transformar su gráfico de manera que cualquier borde de longitud y> 1 se pueda convertir en una ruta de longitud y bordes e y -1 nodos, con cada borde teniendo un peso de 1. Entonces puede usar BFS en la versión transformada de su gráfico ponderado ya que los pesos de borde serían todos 1. A menudo, los costos de tiempo de ejecución son demasiado altos para hacerlo en la práctica. De manera análoga, siempre que transforme todos los pesos de borde para que sean iguales (no necesariamente de longitud 1, podría ser longitud 2, 3, 4, etc.), BFS seguirá funcionando.

Notas al pie

[1] Algoritmo de Dijkstra

BFS no tiene en cuenta los pesos de borde / costo / distancia (aparte del número de bordes), la función objetivo en el problema de ruta más corta de una sola fuente se basa en el costo / distancia total de una ruta. El algoritmo es completamente ajeno a estos costos y distancias, y solo se garantiza que funcione si todos los bordes en el gráfico de entrada son iguales (que es lo mismo que si el gráfico no tuviera pesos).

Puede, si y solo si el gráfico no está ponderado.

More Interesting

¿Qué algoritmos de programación utiliza cada sistema operativo común?

¿Qué son los algoritmos de clasificación y búsqueda?

Para los bucles, ¿cuál será más eficiente si se ha eliminado la optimización del compilador?

Si un algoritmo se ejecuta en tiempo O (N), pero N no excede una constante, ¿puedo decir que el algoritmo se ejecuta en tiempo constante?

¿Puedes dar ejemplos de cómo usamos las estructuras de datos en el mundo real?

¿Puedo mejorar el rendimiento del árbol negro rojo eliminando los nodos negros cero o usando el valor centinela?

Quiero desarrollar un software profesional, ¿qué debo hacer?

¿Es posible crear dos manos robóticas independientes?

¿Cuáles son las diferencias entre los algoritmos que realizan la búsqueda en un gráfico y los algoritmos que realizan la búsqueda en un árbol?

¿Cuál fue tu algoritmo favorito del que aprendiste mucho?

¿Puede un algoritmo descubrir macronutrientes a partir de una imagen?

¿Debería concentrarme en dominar algoritmos y estructuras de datos o desarrollar una buena aplicación? ¿Qué es más necesario a largo plazo?

¿Qué son los algoritmos gráficos?

¿Cuál es la solución a la siguiente relación de recurrencia: [matemáticas] T (n) = 3T (n-1) - 7T (n-2) + 9T (n-3) [/ matemáticas], con las siguientes condiciones iniciales: [ matemática] T (0) = 1 [/ matemática], [matemática] T (1) = 6 [/ matemática], [matemática] T (2) = 7 [/ matemática]. ¿Qué es una expresión para [math] T (n) [/ math] de modo que no haya términos [math] T (i (\ frac {n} {j}) ^ {k}) [/ math] a la derecha ¿lado?

¿El algoritmo de Dios realmente funciona en el Cubo de Rubik 3x3x3?