Você está na página 1de 20

TAREA 1

Estructuras Discretas
Grafos
Autores

Esteban Plaza Aranda

esteban.plaza@ceinf.cl

Ingeniera en Informtica

Universidad Tecnolgica Metropolitana

Andrea Romn Dinamarca

ayeromand@gmail.com

Ingeniera en Informtica

Universidad Tecnolgica Metropolitana

Sebastin Salazar Pulgar

sebanicosp@gmail.com

Ingeniera en Informtica

Universidad Tecnolgica Metropolitana

2
Resumen Ejecutivo

El siguiente informe est pensado para demostrar soluciones a problemas tpicos con grafos a
travs del lenguaje de programacin Python en su versin 2.7.

Utilizando a su vez diversas libreras complementarias y apoyndonos en la teora propia de esta


temtica.

Este informe se gesta principalmente para cumplir el trabajo de la asignatura de Estructuras


Discretas correspondiente al primer semestre del ao 2015 de la Universidad Tecnolgica
Metropolitana Dictada por Don Ricardo Corbinaud Prez, Acadmico de la Institucin.

3
ndice
1. Introduccin 5

2. Teora 6
a. Grafos 6
b. Dgrafos 6
c. Arboles 7
d. Representacin a travs de matrices. 7
i. Matriz de adyacencia. 7
ii. Matriz de incidencia. 7

3. Presentacin del Problema. 8

4. Metodologa para la resolucin de los problemas. 9

a. Algoritmo de Verificacin (Conexo & no-Conexo). 9

b. rbol mnimo va Prim. 10

c. Algoritmo de Bsqueda DFS. 11

d. Algoritmo de Dijkstra. 12

e. Algoritmo de Coloracin. 13

5. Conclusiones. 14

6. Bibliografa. 15

7. Anexos. 16
a. Resultados y simulacin paso a paso. 16
i. Algoritmo de Verificacin. 16
ii. rbol mnimo va Prim. 17
iii. Algoritmo de bsqueda DFS. 18
iv. Algoritmo de Dijkstra. 19
v. Algoritmo de coloracin. 20

4
1 Introduccin

Una de las partes de la matemtica discreta que estos ltimos aos ha experimentado un desarrollo notable es
la teora de grafos, esta teora permite modelar de forma simple cualquier sistema en el cual exista una
relacin binaria, es por esto que su aplicacin es muy general tanto as que podemos modelar problemticas
de matemtica, probabilidades, anlisis numrico, electricidad, telecomunicaciones, informtica e incluso en
sociologa y lingstica.

Bajo esta perspectiva es interesante poder utilizar la computacin para resolver estas problemticas.

Es por esto que este trabajo e informe tienen como objetivo comprender y aplicar los distintos algoritmos
utilizados para resolver problemas relacionados a grafos a travs de un lenguaje de programacin que en los
ltimos aos ha recibido una explosiva aceptacin y utilizacin desde la comunidad acadmica y cientfica.

5
2 Teora

Para la resolucin de las problemticas que vendrn en los apartados siguientes nos ser necesario
conocer algunos conceptos para comprender el problema y dar solucin a travs de la
programacin y modelado del mismo.

a) Grafos

Llamaremos grafo a una estructura combinatoria constituida por un conjunto {V, E}, donde a V
le denominaremos Vrtice y a E le denominaremos Arista.

Por lo cual imaginaremos a un grafo como lo muestra la siguiente imagen.

Donde las circunferencias rojas sern los Vrtices y las lneas sern las
Aristas.

b) Dgrafos

Llamaremos Dgrafo a una estructura combinatoria por un conjunto {V, E} donde E mantienen
una conexin o direccin. Por lo cual imaginaremos a un grafo como lo muestra la siguiente
imagen.

Imagen en la cual observamos unas puntas de flecha que indicaran la


direccin, as como tambin nos percatamos de que el vrtice c no
podemos llegar hacia a.

