1.2.2 Trayectorias y matrices 1.2.3 Algoritmos de conexión

Transcripción

1.2.2 Trayectorias y matrices 1.2.3 Algoritmos de conexión
7 – Laboratorio de Matemáticas : Teorı́a de Grafos
1.2.2
1.2 Moverse por un grafo. Conexión
Trayectorias y matrices
La matriz M , de adyacencia de un (di)grafo, indica las aristas(arcos) entre vértices, que son también las
trayectorias de longitud 1 posibles entre vértices. Ası́, la matriz M 2 = M M indica, en cada posición, el
número de trayectorias de longitud 2 entre los vértices correspondientes, es decir, si en la posición (i, j)
hay un 3, tenemos tres trayectorias
distintas desde el vértice vi al vértice vj .


0 1 1 1
1 0 1 0


En efecto, si M = 
 es la matriz de un grafo, el elemento (1, 3) de M 2 se obtiene de
1 1 0 1
1 0 1 0
operar la fila 1 de M con la columna 3 de M . Entonces (ponemos con cada elemento de la matriz su
significado como arista),

µ
0
6→
1
1
v1 →v2
v1 →v3
¶


v1 →v4

1
1
1
0
1

v1 →v3
v2 →v3
6→


 = 0 · 1+ 1 · 1 +1 · 0+ 1 · 1 = 2
v1 →v2 →v3
v1 →v4 →v3

6
→
6→
v4 →v3
luego hay dos trayectorias de longitud 2 desde el vértice v1 al vértice v3 : v1 v2 v3 y v1 v4 v3 .
Igualmente, el elemento (2, 2) de M 2 será:

µ
1
v2 →v1
0
6→
1
v2 →v3
¶


6
→

0
1
0
1
0

v1 →v2


 = 1 · 1 +0 · 0+ 1 · 1 +0 · 0 = 2
