Sesion de Pr´acticas 3 - um.es
Transcript of Sesion de Pr´acticas 3 - um.es
Algebra y Matematica Discreta Sesion de Practicas 3
Algebra y Matematica DiscretaSesion de Practicas 3
(c) 2013 Leandro Marın, Francisco J. Vera, Gema M. Dıaz
30 Sep 2013 - 6 Oct 2013
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
Definicion
Un grafo es simplemente un conjunto de vertices y unconjunto de aristas que unen pares de vertices.
Para introducir un grafo en sage lo que tenemos que decir escuantos vertices tenemos y cuales son las conexiones entreellos.
El programa nos da varias opciones.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
Comandos para vertices y aristas
Los comandos add_vertex y delete_vertex nos ponen yquitan vertices en un grafo.
Los comandos add_edge y delete_edge nos ponen y quitanaristas en un grafo.
Una forma de definir un grafo, es ir anadiendo sucesivamentecada uno de los vertices y aristas que necesitamos.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
Escribamos el siguiente codigo
G = Graph ()
G.add_vertex(0)
G.add_vertex(1)
G.add_vertex(2)
G.add_vertex(3)
G.add_edge(0,1)
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,0)
plot(G)
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
Obtenemos lo siguiente:
0
1
2
3
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
Anadir una Arista
Vamos a anadir una arista entre los vertices 1 y 3
Para eso no tenemos mas que pone G.add_edge(1,3)
Y para eliminar la arista entre los vertices 0 y 1 ponemosG.delete_edge(0,1)
Si volvemos a dibujar el grafo con G.plot()
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
Obtenemos lo siguiente:
0
1 2
3
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
Disposicion de los Vertices
sage elige la ordenacion de los vertices que considera ajustadaal grafo que dibujamos.
Podemos indicar diferentes formas de poner los vertices asage poniendo un parametro llamado layout
Podemos usar por ejemplo las disposicionesG.plot(layout=’circular’) oG.plot(layout=’spring’)
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
G.plot(layout=’circular’)
Obtenemos lo siguiente:
0
1
2
3
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
Matriz de Adyacencia (I)
Dado un grafo G , la matriz de adyacencia de G es una matrizcuadrada que tiene tantas filas y columnas como verticestenga nuestro grafo, y dados dos vertices i y j , tendra el valor1 en la posicion (i , j) de la matriz si hay una arista que unedichos vertices, y 0 si no existe dicha arista.
Podemos calcular la matriz de adyacencia de un grafo con elcomando
G.adjacency_matrix ()
En nuestro caso obtenemos
0 0 0 10 0 1 10 1 0 11 1 1 0
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
Matriz de Adyacencia (II)
Tambien podemos definir un grafo a partir de su matriz deadyacencia.
Para ello simplemente ponemos
M = matrix (ZZ ,3,[0,1,1,1,0,1,1,1,0])
G = Graph(M)
Nos introducira la matriz en G . Podemos mostrarlo enpantalla.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Grafos en Sage
Obtenemos lo siguiente:
0
1 2
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Tipos de Grafos
Grafos Dirigidos
Un grafo dirigido es un grafo en el cual las aristas tienen unsentido de recorrido.
Eso significa que podemos tener una arista entre el vertice i yel vertice j mientras que no lo tenemos en el sentido contrario,entre j e i .
Para construir grafos dirigidos utilizamos DiGraph en lugar deGraph.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Tipos de Grafos
Escribamos el siguiente codigo
G = DiGraph ()
G.add_vertex(0)
G.add_vertex(1)
G.add_vertex(2)
G.add_vertex(3)
G.add_edge(0,1)
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,0)
plot(G)
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Tipos de Grafos
Obtenemos lo siguiente:
0
1
2
3
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Tipos de Grafos
Matriz de Adyacencia (III)
Si el grafo es dirigido la matriz de adyacencia puede no sersimetrica, puesto que podemos tener una conexion entre i y j ,pero no entre j e i . Eso hace que la posicion (i , j) de lamatriz valga 1 mientras que la posicion (j , i) vale 0.
En este caso podemos tambien calcular la matriz deadyacencia de un grafo con el comando
G.adjacency_matrix ()
Que con el grafo anterior nos da
0 1 0 00 0 1 00 0 0 11 0 0 0
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Tipos de Grafos
Pseudografos
Un pseudografo es aquel en el que permitimos uniones de unvertice consigo mismo.Un ejemplo podrıan ser los elementos {0, 1, 2, 3, 4, 5} junto con lasrelaciones de divisibilidad entre ellos:
M = matrix(ZZ ,6,[0]*36)
for i in range(6):
for j in range(6):
if ZZ(i).divides(ZZ(j)):
M[i,j] = 1
G = DiGraph(M)
Podemos representar el grafo de forma circular.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Tipos de Grafos
Obtenemos lo siguiente:
0
1
2
3
4
5
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Tipos de Grafos
Vertices con Nombres
Podemos definir un grafo dando nombres a los vertices e indicandocuales son los vertices que los conectan.
G = Graph({"a":{"b","h"},"b":{"a","c","h"},
"c":{"b","d","f","i"},"d":{"c","e","f"},
"e":{"d","f"},"f":{"c","d","e","g"},
"g":{"f","h","i"},"h":{"a","b","i"}})
Podemos representarlo con G.plot()
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Tipos de Grafos
Obtenemos lo siguiente:
a
b
c
d
e f
g
h
i
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Caminos y Conexion
Definicion de Camino
Dado un grafo G y dos vertices u y v . Un camino entre u y v
es una lista de vertices [w0,w1, · · · ,wk ] tales que w0 = u,wk = v y para todo i = 0, ..., k − 1 el par {wi ,wi+1} es unaarista del grafo.
La longitud del camino es el numero de aristas que lo forman.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Caminos y Conexion
Caminos y Matriz de Adyacencia
La matriz de adyacencia de un grafo nos indica el numero decaminos de longitud 1 que existen entre cada par de vertices.
Eso tambien es cierto para las potencias de la matriz deadyacencia. Es decir, si G es un grafo definido con matriz M,la matriz Mk tiene en su entrada (i , j) el numero de caminosde longitud k que existen entre el vertice i y el vertice j .
El numero de caminos de longitud menor que k que unen i
con j se calcula con la suma de las matrices:
M0 +M1 +M2 + · · ·+Mk−1
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Caminos y Conexion
Ejemplo
Por ejemplo, el grafo:
0
1
2
3
4
5
Tiene como matriz de adyacencia:
M =
0 1 0 0 1 01 0 1 0 1 10 1 0 1 0 10 0 1 0 0 11 1 0 0 0 00 1 1 1 0 0
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Caminos y Conexion
Ejemplo
0
1
2
3
4
5
Si elevamos la matriz al cuadrado,podemos ver los caminos de longitud 2entre todos los pares de vertices.
M2 =
2 1 1 0 1 11 4 1 2 1 11 1 3 1 1 20 2 1 2 0 11 1 1 0 2 11 1 2 1 1 3
Si nos fijamos por ejemplo en la entradaM2
1,3 = 2 nos indica que hay doscaminos de longitud 2 entre los vertices1 y 3.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Caminos y Conexion
Ejemplo
0
1
2
3
4
5
Si elevamos la matriz al cubo, podemosver los caminos de longitud 2 entretodos los pares de vertices.
M3 =
2 5 2 2 3 25 4 7 2 5 72 7 4 5 2 52 2 5 2 2 53 5 2 2 2 22 7 5 5 2 4
Si nos fijamos por ejemplo en la entradaM3
0,3 = 2 nos indica que hay doscaminos de longitud 2 entre los vertices0 y 3.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Caminos y Conexion
Conexion
Un grafo se dice conexo si todo par de vertices esta conectadopor un camino.
Se puede saber si un grafo es conexo con el comandoG.is_connected()
Si un grafo no es conexo, se puede dividir en trozos. Cadauno de ellos recibe el nombre de componente conexa.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Caminos y Conexion
Conexion y Matriz de Adyacencia
Si en un grafo hay un camino entre dos vertices, podemosasegurar que tiene que haber al menos un camino que norepita vertices.
Por lo tanto, en un grafo de k vertices, dos verticescualesquiera tiene conexion si y solo si existe un camino delongitud menor que k .
Si M es la matriz de adyacencia de un grafo G con k vertices,se puede saber si G es conexo si para todo i y j , la matriz
M0 +M1 +M2 + · · ·+Mk−1
tiene una entrada no nula.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Caminos y Conexion
Ejemplo
0
1
2
3
4
5
M0+M
1+...+M5 =
29 49 34 24 29 34
49 77 73 44 49 73
34 73 63 49 34 63
24 44 49 33 24 49
29 49 34 24 29 34
34 73 63 49 34 63
lo que nos indica que este grafo esclaramente conexo. Podemos hacer esecalculo con:
sum([M ** j for j in range(6)])
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Caminos y Conexion
Caminos en sage
Dados dos vertices i y j de un grafo finito, podemos calculartodos los caminos entre i y j que no repitan vertices.
El comando:
G.all_paths(0,3)
nos dara los caminos entre el vertice 0 y el vertice 3.
En el grafo anterior nos dara:
[[0, 1, 2, 3], [0, 1, 2, 5, 3], [0, 1, 5, 2, 3],
[0, 1, 5, 3], [0, 4, 1, 2, 3], [0, 4, 1, 2, 5, 3],
[0, 4, 1, 5, 2, 3], [0, 4, 1, 5, 3]]
Debemos notar que el numero de caminos no coincide con laspotencias de la matriz porque aquı los caminos nos los da sinrepeticion de vertices (si no podrıamos tener infinitos).
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Definicion
Un arbol es un tipo de grafo conexo que cumple que entre dosvertices distintos hay un unico camino.
Un grafo formado por varios arboles disconexos se llama unbosque.
Se puede saber si un grafo es un arbol poniendo G.is_tree()
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Escribamos el siguiente codigo
G = Graph ()
G.add_vertex(0)
G.add_vertex(1)
G.add_vertex(2)
G.add_vertex(3)
G.add_vertex(4)
G.add_edge(0,1)
G.add_edge(0,2)
G.add_edge(2,3)
G.add_edge(2,4)
plot(G)
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Obtenemos lo siguiente:
0
1
2
3
4
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Para los arboles tenemos un layout especial. Podemos ponerG.plot(layout=’tree’)
0
12
34
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Arboles con Raız
Si el arbol esta construido a partir de uno de sus vertices, esevertice se llama raız.
La distancia de un vertice a la raız es el numero de aristas quetenemos que recorrer para llegar a ella. Ası hablaremos de losvertices que estan en el nivel 1,2,...
Para indicar que nos represente el grafo con una raız concreta,lo indicamos con el comando:
G.plot(layout=’tree’,tree_root=0)
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Ası G.plot(layout=’tree’,tree_root=0) nos da
0
12
34
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Y si ponemos como raız al vertice 2, tenemosG.plot(layout=’tree’,tree_root=2) nos da
0
1
2
34
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Grafos con Pesos
En los grafos, podemos establecer el coste de las aristasindicandolo con un valor numerico sobre ellas. Es lo que sedenomina un grafo con pesos.
G = Graph({"a":{"b":4,"h":8},"b":{"c":1,"h":2},
"c":{"d":6,"f":1,"i":2},"d":{"e":4,"f":10},
"e":{"f":5},"f":{"g":1},"g":{"h":2,"i":6},
"h":{"i":14}})
Podemos representarlo con G.plot(edge_labels=True)
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Obtenemos lo siguiente:
1
1
6
5
2
1
10 24 14
2
8
4
6
a
b
cd
e
f
g
h
i
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Arboles Generadores
Dado un grafo conexo, nos puede interesar encontrar un arbolcontenido dentro del grafo que nos mantenga la conexion,pero que al ser arbol, tenga el mınimo numero de aristas.
Un arbol de este tipo se llama arbol generador del grafo.
Si el grafo tiene pesos en sus aristas, nos puede interesarencontrar el arbol generador de peso mınimo.
sage nos lo puede calcular directamente con el algoritmoKruskal.
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Kruskal
Introcuzcamos el grafo con pesos y calculemos el arbol generadorminimal
from sage.graphs.spanning_tree import kruskal
G = Graph({"a":{"b":4,"h":8},"b":{"c":1,"h":2},
"c":{"d":6,"f":1,"i":2},"d":{"e":4,"f":10},
"e":{"f":5},"f":{"g":1},"g":{"h":2,"i":6},
"h":{"i":14}})
G.weighted(True)
E = kruskal(G, check=True)
Algebra y Matematica Discreta Sesion de Practicas 3
Grafos
Arboles
Kruskal II
Para que se imprima la lista de aristas que tenemos que construir ysus costes (lo que nos devuelve la funcion kruskal), tenemos quedecir print E y obtenemos:
[(’b’, ’c’, 1),
(’c’, ’f’, 1),
(’f’, ’g’, 1),
(’b’, ’h’, 2),
(’c’, ’i’, 2),
(’a’, ’b’, 4),
(’d’, ’e’, 4),
(’e’, ’f’, 5)]
Si por ejemplo queremos calcular el peso total del arbol resultantepodemos hacerlo con:
sum([u[2] for u in E])