c) Arboles

Un rbol es un grafo conexo sin ciclos.

6
d) Representaciones a travs de matrices

Como ya se ha indicado, un grafo, dgrafo o rbol pueden representarse mediante un dibujo en el


cual cada vrtice representa un punto y cada arista una lnea o lnea dirigida, no obstante, cuando
se requiere el procesamiento por algn computador, esta representacin es poco eficiente, ante lo
cual surge una forma de representar los grafos a travs de matrices.

i) Matriz de adyacencia

La matriz de adyacencia de un grafo G, donde cada filas y columnas son un vrtices de orden nxn,
es decir una matriz cuadrada, donde se ven representadas las conexiones (incidencias) entre grafos.

Grafo Matriz de Adyacencia

ii) Matriz de incidencia

Matriz de adyacencia de un grafo G, donde cada i y j son un vrtices y aristas. Esta matriz conecta
vrtice con arista.

Matriz de incidencia
Grafo

7
3 Presentacin del Problema

Al momento de hablar de grafos y su utilizacin en ingeniera nos surgen algunas dudas tales
como:

1) Cmo se si un grafo es conexo o no?

2) Cmo puedo recorrer todos los vrtices, optimizando recursos (obteniendo el peso mnimo)?

3) Cmo puedo recorrer un grafo de manera ordenada pero no uniforme?

4) En un grafo como puedo llegar de k a b con el menor peso posible?

5) Es posible colorear (pintar) las aristas de un grafo para que ninguna arista hermana a esta
(adyacente) tenga su mismo color? Cules son los colores o permutacin posible?

Cada una de estas preguntas se resolver a travs de algoritmos conocidos pero que esta vez sern
escritos en Python. Tales como:

1) Teorema de Havel-Hakimi o Algoritmo sobre valencias.

2) Algoritmo de Prim.

3) Bsqueda en profundidad o DFS.

4) Algoritmo de Dijkstra.

5) Algoritmo de Brelaz y Formula de Euler.

8
4 Metodologa para la resolucin de los problemas

a) Algoritmo de Verificacin (Conexo & no-Conexo)

Para poder representar grafos podemos hacerlo indicando sus Valencias las cuales indican el
nmero de vrtices al cual apunta cada nodo.

Las valencias de este grafo serian las siguientes: 1, 2, 2, 3, 3, 3.

Para la solucin de este problema utilizaremos el siguiente Teorema y


Algoritmo.

Teorema de Havel-Hakimi. Una secuencia de enteros es grfica


s, y slo s tambin lo es la lista: , que
resulta de eliminar el primer elemento y restar una unidad a los siguientes valores de la lista.

9
b) rbol mnimo va Prim.

Para la obtencin de un rbol generador de coste mnimo existen dos metodologas o algoritmos,
por un lado esta Prim y por otro Kruskal, pero para este caso, solucionaremos el problema
mediante Prim, el cual consiste en incrementar continuamente el tamao de un rbol, comenzando
por un vrtice inicial al que se le van agregando sucesivamente vrtices cuya distancia a los
anteriores es mnima. Esto significa que en cada paso, las aristas a considerar son aquellas que
inciden en vrtices que ya pertenecen al rbol.

El rbol generador mnimo est completamente construido cuando no quedan ms vrtices por
agregar.

Algoritmo generador albor mnimo va Prim (PseudoCodigo )

Prim ( L [1..n , 1..n ]) :


T =NULL
para i=2 hasta n hacer
ms_prximo [ i ]=1
distmin [ i ]=L [ i , 1]
para i=1 hasta n -1 hacer
min=infinito
para j=2 hasta n hacer
si 0 <= distmin [ j ] < min entonces
min=distmin [ j ]
k=j
T=T union {{mas_prximo [ k ], k }}
distmin [ k ]= -1 'se aade k a B
para j=2 hasta n hacer
si L [ j , k ] < distmin [ j ] entonces
distmin [ j ]=L [ j , k ]
ms_prximo [ j ]=k
devolver T

