Modulo1 Lectura2
Modulo1 Lectura2
Modulo1 Lectura2
El problema del camino mínimo sin pesos con un único origen consiste en encontrar el
camino más corto, medido por el número de aristas, del vértice de origen a cualquier otro
vértice del grafo. Es importante resaltar que este problema se suele asociar a los grafos
no ponderados, ya que, en este caso, la longitud del camino entre dos vértices está dada
por el número de aristas que componen dicho camino.
Nótese que habrá algunos casos en los que existan vértices no alcanzables
desde el vértice de origen. En este caso, diremos que la distancia a dichos
vértices es infinita. Por ejemplo, en la figura 1, si el vértice de origen es V4,
procesadas exactamente una vez, ya que todos los vértices del grafo son
alcanzables desde dicho vértice de origen. Por otra parte, si el vértice de
origen fuese V4, solo las aristas que conectan a los vértices V5 y V6 serían
estructura auxiliar
Usando una cola, el algoritmo comienza tomando el vértice de origen y
poniéndolo en una cola vacía. A continuación, tomamos el primer vértice de
la cola, recorremos su lista de adyacencia y los ponemos en la cola. Todos
estos vértices estarán a distancia Dv+1 respecto del vértice actual v. El
algoritmo continúa hasta que la cola queda vacía. Nótese que el uso de una
cola posibilita procesar primero todos aquellos vértices que están a distancia
1 del vértice de origen, luego, aquellos vértices que están a distancia 2, a
continuación, los vértices que están a distancia 3, etcétera. Recordemos que,
cada vez que estemos procesando los vértices adyacentes al vértice actual,
solo introduciremos en la cola los vértices w que ven decrementada su Dw
desde ∞. El uso de la cola permite que el costo para elegir el siguiente
vértice a procesar sea constante (O(1)), por lo que el costo total de esta
operación sobre todos los vértices del grafo será de O(|V|).
Con este análisis ya podemos saber cuál es el costo total del algoritmo,
basándonos en las dos operaciones descriptas anteriormente. La elección del
siguiente vértice a procesar cuesta, en total, O(|V|), mientras que descubrir
los vértices adyacentes al vértice que está siendo procesado tiene un costo
total de O(|E|). En otras palabras, el costo total del algoritmo, desde que
comienza hasta que procesa todos los vértices, es de O(|V|+|E|).
El problema de los caminos mínimos con pesos positivos y origen único consiste en
encontrar el camino más corto desde el vértice origen O hasta el resto de los vértices del
grafo, donde el peso o costo de cada arista del grafo es un valor no negativo. Debemos
recordar que, en el caso de los grafos ponderados, la longitud de un camino con pesos es
la suma del costo de las aristas del camino. Al restringir el problema a grafos con aristas
de peso positivo, garantizamos que cualquier camino del grafo tiene un costo positivo.
Esto permite usar un algoritmo sencillo y eficiente para encontrar todos los caminos
mínimos desde un vértice de origen. Este fue propuesto por el científico holandés Edsger
Dijkstra. Dijkstra es uno de los mayores contribuidores a las Ciencias de la Computación.
Dw=Dv+cv,w
El segundo problema plantea la elección del siguiente vértice a ser procesado. En el caso
del algoritmo que resuelve el problema de los caminos mínimos sin pesos, usamos una
cola, como estructura auxiliar, para determinar el orden en que los vértices debían ser
procesados. En este caso, debemos prestar atención a un teorema que dice que debemos
posar nuestra atención en vértices no visitados que minimicen el valor Dv para cada
vértice v del grafo, con el propósito de garantizar que el algoritmo produzca correctamente
los caminos mínimos. En otras palabras, el siguiente vértice a procesar, en cada paso del
algoritmo, debiera ser aquel vértice v, todavía no procesado, cuyo Dv sea el menor entre
todos los vértices no procesados.
Dicho esto, podemos comprobar, rápidamente, que una cola no es una estructura
adecuada para este propósito. Para ver esto, supongamos, usando la figura 4, que luego
de procesar u ponemos a w en la cola existente. Actualmente, estamos procesando todos
los vértices de distancia 2 desde el origen. El orden en que los insertamos en la cola
podría estar relacionado con el costo de las aristas de la lista de adyacencia de u.
Supongamos que existe una arista de costo 5 que va desde u hasta un vértice z.
Entonces, z se insertaría antes que w en dicha cola. Sin embargo, al procesar v,
cambiaríamos el valor de Dw de 8 a 5. Esto significaría que, ahora, deberíamos procesar
w antes que z. Sin embargo, z fue insertado antes que w en la cola y, por lo tanto, será
procesado antes. Con esto, vemos que una cola no es apropiada, sin embargo, una cola
de prioridad, ordenada por Dw, sí sería de utilidad y cumpliría exactamente con el
propósito deseado. En el ejemplo que veníamos siguiendo, al procesar el vértice v,
insertaríamos en la cola de prioridad el par (w,5).
Nótese que, en la estructura, existiría ya una instancia (w,8). El hecho que existan dos
instancias simplemente indicaría que existen, al menos, 2 caminos que van desde el
vértice de origen hasta el vértice w, uno de costo 5 y el otro de costo 8. Eventualmente,
sacaríamos de la cola de prioridad el par (w,5), procederíamos a procesar el vértice w y
dejaríamos 5 como valor final de Dw.
Eventualmente, cuando sacásemos de la cola de prioridad el par (w,8), simplemente lo
descartaríamos, ya que el vértice w figuraría en nuestra lista de vértices procesados.
Notemos que, en la elección del nuevo vértice v a ser procesado, eliminamos
repetidamente el menor elemento de la cola de prioridad, hasta sacar un vértice no
visitado. Ya que la cola de prioridad contendrá a lo sumo tantos elementos como aristas
haya en el grafo, realizaremos |E| inserciones y eliminaciones, donde cada una de estas
operaciones cuesta O(log N), siendo N=O(|E|). Por lo tanto, el costo total de la elección del
nuevo vértice será de O(|E| log |E|) y ese es, a su vez, el costo total del algoritmo, ya que,
al igual que en el caso del algoritmo que encuentra todos los caminos mínimos sin pesos,
cuesta O(|E|) el determinar todos los vértices adyacentes a cada vértice que está siendo
procesado. Por lo tanto, el costo total estaría dado por O(|E| log |E| + |E|), que es lo mismo
que O(|E| log |E|), por propiedades de la notación O.
El problema de los caminos mínimos con pesos y origen único consiste en encontrar el
camino más corto desde el vértice origen O hasta el resto de vértices del grafo, donde el
peso de cada arista del grafo puede ser un valor positivo, negativo o cero. Claramente,
este caso es el más general de todos los problemas que resuelve el problema de los
caminos mínimos. Si restringimos el problema a grafos que contienen aristas de peso
positivo, estamos frente al problema resuelto en la sección 4.3. Si restringimos el
problema aún más y consideramos, solamente, grafos que contengan aristas de peso 1,
entonces, estaremos frente al problema resuelto en la sección 4.2.
En este punto, deberíamos notar que el hecho de que existan aristas de peso
negativo hace que el algoritmo de Dijkstra no funcione correctamente, en
aquellos casos donde existan, en el grafo, ciclos cuyo costo sea negativo.
Esto es simple de ver, ya que, de existir tal ciclo, uno podría dar vueltas
indefinidamente para alcanzar un camino a otro vértice de menor costo. Para
ver esto más claramente, observemos el grafo de la figura 5, donde vemos
que el ciclo V1, V3, V4, V1 tiene un costo negativo de -5. En este caso,
hasta V4. El camino directo entre ambos vértices tiene costo 2. Sin embargo,
observamos que existe un camino más corto V3, V4, V1, V3, V4 con costo -3.
se dan varias vueltas al ciclo V1 , V3, V4, V1 y hacer que el costo final del
camino sea menor, por lo que concluimos que el camino más corto, que lleva
del vértice V3 al vértice V4, está indefinido.
, V4 , V1)* implica que se dan varias vueltas al ciclo V3 , V4, V1, V3.
Figura 5: Problemas con ciclos de costo negativo
Fuente: elaboración propia.
Por otra parte, es importante destacar que las aristas de costo negativo no
representan un problema en aquellos grafos en los que no existen ciclos
negativos. En dichos grafos, el algoritmo de Dijkstra funciona correctamente.
Referencias