v2 →v1 →v2
v2 →v3 →v2
v3 →v2 
6→
6→
6→
6→
y hay dos trayectorias de longitud 2 desde el vértice v2 al vértice v2 : v2 v1 v2 y v2 v3 v2 .
Los valores de M 2 cuentan trayectorias, no caminos (aunque algunas lo sean). En el primer caso, las
trayectorias son caminos, pero en el otro no son caminos (ni colas) pues se recorre la misma arista.
De la misma forma, en M 3 se tiene el número de trayectorias de longitud 3 entre cada par de vértices;
en M 4 se tiene el número de trayectorias de longitud 4 entre cada par de vértices, etc.
Como las potencias proporcionan solo el número de trayectorias entre los vértices, no son muy útiles
a la hora de buscar un camino concreto entre vértices. Sin embargo, sı́ nos informan sobre los vértices
conectados a otros vértices y, en particular, en los grafos dirigidos nos indican si el grafo es o no acı́clico.
1.2.3
Algoritmos de conexión de un grafo
Usando las potencias de la matriz de adyacencia de un grafo no dirigido, puede estudiarse la conexión de
manera eficaz, pero poco eficiente desde el punto de vista del cómputo operacional: basta con comprobar
si en M junto con M 2 junto con M 3 junto con . . . , todos los vértices están conectados entre sı́. Yendo a
la definición de conexión (existencia de caminos entre cada par de vértices) y construyendo nuevos caminos
a partir de los ya existentes se obtienen mejores algoritmos para probarlo. El más sencillo, y que sirve como
base a otros interesantes algoritmos es el algoritmo de Warsall.
1.2.3.1
El algoritmo de Warsall
Este algoritmo recrea la construcción de trayectorias estre vértices de la manera siguiente:
“Los vértices vi y vj estan conectados si hay un camino entre ellos o, si para algún vértice vk hay un
camino de vi a vk y también un camino de vk a vj ”
La estrategia que sigue el algortimo es de comprobaciones exhaustivas y lo hace en sentido contrario al
sugerido por la frase anterior: no comprueba si para cada par de vértices vi , vj no conectados hay algún
otro vk que hace de enlace, sino al revés, comprueba si cada vértice vk sirve de enlace entre cada par de
vértices vi y vj .
Prof: José Antonio Abia Vian
I.T.I. en Electricidad
8 – Laboratorio de Matemáticas : Teorı́a de Grafos
1.2 Moverse por un grafo. Conexión
Ası́, Warsall produce una sucesión de matrices booleanas (de ceros y unos) W1 , W2 , . . . , Wn (una por
cada vértice vk que comprueba si sirve de enlace) que indican si dos vértices dados están o no conectados.
Si el grafo es conexo la última matriz constará toda de unos (si hay al menos dos vértices).
Usaremos la matriz de adyacencia M como matriz de conexión inicial (W0 = M , sólo están conectados
los vértices extremos de las aristas). En el paso 1, se contruye una nueva matriz W1 que indicará los vértices
conectados, bien porque lo estaban o bien porque se han conectado a través de v1 . En el paso 2, se contruye
una nueva matriz W1 que indicará los vértices conectados, bien porque lo estaban en W1 o bien porque
se han conectado a través de v2 . Etc.
El algoritmo, en seudocódigo y con las operaciones lógicas “o(|)” e “y(&)”, puede plantearse ası́:
Algoritmo 1.- (de Warsall)
inicio: W0 = M (matriz de adyacencia); n=n o de vertices
para k = 1 hasta n
para j = 1 hasta n
para i = 1 hasta n
³
´
Wk (i, j) = Wk−1 (i, j) | Wk−1 (i, k) & Wk−1 (k, j)
fin
fin
fin
Y el grafo será conexo si la matriz final, Wn , es toda de unos.
Matlab es un potentı́simo manejador de matrices, por lo que es mejor y más corto hacer algoritmos
para las matrices completas que para los elementos individualmente (si se puede claro). Ası́, el algoritmo
de Warsall en Matlab se reduce a:
Algoritmo 2.- (de Warsall)
W = M;
n = size(W, 1);
v = ones(1, n);
for k=1 : n
´
³
W = W |
W( : , k · v) & W(k · v, : )
end
Como los operadores lógicos sobre matrices se aplican elemento a elemento y, en cada paso k, el operador
“y(&)” siempre se usa con un elemento de la columna k y uno de la fila k , podemos describir las n × n
operaciones como una única operación entre dos matrices, la primera formada por copias de la columna k
y la segunda por copias de la fila k.
2.2 Sea D1 el digrafo que se forma al eliminar del digrafo D del ejercicio 2.1 de la pág. 6, los vértices
v1 y v7 y el arco (v5 , v3 ).
(a) Hallar su matriz de adyacencia M1 .
Obtener la matriz de adyacencia, M1, a partir de la matriz M usada en el ejercicio 2.1.
(b) Renombrar los vértices restantes con x1 , x2 , etc., para que se adecúen a los datos de M1 .
Calcular M12 , M13 , M14 y M15 (producto de matrices M*M)
Observa las matrices potencia obtenidas, ¿hay algún vertice desde el que se pueda llegar a todos
los demás?, ¿se puede ir desde cada vértice a cualquier otro? ¿Son necesarias M16 , M17 . . . ?
(c) Observa ahora los elementos de las diagonales de esas matrices.
En el ordenador, puede usarse la orden diag(M)=matriz columna con la diagonal de M
¿Qué significan los valores obtenidos? ¿Que podemos decir sobre los ciclos y la aciclicidad de
D ? ¿Por qué paramos en la potencia 5?
(d) ¿El digrafo es conexo? Construye su grafo no dirigido subyacente.
Construye la matriz N1 del grafo subyacente y comprueba con el algoritmo de Warsall dado
(A Warsall es el nombre de la función a usar) si hay o no conexión
Prof: José Antonio Abia Vian
I.T.I. en Electricidad
9 – Laboratorio de Matemáticas : Teorı́a de Grafos
1.3
1.3.1
1.3 Caminos de peso mı́nimo
Caminos de peso mı́nimo
Algoritmo de Floyd y grafos pesados
El algoritmo de Warsall trabaja con operaciones lógicas para determinar la conexión o no entre los vértices,
pero cambiando el tipo de elementos y operadores usados se ha adaptado para otras cuestiones. Por
ejemplo, puede modificarse ligeramente para encontrar la longitud (en el sentido de número de aristas) del
camino más corto entre dos vértices conectados: “si hay un camino entre los vértices vi y vj y se puede
formar otro uniendo dos que pasen por otro vértice vk , elegimos el más corto de los dos”:
³
Long(vi , vj ) = mı́n
´
Long(vi , vj ) ,
Long(vi , vk ) + Long(vk , vj )
Como buscamos minimizar valores, debemos sustituir la matriz de adyacencia M , por otra matriz L (de
“longitud de alcance”) que almacena las longitudes de los caminos entre los vértices, de la siguiente manera:
• los vértices conectados por una arista (arco) están a alcance 1,
• los vértices no conectados directamente están a alcance ∞ y
• un vértice está a alcance 0 de sı́ mismo (0 en la diagonal, aunque esto es opcional).
Ası́ pues, se trata de ir minorando los valores ∞ de la matriz L realizando comprobaciones análogas a las
de Warsall, pero ahora, en cada paso se toman como nuevos valores de la matriz de alcance:
³
L(i, j) = mı́n
´
L(i, j) ,
L(i, k) + L(k, j)
es decir, tomamos como nueva longitud la del camino más corto entre el que tenemos (o no tenemos) y el
que se pueda formar uniendo dos caminos existentes. Esta variante, se denomina algoritmo de Floyd.
La matriz final del algoritmo contendrá, en cada posición, la logitud del camino más corto entre ese
par de vértices (con 0 en la diagonal, si partimos con esta condición) y el valor ∞ (inf en Matlab) si
los dos vértices no pueden conectarse.
La implementación en Matlab de este algoritmo es similar a la del algoritmo de Warsall:
Algoritmo 3.- (de Floyd) L;
n = size(L, 1);
v = ones(1, n);
for k=1 : n ³
´
L = min L , L( : , k · v) + L(k · v, : )
end
siendo L la “matriz de alcance” del grafo.
El algoritmo de Floyd, nos es útil para:
• obtener la longitud del camino más corto entre cada par de vértices conectados (la longitud, pero no
el camino),
• por lo que, si el grafo es no dirigido, para chequear la conexión del grafo.
Sobre un digrafo, el algoritmo no puede asegurar si es conexo o no (ver el ejemplo que aparece en la nota
siguiente) salvo en algunos casos particulares.
Nota: En un grafo no dirigido la conexión asegura que se puede ir desde cualquier vértice a cualquier otro,
pero no en los digrafos, donde puede haber vértices no conectados por caminos dirigidos aunque sea conexo
(que no haya camino de vi a vj ni camino de vj a vi ). En el digrafo
conexo de la derecha, no hay camino dirigido de v1 a v4 ni de v4 a v1 vr1 -vr2¾ vr3 -vr4¾ vr5
(de hecho, desde v1 sólo se puede ir a v2 y no se puede llegar a v1 desde
ninguno de los otros vértices).
El algoritmo de Floyd mejora su utilidad cuando se aplica sobre los grafos pesados (que se introducen
en el apartado siguiente) que diversifican las aplicaciones.
Prof: José Antonio Abia Vian
I.T.I. en Electricidad
10 – Laboratorio de Matemáticas : Teorı́a de Grafos
1.3.1.1
1.3 Caminos de peso mı́nimo
Ejercicios
3.3 Considerar el digrafo D del Ejercicio 1.2 dado por su matriz de adyacencia M .
(a) Comprobar que desde cada plaza se puede llegar a cualquier otra
(b) Si cerramos la plaza B al tráfico, ¿desde cada plaza restante se puede llegar a cualquier otra?
(c) Proponer algunas soluciones al problema de circulación, cambiando y/o añadiendo direcciones,
procurando hacer pocas variaciones.
Introduzcamos M, la matriz de adyacencia del digrafo D .
[i] Construir una matriz de alcance L
[ii] Usar el algoritmo de Floyd (A Floyd se denomina la función a usar) para comprobar que todas
las plazas están conectadas con las demás, y las longitudes mı́nimas de los caminos entre ellas.
[iii] Obtener la matriz resultante de cerrar la plaza B al tráfico (ver ejercicio 1.2 de pág. 4). Usar
el algoritmo de Floyd para comprobar que hay plazas no conectadas con otras.
[iv] Usar el algoritmo de Floyd para cada una de las soluciones propuestas, y obtener las longitudes
mı́nimas de los recorridos alternativos.
¿Cúal de ellas porporciona recorridos de menor longitud? ¿Cúal de ellas porporciona mejores
recorridos en relación con los recorridos existentes antes de las obras?
3.4 La cadena “Moto-Churro” quiere establecer una tienda para dar servicio a las plazas de la zona
representada por el digrafo del ejercicio anterior.
(a) ¿En qué plaza debe ponerla si quiere que el gasto de gasolina sea lo menor posible?
(b) ¿En qué plaza debe ponerla si quiere que el tiempo de entrega en cualquier plaza sea lo menor
posible?
(c) ¿En qué plaza debe ponerla si quiere que el tiempo que tarda en regresar a la tienda cualquier
repartidor sea lo menor posible?
1.3.1.2
Grafos pesados
Cuando un grafo modela una situación, en general, las conexiones (aristas y arcos) tienen además unas
caracterı́sticas propias. Pensemos en el ejemplo de una red viaria o una red eléctrica, no sólo se trata de
dar el servicio (conexión), sino que también es interesante conocer las longitudes de las lı́neas a establecer
(cantidad de material), las dificultades para su trazado (coste en tiempo o monetario), etc.
En el grafo, estos valores se reflejan asignando a cada arista un valor que represente la magnitud que
queremos considerar (un peso a cada arista).
Consideremos el grafo de la derecha, donde a cada arista le hemos asignado una distancia.
Si buscamos ahora el camino “más corto” entre el vértice v1
v2
v4
v6
7
2
s
s
s
y v3 no consideraremos que es el que tiene menos aristas,
¡@
¡@
¡
¡
¡
¡
sino aquel que recorre en total menor distancia: C1 = v1 v3
@1
@8
3
¡
¡
s
v
¡
3
5
4
1
@
@
recorre sólo una arista pero una distancia de 9, C2 = v1 v2 v3
¡@
¡@
@
7
tiene dos aristas y una distancia total de 6 y C3 = v1 v2 v5 v3
¡9
@
@
9@@ ¡
@ s¡
@s
s
¡
tiene tres aristas sin embargo la distancia recorrida es sólo
v3
1
v5
v7
de 5. Claramente, este último camino es más corto.
Definición 19.- Llamaremos peso de un grafo (o digrafo) simple G = (V, A) a una función real positiva
sobre el conjunto de aristas del grafo, es decir, a una función ω: A → IR+ .
El peso de cada arista (arco) lo denotaremos por ωij y llamaremos peso de una trayectoria a la suma
de los pesos de las aristas (arcos) que la componen.
Prof: José Antonio Abia Vian
I.T.I. en Electricidad
11 – Laboratorio de Matemáticas : Teorı́a de Grafos
1.3 Caminos de peso mı́nimo
En un grafo pesado, se llama matriz de pesos del grafo a la matriz Ω = (ωij )n×n , donde pondremos
ωij = ∞ si no hay arista (arco) desde el vértice vi al vértice vj y ωii = 0, ceros en la diagonal. (En
ocasiones puede resultar útil poner también en la diagonal el valor ∞ y, de hecho, algunos autores ası́ lo
hacen.)
Nota: Con la introducción del peso, la búsqueda del camino más corto y la “matriz de alcance” vistas en
la sección anterior son un caso particular: cuando el peso de cada arista es 1.
Unifiquemos criterios y notación:
Definición 20.- Llamaremos peso mı́nimo de vi a vj al mı́nimo de los pesos de los caminos de vi a vj ,
∗ , y camino (de peso) mı́nimo de v a v a cualquier camino C
lo denotaremos por ωij
i
j
ij entre ellos que
∗
tenga peso mı́nimo (es decir, ω(Cij ) = ωij ).
∗)
∗
La matriz de pesos mı́nimos es la matriz Ω∗ = (ωij
n×n con ωij = ∞ si no hay camino de vi a vj .
El siguiente resultado, conocido como el Principio de minimalidad de Bellman, y que básicamente
dice “cualquier camino contenido en un camino mı́nimo es también mı́nimo”, garantiza que los caminos
obtenidos –respetando este principio– son caminos mı́nimos.
Proposición 21.- Sea G un grafo pesado. Si x1 x2 · · · xp−1 xp es un camino mı́nimo, para cada i con
∗ = w∗ + w∗ .
1 < i < p, los caminos x1 x2 · · · xi y xi · · · xp−1 xp son caminos mı́nimos y w1p
1i
ip
Demostración:
Es claro el resultado, pues si el camino C1i = x1 x2 · · · xi−1 xi no es un camino mı́nimo, existe otro
0 = x x0 · · · x0
0
0
0
C1i
1 2
i−1 xi , con w(C1i ) < w(C1i ), con menor peso. Luego el camino x1 x2 · · · xi−1 xi · · · xp ,
0
de sustituir C1i por C1i , tiene menor peso que x1 x2 · · · xi−1 xi · · · xp , en contra de la hipótesis.
1.3.1.3
Pesos mı́nimos con el algoritmo de Floyd
Dos de los algoritmos más usuales para la búsqueda de caminos de peso mı́nimo son el anteriormente
comentado de Floyd y, sobre todo, el algoritmo de Dijkstra; si bien, su planteamiento y resultados difieren
bastante. Mientras Floyd proporciona los pesos mı́nimos de todos los caminos posibles, el de Dijkstra
proporciona únicamente los caminos desde un vértice dado.
Como ya anticipabamos, el algoritmo de Floyd multiplica su utilidad si lo aplicamos a grafos pesados.
Usando el algoritmo de Floyd con una matriz de pesos, se obtienen los pesos mı́nimos entre todos los
vértices, es decir, la matriz resultante contiene en cada posición el peso mı́nimo entre los vértices correspondientes (el mismo resultado que si usaramos Dijkstra con cada uno de los vértices). Pero es bastante
menos eficiente que Dijkstra, por lo que no es conveniente usarlo en su lugar.
A Floyd le introducimos la matriz de pesos y nos devuelve la de pesos mı́nimos, pero funciona un poco
a modo de ”caja negra”, pues no es fácil obtener otra información adicional del proceso. En particular,
resulta muy costoso construir a partir de él los caminos mı́nimos entre los vértices.
Está indicado cuando se trata de encontrar los pesos mı́nimos entre todos los vértices del grafo.
Ejemplo 22 El grafo de la figura modela los costos del envı́o de mensajes entre las estaciones de una
red. Si deseo enviar un mensaje a cada una de las otras estaciones, ¿desde cuál debo hacerlo para que me
cueste menos?
Aplicamos el algoritmo de Floyd para hallarla matriz de peso mı́nimo
del grafo: 


v6
0
7
∞
2
∞
2
0 3 4 2 4 2
sH
© H
 7 0 4 4 1 1 
3 0 3 4 1 1
2©©
2




1 HH
∞ 4 0 ∞ ∞ 2 
4 3 0 6 4 2
©
H
©




7
4
H s v3
s
v1 s©
Ω=
 −→ Ω∗ = 





2
4
∞
0
∞
∞
2
4
6
0
5
4
@
¡v@
2




¡4 1@
2@
∞ 1 ∞ ∞ 0 ∞
4 1 4 5 0 2
@ s¡
@s
2 1 2 ∞ ∞ 0
2 1 2 4 2 0
v4
v5
y, la respuesta a la pregunta inicial es la respuesta a: ¿desde cuál de los vértices el costo del envió a los
otros vértices es menor? Ese debe ser el elegido (v6 ¿no? ¿por qué?).
4
Prof: José Antonio Abia Vian
I.T.I. en Electricidad