10
c) Algoritmo de Bsqueda DFS.

El algoritmo de bsqueda en Profundidad o DFS, es un algoritmo que nos permite recorrer todos
los nodos de un grafo o rbol de manera ordenada pero no uniforme. Su funcionamiento consiste
en ir expandiendo todos y cada uno de los nodos que va localizando, de forma recurrente, en un
camino concreto. Cuando ya no quedan ms nodos que visitar en dicho camino, regresa
(Backtracking), de modo que repite el mismo proceso con cada uno de los hermanos del nodo ya
procesado

Algoritmo de Busqueda DFS (PseudoCodigo)


DFS(grafo G)
PARA CADA vertice u V[G] HACER
estado[u] NO_VISITADO
padre[u] NULO
tiempo 0
PARA CADA vertice u V[G] HACER
SI estado[u] = NO_VISITADO ENTONCES
DFS_Visitar(u,tiempo)
DFS_Visitar(nodo u, int tiempo)
estado[u] VISITADO
tiempo tiempo + 1
d[u] tiempo
PARA CADA v Vecinos[u] HACER
SI estado[v] = NO_VISITADO ENTONCES
padre[v] u
DFS_Visitar(v,tiempo)
estado[u] TERMINADO
tiempo tiempo + 1
f[u] tiempo

11
d) Algoritmo de Dijkstra.

El algoritmo de Dijkstra, tambin llamado algoritmo de caminos mnimos, es un algoritmo para la


determinacin del camino ms corto dado un vrtice origen al resto de vrtices en un grafo con
pesos en cada arista. Su nombre se refiere a Edsger Dijkstra, quien lo describi por primera vez en
1959.
La idea de este algoritmo consiste en ir explorando todos los caminos ms cortos que parten del
vrtice origen y que llevan a todos los dems vrtices; cuando se obtiene el camino ms corto desde
el vrtice origen, al resto de vrtices que componen el grafo, el algoritmo se detiene.

Algoritmo de Dijkstra (Pseudocdigo)

DIJKSTRA (Grafo G, nodo_fuente s)


para u V[G] hacer
distancia[u] = INFINITO
padre[u] = NULL
distancia[s] = 0
adicionar (cola, (s, distancia[s]))
mientras que cola no es vaca hacer
u = extraer_mnimo(cola)
para todos v adyacencia[u] hacer
si distancia[v] > distancia[u] + peso (u, v) hacer
distancia[v] = distancia[u] + peso (u, v)
padre[v] = u
adicionar(cola,(v, distancia[v]))

12
e) Algoritmo de Coloracin.

En Teora de grafos, la coloracin de grafos es un caso especial de etiquetado de grafos; es una


asignacin de etiquetas llamadas colores a elementos del grafo, de manera simple, una coloracin
de los vrtices de un grafo tal que ningn vrtice adyacente comparta el mismo color

Para la solucin a este problema utilizaremos el algoritmo de Brelaz.

En el algoritmo de Brelaz tendremos en cuenta la suma de los grados de los vecinos de cada
vrtice y los colores ya asignados a dichos vecinos

Secuencia

PASO 1

Calcular el grado de todos los vrtices y colorear un vrtice de grado mximo con el color 1.

PASO 2

Seleccionamos un vrtice, an sin colorear, con grado de saturacin o color mximo. Si existen
varios vrtices con el mismo grado de saturacin mximo escogemos el de mayor grado entre esos
vrtices. Si adems coinciden en grado seleccionamos el primero comenzando por la izquierda de
la tabla.

PASO 3

Colorear el vrtice seleccionado en el paso 2 con el menor color posible.

PASO 4

Si todos los vrtices se han coloreado, FIN. En caso contrario, volver al paso 3.

13
5 Conclusin

