El Algoritmo de Floyd resuelve el problema de encontrar la ruta más corta en todos los pares
de nodos o vértices de un grafo, sin necesidad de definir un nodo o
vértice inicial. Además de ello nos indica la distancia, y el recorrido a
seguir. En esta oprtunidad presentamos el algorimo de Floyd paralelizado.
Antes de comenzar vamos hacer unas cuantas definiciones:
Sea G = (V,E,w) un grafo con pesos, donde V = {v1, v2, v3, ..., vn }
es el conjunto de vértices de G donde E es el conjunto de pares (vi,vj) cuyo peso viene dado por wij.
Consideremos un conjunto de vértices { v1, v2, v3, ..., vk } , para
cualquier para de vertices vi, vj considerar todos los caminos, tales
que los vetices pertenecientes al camino pertenezcan a dicho conjunto
para algún k <=n. Sea pk_ij el camino de peso minimo entre ellos
y sea dk_ij el peso de dicho camino:
* Si vk no pertenece al camino minimo entonces pk_ij = pk-1_ij.
* Si vk pertenece al camino minimo entonces tenemos un camino minimo
de vi a vk y otro de vk a vj cada uno de esos caminos usa los vertices de
{ v1,...,vk}.
de vi a vk y otro de vk a vj cada uno de esos caminos usa los vertices de
{ v1,...,vk}.
Nota:
siendo más exigentes el camino de vk a vj excluye al vertice vi el camino de vi a vk excluye al vertice vj siendo aún más exigentes el camino vi a vk se intersectan con el camino de de vk a vj en un solo vertice.
siendo más exigentes el camino de vk a vj excluye al vertice vi el camino de vi a vk excluye al vertice vj siendo aún más exigentes el camino vi a vk se intersectan con el camino de de vk a vj en un solo vertice.
Con ello podemos plantear la siguiente ecuación:
Algoritmo
secuencial:
procedure
FLOY_ALL_PAIRS_SP(A)
D0 = A;
for k:=1 to n do
for i:=1 to
n do
for j:=1 to n do
dk_ij = min(
dk-1_ij , dk-1_ik + dk-1_kj );
end
FLOY_ALL_PAIRS_SP
Algoritmo de Floyd usando una malla de 2 dimensiones
Descripción del algoritmo:
Se particiona la matriz de adyacencia del grafo G en bloques que dos
dimensiones asignándoles una submatriz de n/sqrt(p) *n/sqrt(p) a
cada procesador. Al proceso que se encuentra en la i-th fila y j-th
columna le representaremos por Pij. Durante la k-ésima iteración
cada proceso necesita ciertos segmento de la columna k y de la fila
k. Por ejemplo si queremos calcular dk_lr necesitamos dk-1_lk
y dk-1_kr como se puede apreciar en la figura.
procedure
FLOYD_2D_BLOCK( D0 )
begin
for k:=1 to n do
begin
each process Pi,j
that has a segment of the k_th row of D_k-1;
broadcast it to
the P*,j processes;
each process Pi,j
that has a segment of the k_th column of D_k-1;
broadcast it to
the to the Pi,* processes;
each process wait
to receive the neede segments;
each process Pi,j
computes its part of the D_k matrix;
end
end FLOY_2D_BLOCK
Algoritmo Paralelo Bidimensional:

Lecturas :
"Floyd uno los pioneros de las Ciencias de la Computación" , reporte de la Universidad de Standford 2001
No hay comentarios:
Publicar un comentario