Professional Documents
Culture Documents
Cadenas de Markov
Algoritmo de Dijkstra y Floyd
Nm. De control12210535
Algoritmo DIJKSTRA.
Para el problema de la ruta corta tenemos varios algoritmos, en esta
oportunidad se explicar el algoritmo de dijkstra el cual usa una tcnica
voraz (greedy). Al final del articulo se encuentran adjuntas las
implementaciones en C++ y JAVA.
Descripcin
El algoritmo de dijkstra determina la ruta ms corta desde un nodo
origen hacia los dems nodos para ello es requerido como entrada un
grafo cuyas aristas posean pesos. Algunas consideraciones:
Como trabaja
Primero marcamos todos los vrtices como no utilizados. El algoritmo
parte de un vrtice origen que ser ingresado, a partir de ese vrtices
evaluaremos sus adyacentes, como dijkstra usa una tcnica greedy La
tcnica greedy utiliza el principio de que para que un camino sea ptim
Donde:
Vrtices: ID de los vrtices.
Distancia[ u ]: Distancia mas corta desde vrtice inicial a vrtice
con ID = u.
Visitado[ u ]: 0 si el vrtice con ID = u no fue visitado y 1 si ya
fue visitado.
Previo[ u ]: Almacenara el ID del vrtice anterior al vrtice con ID
= u, me servir para impresin del camino mas corto.
Ahora vemos que la distancia actual del vrtice inicial al vrtice 3 es 10,
verifiquemos el paso de relajacin:
distancia[ 2 ] + 1 < distancia[ 3 ]
->
5 + 1 < 10
->
6 < 10
En esta oportunidad hemos encontrado una ruta mas corta partiendo
desde el vrtice inicial al vrtice 3, dicha ruta sera 1 -> 4 -> 2 -> 3 cuyo
peso es 6 que es mucho menor que la ruta 1 > 4 -> 3 cuyo peso es 10,
actualizamos la distancia en el vrtice 3 quedando:
Algoritmo de FLOYD
El algoritmo de Floyd es ms general que el de Dijkstra, ya que
determina la ruta ms corta entre dos nodos cualquiera de la red.
El algoritmo representa una red de n nodos como una matriz
cuadrada de orden n, la llamaremos matriz C. De esta forma, el
valor Cij representa el coste de ir desde el nodo i al nodo j,
inicialmente en caso de no existir un arco entre ambos, el valor Cij
ser infinito.
Definiremos otra matriz D, tambin cuadrada de orden n, cuyos
elementos van a ser los nodos predecesores en el camino hacia el
nodo origen, es decir, el valor Dij representar el nodo predecesor
a j en el camino mnimo desde i hasta j. Inicialmente se comienza
con caminos de longitud 1, por lo que Dij = i.
Las diagonales de ambas matrices representan el coste y el nodo
predecesor para ir de un nodo a si mismo, por lo que no sirven
para nada, estarn bloqueadas.
Los pasos a dar en la aplicacin del algoritmo de Floyd son los
siguientes:
Formar las matrices iniciales C y D.
Se toma k=1.
Se selecciona la fila y la columna k de la matriz C y entonces, para
i y j, con ik, jk e ij, hacemos:
Si (Cik + Ckj) < Cij Dij = Dkj y Cij = Cik + Ckj
En caso contrario, dejamos las matrices como estn.
Si k n, aumentamos k en una unidad y repetimos el paso
anterior, en caso contrario paramos las iteraciones.
La matriz final C contiene los costes ptimos para ir de un vrtice
a otro, mientras que la matriz D contiene los penltimos vrtices
de los caminos ptimos que unen dos vrtices, lo cual permite
reconstruir cualquier camino ptimo para ir de un vrtice a otro.
Ejemplo: Aplicar el algoritmo de Floyd sobre el siguiente grafo para
obtener las rutas ms cortas entre cada dos nodos. El arco (3, 5) es
direccional, de manera que no est permitido ningn trfico del nodo 5
al nodo 3 . Todos los dems arcos permiten el trfico en ambas
direcciones.
Tomamos k=1:
Tomamos k=2:
Tomamos i=1:
j=3: C[1,2]+C[2,3] = 3+13 = 16 > C[1,3] = 10 , por tanto no hay
que cambiar nada, el camino es mayor que el existente.
j=4: C[1,2]+C[2,4] = 3+5 = 8 < C[1,4] = , por tanto hacemos:
C[1,4] = 8 y D[1,4] = 2 .
j=5: C[1,2]+C[2,5] = 3+ = , no hay que cambiar nada.
Tomamos i=3:
o j=1: C[3,2]+C[2,1] = 13+3 = 16 > C[3,1] = 10, no hay que
cambiar nada.
o j=4: C[3,2]+C[2,4] = 13+5 = 18 > C[3,4] = 6, no hay que
cambiar nada.
o j=5: C[3,2]+C[2,5] = 13+ = , no hay que cambiar nada.
Tomamos i=4:
o j=1: C[4,2]+C[2,1] = 5+3 = 8 < C[4,1] = , por tanto
hacemos:
C[4,1] = 8 y D[4,1] = 2.
j=3: C[4,2]+C[2,3] = 5+13 = 18 > C[4,3] = 6, no hay que cambiar
nada.
j=5: C[4,2]+C[2,5] = 5+ = , no hay que cambiar nada.
Tomamos i=5, como C[5,2]=, entonces no habr ningn cambio.
Tomamos k=3:
Tomamos i=1:
o j=2: C[1,3]+C[3,2] = 10+13 = 23 > C[1,2] = 3, no hay que
cambiar nada.
o j=4: C[1,3]+C[3,4] = 10+6 = 16 > C[1,4] = 8, no hay que
cambiar nada.
o j=5: C[1,3]+C[3,5] = 10+15 = 25 < C[1,5] = , por tanto
hacemos:
C[1,5] = 25 y D[1,5] = 3 .
Tomamos i=2:
o j=1: C[2,3]+C[3,1] = 13+10 = 23 > C[2,1] = 3, no hay que
cambiar nada.
o j=4: C[2,3]+C[3,4] = 13+6 = 19 > C[2,4] = 5, no hay que
cambiar nada.
o j=5: C[2,3]+C[3,5] = 13+15 = 28 < C[2,5] = , por tanto
hacemos:
C[2,5] = 28 y D[2,5] = 3.
Tomamos i=4:
o j=1: C[4,3]+C[3,1] = 6+10 = 16 > C[4,1] = 8, no hay que
cambiar nada.
o j=2: C[4,3]+C[3,2] = 6+13 = 19 > C[4,2] = 5, no hay que
cambiar nada.
o j=5: C[4,3]+C[3,5] = 6+15 = 21 > C[4,5] = 4, no hay que
cambiar nada.
Tomamos i=5, como C[5,3]=, entonces no habr ningn cambio.
Tomamos k=4:
Tomamos i=1:
o j=2: C[1,4]+C[4,2] = 8+5 = 13 > C[1,2] = 3, no hay que
cambiar nada.
o j=3: C[1,4]+C[4,3] = 8+6 = 14 > C[1,3] = 10, no hay que
cambiar nada.
o j=5: C[1,4]+C[4,5] = 8+4 = 12 < C[1,5] = 25, por tanto
hacemos:
C[1,5] = 12 y D[1,5] = 4.
Tomamos i=2:
o j=1: C[2,4]+C[4,1] = 5+8 = 13 > C[2,1] = 3, no hay que
cambiar nada.
o j=3: C[2,4]+C[4,3] = 5+6 = 11 < C[2,3] = 13, por tanto
hacemos:
C[2,3] = 11 y D[2,3] = 4.
j=5: C[2,4]+C[4,5] = 5+4 = 9 < C[2,5] = 28, por tanto hacemos:
C[2,5] = 9 y D[2,5] = 4.
Tomamos i=3:
o j=1: C[3,4]+C[4,1] = 6+8 = 14 > C[3,1] = 10, no hay que
cambiar nada.
o j=2: C[3,4]+C[4,2] = 6+5 = 11 < C[3,2] = 13, por tanto
hacemos:
C[3,2] = 11 y D[3,2] = 4.
j=5: C[3,4]+C[4,5] = 6+4 = 10 < C[3,5] = 15, por tanto hacemos:
C[3,5] = 10 y D[3,5] = 4.
Tomamos i=5:
o j=1: C[5,4]+C[4,1] = 4+8 = 12 < C[5,1] = , por tanto
hacemos:
C[5,1] = 12 y D[5,1] = 2 .
j=2: C[5,4]+C[4,2] = 4+5 = 9 < C[5,2] = , por tanto hacemos:
C[5,2] = 9 y D[5,2] = 4.
Tomamos i=1:
o j=2: C[1,5]+C[5,2]
cambiar nada.
o j=3: C[1,5]+C[5,3]
cambiar nada.
o j=4: C[1,5]+C[5,4]
cambiar nada.
Tomamos i=2:
o j=1: C[2,5]+C[5,1]
cambiar nada.
o j=3: C[2,5]+C[5,3]
cambiar nada.
o j=4: C[2,5]+C[5,4]
cambiar nada.
Tomamos i=3:
o j=1: C[3,5]+C[5,1]
cambiar nada.
o j=2: C[3,5]+C[5,2]
cambiar nada.
o j=4: C[3,5]+C[5,4]
cambiar nada.
Tomamos i=4:
o j=1: C[4,5]+C[5,1]
cambiar nada.
o j=2: C[4,5]+C[5,2]
cambiar nada.
o j=3: C[4,5]+C[5,3]
cambiar nada.
FIN del proceso, las matrices quedan como sigue:
Algoritmo de Floyd:
En informtica, el algoritmo de Floyd-Warshall, descrito en 1959 por
Bernard Roy, es un algoritmo de anlisis sobre grafos para encontrar el
camino mnimo en grafos dirigidos ponderados. El algoritmo encuentra
el camino entre todos los pares de vrtices en una nica ejecucin. El
algoritmo de Floyd-Warshall es un ejemplo de programacin dinmica.
Aplicaciones:
El algoritmo de Floyd-Warshall puede ser utilizado para resolver los
siguientes problemas, entre otros:
Camino mnimo en grafos dirigidos (algoritmo de Floyd).
Cierre transitivo en grafos dirigidos (algoritmo de Warshall). Es la
formulacin original del algoritmo de Warshall. El grafo es un grafo
no ponderado y representado por una matriz booleana de
adyacencia. Entonces la operacin de adicin es reemplazada por
Ejemplo:
Hallar el camino mnimo desde el vrtice 3 hasta 4 en el grafo con la
siguiente matriz de distancias:
Cadenas de Markov.