Vous êtes sur la page 1sur 19

Curso : ALGORÍTMICA, ESTRUCTURA Y DATOS

Bloque : FC-PREEDS05C1N

Tema : GRAFOS

Profesor : NORABUENA ARANDA, CARLOS ALBERTO

Alumnos

- Quispe Huari, Luis Alex


- Porras Jaramillo, Milagros Lucia

2017 - 01
INTRODUCCIÓN

El origen de la palabra grafo es griego y su significado etimológico es "trazar".


Aparece con gran frecuencia como respuesta a problemas de la vida cotidiana, algunos
ejemplos podrían ser los siguientes: Un gráfico de una serie de tareas a realizar indicando su
secuenciación (un organigrama), grafos matemáticos que representan las relaciones
binarias, una red de carreteras, la red de enlaces ferroviarios o aéreos o la red eléctrica de
una ciudad. (Véase la figura. En cada caso, es conveniente representar gráficamente el
problema dibujando un grafo como un conjunto de puntos (vértices) con líneas
conectándose (arcos).

Los grafos son una estructura de datos no lineal y que tiene gran número de
aplicaciones. El estudio del análisis de grafos ha interesado a los matemáticos durante siglos
y representa una parte importante de la teoría combinatoria en matemáticas. Aunque la
teoría de grafos es compleja y amplia, en esta sesión se realizará una introducción a la
teoría de grafos.
2. ¿Qué son grafos?

Un grafo es un conjunto, no vacío, de objetos llamados vértices (o nodos) y una


selección de pares de vértices, llamados aristas (edges en inglés) que pueden ser orientados
o no. Típicamente, un grafo se representa mediante una serie de puntos (los vértices)
conectados por líneas (las aristas).

Los grafos permiten estudiar las interrelaciones entre unidades que se encuentran
en interacción.

VÉRTICES:
Son los puntos o nodos con los que está conformado un grafo.

Llamaremos grado de un vértice al número de aristas de las que es extremo. Se dice


que un vértice es `par' o `impar' según lo sea su grado.

Vértices Adyacentes: si tenemos un par de vértices de un grafo (U, V) y si tenemos un


arista que los une, entonces U y V son vértices adyacentes y se dice que U es el vértice
inicial y V el vértice adyacente.

Vértice Aislado: Es un vértice de grado cero.

Vértice Terminal: Es un vértice de grado 1.


TIPOS DE GRAFO:

Grafo dirigido:

Un GRAFO DIRIGIDO G consiste de un conjunto V de vértices y un conjunto E al


conjunto de aristas del grafo.
Los vértices de un grafo dirigido pueden usarse para representar objetos y los enlaces
relaciones entre los objetos, ejemplo de ello que los vértices pueden representar ciudades y
los enlaces vuelos aéreos entre ciudades.
Un enlace es un par ordenado de vértices (v, w), donde v es la cola y w corresponde a la
cabeza del enlace.

Grafo no dirigido:

Sea G un Grafo no Dirigido, donde G=(V,E) y V corresponde al conjunto de vértices y


E al conjunto de aristas del grafo.
Un Grafo no Dirigido se diferencia de un Grafo Dirigido debido a que cada arista en E es un
par no ordenado de vértices. Si (v,w) es una arista no dirigida è(v,w) = (w,v).

CARACTERIZACIÓN DE GRAFOS:

Grafos Simples:

Un grafo es simple si a lo más sólo 1 arista une dos vértices cualesquiera. Esto es
equivalente a decir que una arista cualquiera es el único que une dos vértices específicos.

Un grafo que no es simple se denomina complejo.

Grafos Conexos

Un grafo es conexo si cada par de vértices está conectado por un camino; es decir, si
para cualquier par de vértices (a, b), existe al menos un camino posible desde a hacia b.

Un grafo es fuertemente conexo si cada par de vértices está conectado por al menos
dos caminos disjuntos; es decir, es conexo y no existe un vértice tal que al sacarlo el grafo
resultante sea disconexo.

Grafos completos:

Un grafo simple es completo si existen aristas uniendo todos los pares posibles de
vértices. Es decir, todo par de vértices (a, b) debe tener una arista e que los une.

El conjunto de los grafos completos es denominado usualmente , siendo el


grafo completo de n vértices.

Un Kn, es decir, grafo completo de n vértices tiene exactamente aristas.

La representación gráfica de los Kn como los vértices de un polígono regular da cuenta


de su peculiar estructura.

Grafos bipartidos

Un grafo G es bipartito si puede expresarse como (es decir, la


unión de dos grupos de vértices), bajo las siguientes condiciones:

● V1 y V2 son disjuntos y no vacíos.


● Cada arista de A une un vértice de V1 con uno de V2.
● No existen aristas uniendo dos elementos de V1; análogamente para V2.

Bajo estas condiciones, el grafo se considera bipartito, y puede describirse


informalmente como el grafo que une o relaciona dos conjuntos de elementos diferentes,
como aquellos resultantes de los ejercicios y puzzles en los que debe unirse un elemento de
la columna A con un elemento de la columna B.

Grafos ponderados:

En muchos casos, es preciso atribuir a cada arista un número específico, llamado


evaluación, ponderación o coste según el contexto, y se obtiene así un grafo valuado.
Formalmente, es un grafo con una función v: A → R+.

Por ejemplo, un representante comercial tiene que visitar n ciudades conectadas


entre sí por carreteras; su interés previsible será minimizar la distancia recorrida (o el
tiempo, si se pueden prever atascos). El grafo correspondiente tendrá como vértices las
ciudades, como aristas las carreteras y la valuación será la distancia entre ellas.
Y, de momento, no se conocen métodos generales para hallar un ciclo de valuación mínima,
pero sí para los caminos desde a hasta b, sin más condición.

REPRESENTACIÓN DE LOS GRAFOS

1. Matriz de Adyacencia (MA):

Se utiliza una matriz de tamaño n × n donde las filas y las columnas hacen referencia
a los vértices para almacenar en cada casilla la longitud entre cada par de vértices del grafo.
La celda MA[i, j] almacena la longitud entre el vértice i y el vértice j. Si su valor es infinito
significa que no existe arista entre esos vértices, y MA[i, i] = 0.
2. Lista Adyacente (LA):

Se utiliza un vector de tamaño n (un elemento por cada vértice) donde LA[i] almacena
la referencia a una lista de los vértices adyacentes a i. En una red está lista almacenará
también la longitud de la arista que va desde i al vértice adyacente.

RECORRIDO DE GRAFOS
Recorrido (o búsqueda) en amplitud o anchura: (breadth-first search): Se visita a
todos los vecinos directos del nodo inicial, luego a los vecinos de los vecinos.
3. Aplicaciones reales

- Un ejemplo seria en las redes sociales. En una red social virtual como Facebook o
Twitter estas relaciones son muy claramente representadas por medio de los
“amigos o seguidores” siendo cada individuo un nodo y las relaciones sociales
virtuales que los une las aristas.

- Otro Ejemplo podría ser el análisis de la estructura de un “salón de clase”. En el aula,


cada alumno es un nodo y las aristas son los vínculos que tienen en común
recíprocos al pertenecer todos a la misma clase. Si bien algunos vínculos entre cada
nodo (individuo) serán más fuertes que otros porque todos poseen como arista que
los une pertenecer a la misma clase.
4. Pseudocódigo

4.1 Clase Grafo

class Graph (object):

def __init__(self):
self.nodes = set()
self.edges = defaultdict(list)
self.distances = {}

def add_node(self, value):


self.nodes.add(value)

def add_edge(self, from_node, to_node, distance):


self.edges[from_node].append(to_node)
self.edges[to_node].append(from_node)
self.distances[(from_node, to_node)] = distance
4.2 Algoritmo de recorridos (depth and breadth)

Una Búsqueda en profundidad es un algoritmo que 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 más nodos que visitar en dicho
camino, regresa, de modo que repite el mismo proceso con cada uno de los hermanos del
nodo ya procesado.

Pseudocódigo
DFS(grafo G)
PARA CADA vértice u ∈ V[G] HACER
estado[u] ← NO_VISITADO
padre[u] ← NULO
tiempo ← 0
PARA CADA vértice 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

Una Búsqueda en Anchura es un algoritmo que recorrer un grafo por niveles, es


decir, partiendo de un nodo inicial recorro todos sus vecinos, posteriormente los vecinos de
los vecinos hasta que todos los nodos hayan sido visitados.
Pseudocódigo

1 método BFS(Grafo,origen):
2 creamos una cola Q
3 agregamos origen a la cola Q
4 marcamos origen como visitado
5 mientras Q no este vacío:
6 sacamos un elemento de la cola Q llamado v
7 para cada vértice w adyacente a v en el Grafo:
8 si w no ha sido visitado:
9 marcamos como visitado w
10 insertamos w dentro de la cola Q
4.3 Algoritmo para hallar la ruta más corta (shortest path)

El modelo de Ruta más corta consiste en una red donde cada arco (i,j), posee un cij,
que representa la distancia (diferente de cero) que existe del nodo i al nodo j.(Eppen, 2000).
En resumen el Problema de la Ruta más corta está dado entre un punto origen y un punto
destino (Taha, 2012) (Nagih Soumis, 2005).

La forma general de desarrollar el Algoritmo de la Ruta más corta es primero


encontrar el nodo más cercano al origen, y hacer esto repetitivamente hasta que se llegue al
nodo destino; luego de haber realizado todas las interacciones, se debe registrar los datos
de la distancia, en la trayectoria dada desde el nodo origen hasta el nodo destino (Izar
Landieta, 1996) (Zhan, 1997)
Pseudocódigo

1 método Dijkstra(Grafo,origen):
2 creamos una cola de prioridad Q
3 agregamos origen a la cola de prioridad Q
4 mientras Q no esté vacío:
5 sacamos un elemento de la cola Q llamado u
6 si u ya fue visitado continuó sacando elementos de Q
7 marcamos como visitado u
8 para cada vértice v adyacente a u en el Grafo:
9 sea w el peso entre vértices ( u , v )
10 si v no ha sido visitado:
11 Relación( u , v , w )
5 Código en Python

Búsqueda en profundidad

def profundidad(self,eleccion):
visitados=[]
pila=[]
imprimir=[]
pila.append(eleccion)
visitados.append(eleccion)
if eleccion in self.grafo:
while pila:
x = pila[-1]
print "Pila:",pila
imprimir.append(x)
pila.remove(pila[-1])
for key,nada in self.grafo[x]:
if key not in visitados:
visitados.append(key)
pila.append(key)
print "=========Resultados========="
print "Visitados:",visitados
print "Imprimir:",imprimir
print "Pila:",pila
os.system("pause")
else:
print "No existe"
os.system("pause")

Búsqueda en anchura

def anchura(self,eleccion):

visitados=[]

cola=[]

imprimir=[]

cola.append(eleccion)

visitados.append(eleccion)

if eleccion in self.grafo:

while cola:
x = cola[0]

print "Cola:",cola

imprimir.append(x)

cola.pop(0)

for key,nada in self.grafo[x]:

if key not in visitados:

visitados.append(key)

cola.append(key)

print "=========Resultados========="

print "Visitados:",visitados

print "Imprimir:",imprimir

print "Cola:",cola

os.system("pause")

else:

print "No existe"

os.system("pause")

El camino más corto:

def shortest_path(graph, origin, destination):


visited, paths = dijkstra(graph, origin)
full_path = deque()
_destination = paths[destination]

while _destination != origin:


full_path.appendleft(_destination)
_destination = paths[_destination]

full_path.appendleft(origin)
full_path.append(destination)

return visited[destination], list(full_path)

Conclusiones

La teoría de grafos es un instrumento utilizado en la aplicación de estos métodos,


permitiéndonos evaluar las relaciones entre los puntos del espacio conectados por la red,
buscando medir su influencia sobre la conformación del sistema territorial.
El análisis de grafos permite medir propiedades territoriales como la conexión de la
red, la conectividad e indicadores de homogeneidad e isotropía. Los indicadores más
utilizados son diferentes expresiones de la accesibilidad.

La teoría de grafos sirve como un modelo matemático para estructuras en cualquier


campo , pero una de las más importante en las áreas de ciencias de la computación .

Bibliografía

❖ J.A. Luis. Fundamentos de programación: “Algoritmo y estructura de datos”


McGRAW-HILL ESPAÑA 1999. Segunda Edición.

❖ S.D Robert. Algoritmos en C++ Reading Massachusetts EE.UU 1992.

❖ Trudeau, Richard J. (1993). Dover Pub., ed. Introduction to Graph Theory (Edición
corregida y aumentada.).

❖ Grafos https://www.uam.es/personal_pdi/ciencias/gallardo/capitulo8a.pdf

Vous aimerez peut-être aussi