All pairs Shortest paths – Algoritmo de la multiplicación de Matrices
All pairs Shortest paths – Algoritmo de la multiplicación de Matrices
Andrés David Chamorro Parejo
Definamos W=(wij), la matrix de pesos del Grafo G=(V,E) supongamos que G no tiene Ciclos negativos. El problema de encontrar los caminos mas cortos para cualquier par de vertices de el Grafo G tiene como salida (output) una matrix D = (dij) donde dij es el peso del camino mas corto desde el vértices i al j, en este articulo veremos un primer algoritmos que se asemeja mucho al del multiplicación de matrices.
Este algoritmo, para solucionar el problema, utiliza el paradigma de
programación dinámica.
- Caracterización de la subestructura optima, Consideremos que el camino p de i a j que tiene a lo mas m aristas. Como G no tiene Ciclos negativos m < ∞, si i=j entonces w(p)=0 y p no tiene aristas, si i ≠ j entonces podemos descomponer p en camino que va a un k predecesor de j en p, el camino de i a k es el camino mas corto de i a k ya que p lo es de i a j
- Sea lij (m) el mínimo peso de un camino de i a j que tiene a lo mas m aristas, cuando m=0 existe un camino si y solo si i=j.
lij ={
0 si
i=j∞ si i ≠ j
Para m ≥ 1 lijm es el mínimo entre lij m−1 y el peso de cualquier camino que tenga a lo mas m aristas obtenidos a observar todos los posibles predecesores k de j.
lij(m)
=min(lij(m−1),mink{lik (m−1) + wkj})
=mink{lik (m−1) + wkj}
La ultima igualdad se tiene ya que w jj=0 para todo j.
Como G no tiene Ciclos entonces el camino mas corto de i a j es simple tendrá en el peor de los casos n−1 aristas ósea.
δ(ij)=lij n−1 = lij n = …
- Computemos la serie de matrices L (1),L (2),…,L (n−1) donde L (m)=(lijm), la matrix final L (n−1) contiene los pesos de los caminos mas cortos para cada par ij, observe que L (1)=W,
el corazón del algoritmo es el siguiente procedimiento llamado:EXTEND-SHORTED-PATHS que tiene como entrada una matrix L (m−1) y W y retorna L (m)ESTEND-SHORTED-PATHS(L,W)
1 N← rows[L]
2 L′=(l′ij)
3 for i ← 1 to n
4 do for j ← 1 to n
5 do l′ij ← ∞
6 for k ← 1 to n
7 do l′ij ← min(l′i,j,lij +w kj)
8 return L′
Este procedimiento se escribe sin superíndice para hacer la entrada y la salida independiente de m, es claro que este procedimiento pertenece al orden de O(n3) y si calculamos una a una las matrices L (m) nos tomara un tiempo de orden O(n4) lo que es muy costoso, veamos la relación que hay entre este procedimiento y el de multiplicación de matrices. Para calcular la matrix C=A ·B tendremos que calcular para todo par i,j=1,2,…,n.
cij=
n
∑ k=1
aik ·bkjSi hacemos la siguiente sustitución y definimos un semianillo.
+
→ min
·
+
podemos redefinir el algoritmo de la multiplicación de matrices calculando cada elemento de la matrix producto como mink{lik(m−1) + wkj}) teniendo como la matrix identidad:
L (0)=I =
/0
∞
…
∞\
|∞
0
…
∞
:
:
···
:
∞
∞
…
0
Gracias a esto podemos calcular las “potencias” L (m) no de una en una sino en potencias de dos hasta m=2⎣lg (n−1)⎦ ya que δ(ij)=lij n−1 = lij n = …,y con esto disminuir el numero de iteraciones de O(n4) a O(n3lgn)
File translated from
TEX
by
TTHgold,
version 4.00.
On 07 Dec 2010, 03:43.
Mis Clases de Analisis de algoritmos
Mi primera impresión en el RUM es de fuerza, constancia, esfuerzo, o como dicen en una región de mi país, “Garra”. Son mis primeras clases totalmente en Ingles y al no ser muy bueno para los idiomas mi trabajo es triple con respecto a mis compañero…