Como ya recopilamos toda la informacin y teora necesaria para solucionar los problemas
planteado solo queda implementar en un sistema integral estas soluciones a travs del
lenguaje de Programacin Python 2.7.

14
6 Bibliografa

[1] B.Bollobas, Graph Theory, Springer,1979.

[2] F.Harary, Grap Theory, Addison Wesles, 1972.

[3] R.J.Wilson, Introduccin a la Teora de Grafos, Alianza Editorial, 1983.

[4] Think Python, Allen B. Downey.

[5] Python para Todos, Ral Gonzlez Duque.

15
7 Anexos

a) Simulacin Paso a paso

i) Algoritmo de Verificacin

Para simular este problema abriremos el programa principal Principal_Menu.py.

1) Seleccionaremos la primera opcin , escribiendo el numero


1.

2) Luego de esto el programa nos pide ingresar las valencias una a


una, para detenernos y terminar de ingresar valencias escribimos
-1.

3) Luego de esto nos retornara si Representa o no un Grafo y el arreglo resultante.

Simulacin

Probaremos para la siguiente combinacin de valencias

{2, 3, 3, 2, 2} {6, 2, 1}

{2, 2, 2}

16
ii) rbol mnimo va Prim.

Para simular este problema abriremos el programa principal Principal_Menu.py.

1) Seleccionaremos la segunda opcin escribiendo el nmero 2 en


el men principal.

2) Luego el programa nos pide ingresar n correspondiente a la


cantidad de vrtices

3) Luego ingresamos la cantidad de aristas TOTALES (Es decir del grafo.)


4) Finalmente ingresaremos para cada arista, definiremos sus incidencias y sus pesos

Simulacin

Simularemos este ejemplo hecho en la ctedra

Ante lo cual nos retorna.

Lo cual corresponde a lo obtenido por el profesor en clases.

17
iii) Algoritmo de bsqueda DFS.
Para simular este problema abriremos el programa principal Principal_Menu.py.

1) Seleccionaremos la Tercera opcin escribiendo el nmero 3 en el men.

2) Luego el programa nos pedir ingresar la cantidad de vrtices.

3) Para cada uno de los vrtices anteriores indicaremos sus vrtices adyacentes.

Simulacin

Para la simulacin de este problema utilizaremos el grafo del problema anterior.

18
iv) Algoritmo de Dijkstra.

Para simular este problema abriremos el programa principal Principal_Menu.py.

1) Seleccionaremos la Cuarta opcin escribiendo el nmero 4 en el men.

2) Luego el programa nos pedir ingresar la cantidad de vrtices.

3) Para cada uno de los vrtices anteriores indicaremos sus vrtices adyacentes.

Simulacin
Para el siguiente Grafo, entre el vrtice A y C.

El programa nos entrega el siguiente resultado como


Camino mnimo {a,b,d,c} con peso = 6

Para confirmar este resultado lo contrastaremos con uno entregado por el programa GraphThing
versin 1.3.2, el cual entrega el siguiente camino mnimo.

El cual efectivamente corresponde con el entregado por


nuestro programa.

19
v) Algoritmo de coloracin.

Para simular este problema abriremos el programa principal Principal_Menu.py.


1) Seleccionaremos la Quinta opcin escribiendo el nmero 5 en el men.

2) Luego el programa nombrar a cada vrtice con una key

3) Luego de esto asociaremos a cada key (vrtice) con sus respectivas valencias y vrtices
adyacentes

Simulacin

Para esta simulacin utilizamos un problema de coloracin que se encuentra en el ensayo de


Prueba N1 del 25 de Octubre del 2010, el cual es el siguiente grafo.

1) Luego de asociar un vrtice a una key, indicamos sus


valencias y los vrtices a los cuales conecta

Ante lo cual nos entrega el siguiente resultado.

Lo que representara la siguiente coloracin del grafo:

20

Você também pode gostar