Está en la página 1de 12

Tecnología Computacional

y Estructura de Datos
Unidad IV

Grafos
En matemáticas y en ciencias de la computación, la teoría de grafos (también
llamada teoría de las gráficas) estudia las propiedades de los grafos. Un grafo
es un conjunto, no vacío, de objetos llamados nodos (o vértices) conectados
por líneas llamadas aristas (edges en inglés) que representan una relación
binaria entre (obviamente…) dos nodos.
El primer artículo científico en donde se los menciona fue escrito por el suizo
Leonhard Euler en 1736, para resolver el problema de los puentes de
Königsberg.
Muchas redes de uso cotidiano pueden ser modeladas con un grafo: una red
de carreteras que conecta ciudades, una red eléctrica, la red de drenaje de una
ciudad, las interconexiones en una red de computadoras, etc.

Formalización
Un grafo es una pareja de conjuntos G=(V , A) donde V representa el
conjunto de vértices y A representa el conjunto de aristas, este último es un
conjunto de pares de la forma (a, b) tal que a , b∈V , tal que a≠b . Para
simplificar la notación, la arista (a, b) se formalizará como ab.

En la figura, V = { a, b, c, d, e, f }, y A = { ab, ac, ae, bc, bd, df, ef }.


En teoría de grafos, sólo queda lo esencial del dibujo: la forma de las aristas
no es relevante, sólo importa a qué vértices están unidas. La posición de los
vértices tampoco importa, y se puede variar para obtener un dibujo más
claro.

1/12 RMS
Tecnología Computacional y Estructura de Datos

Definiciones:
Subgrafo: grafo que es subconjunto de otro grafo.
Orden: el número de vértices o nodos
Grado: cantidad de aristas que llegan a un nodo.
Bucle: arista con origen y destino en el mismo nodo. A efectos del grado se
cuenta doble.
Aristas adyacentes: son aquellas que inciden en un mismo nodo.
Aristas paralelas: son aquellas que tienen el mismo nodo de origen y destino
pero representan relaciones binarias distintas
Camino: sucesión de aristas que comunican dos vértices cualesquiera.
Ciclo: es una sucesión de aristas adyacentes, donde no se recorre dos veces
la misma arista, y donde se regresa al punto inicial.
Ciclo hamiltoniano: es un ciclo que recorre todos los vértices exactamente
una vez (excepto el vértice del que parte y al cual llega).
Grafo simple: Es el grafo que no contiene ciclos, es decir, lineas que unan un
punto consigo mismo, ni aristas paralelas.
Grafo dirigido o digrafo: Es el grafo que indica un sentido de recorrido de
cada linea mediante una flecha. Dicho de otro modo, es un grafo donde las
relaciones binarias no son reflexivas (constituyen pares ordenados).

Propiedades:
Adyacencia: dos aristas son adyacentes si tienen un vértice en común, y dos
vértices son adyacentes si una arista los une.
Incidencia: una arista es incidente a un vértice si ésta lo une a otro vértice.
Ponderación: valor asignado a una arista.
Etiquetado: Distinción única que se hace a los vértices y/o aristas.

Clasificación de grafos:
Grafo plano: se puede representar sin cruces entre aristas.
Grafo regular: cuando todos sus nodos tienen el mismo grado.
Multigrafo: si tiene aristas paralelas
Pseudografo: si tiene ciclos.

2/12
Tecnología Computacional y Estructura de Datos

Grafo conectado o conexo. si todo par de vértices está conectado por al


menos un camino; es decir, si para cualquier par de vértices (a, b), existe al
menos un camino posible desde a hacia b.
Grafo 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.
Grafo Dirigido: formado por un conjunto de aristas en forma de pares
ordenados donde (i,j) # (j,i).
Grafo no dirigido: no importa el orden del par.
Grafo etiquetado: cuando la arista lleva asociada un nombre.
Grafo ponderado: cuando la arista lleva asociado un valor numérico.
Red: cuando cada arista tiene asociado un coste (en adelante longitud)
Grafo Acíclico: tiene todos caminos simples.
Árbol: grafo que no tiene ciclos y que conecta a todos los puntos. Es acíclico
y conexo.

Representación de grafos mediante estructuras de datos


Existen diferentes formas de almacenar grafos en una computadora. La
estructura de datos usada depende de las características del grafo y el
algoritmo usado para manipularlo. Entre las estructuras más sencillas y usadas
se encuentran las listas y las matrices, aunque frecuentemente se usa una
combinación de ambas. Las listas son preferidas en grafos dispersos porque
tienen un eficiente uso de la memoria. Por otro lado, las matrices proveen
acceso rápido, pero pueden consumir grandes cantidades de memoria.

Estructuras matriciales
Matriz de incidencias - El grafo está representado por una matriz de A
(aristas) por V (vértices), donde [arista, vértice] contiene la información de la
arista (1 - conectado, 0 - no conectado)
Matriz de adyacencias - El grafo está representado por una matriz cuadrada
M de tamaño n2 donde n es el número de vértices. Si hay una arista entre un
vértice x y un vértice y, entonces el elemento mx,y es 1 de lo contrario, es 0.
Veamos un ejemplo. Para el grafo:

3/12
Tecnología Computacional y Estructura de Datos

Matriz de incidencias en PSeInt:


El objetivo es cargar la siguiente matriz:

Aristas
nodo 1 2 3 4
s
1 1 1 1 0

2 1 0 0 0

3 0 1 0 1

4 0 0 1 1

// Desactivar en Opciones del lenguaje - Personalizar :


// "Utilizar índices en arreglos y cadenas en base 0"
// para que el primer valor del índice sea 1
Funcion cargaArista(M, arista, nodoI, nodoF)
M[nodoI,arista] = 1
M[nodoF,arista] = 1
FinFuncion

Algoritmo matrizIncidencias
Dimension M[4,4]
cargaArista(M,1,1,2)
cargaArista(M,2,1,3)
cargaArista(M,3,1,4)
cargaArista(M,4,3,4)

mostrar( " Arista 1 2 3 4 ")


Para Nodo <- 1 Hasta 4 Hacer
Mostrar "Nodo ", Nodo, ": |" Sin Saltar
Para Arista <- 1 Hasta 4 Hacer
Mostrar M[Nodo, Arista], " | " Sin Saltar
FinPara
Mostrar ""
FinPara

FinAlgoritmo

Matriz de adyacencias en PSeInt:

4/12
Tecnología Computacional y Estructura de Datos

El objetivo es cargar la siguiente matriz, como el grafo no es dirigido cada


nodo se establece como inicial y final (en filas y columnas), en el caso que
hubiera un bucle se escribe un 1 o un 2 en la diagonal principal:

Nodos final
inicial 1 2 3 4
1 0 1 1 1

2 1 0 0 0

3 1 0 0 1

4 1 0 1 0

Funcion adyacencia(M, nodo1, nodo2)


M[nodo1, nodo2] = 1
M[nodo2, nodo1] = 1
FinFuncion

Algoritmo matrizAdyacencias
Dimension M[4,4]
adyacencia(M,1,2)
adyacencia(M,1,3)
adyacencia(M,1,4)
adyacencia(M,3,4)

mostrar( " Nodos 1 2 3 4 ")


Para NodoI <- 1 Hasta 4 Hacer
Mostrar " ", NodoI, ": |" Sin Saltar
Para NodoF <- 1 Hasta 4 Hacer
Mostrar M[NodoI, NodoF], " | " Sin Saltar
FinPara
Mostrar ""
FinPara

FinAlgoritmo

Estructura de lista
• lista de incidencias - Las aristas son representadas con un vector de pares
(ordenados, si el grafo es dirigido), donde cada par representa una de las
aristas.
• lista de adyacencias - Cada vértice tiene una lista de vértices los cuales son
adyacentes a él. Esto causa redundancia en un grafo no dirigido (ya que A
existe en la lista de adyacencia de B y viceversa), pero las búsquedas son
más rápidas, al costo de almacenamiento extra.

5/12
Tecnología Computacional y Estructura de Datos

En esta estructura de datos la idea es asociar a cada vertice i del grafo una
lista que contenga todos aquellos vértices j que sean adyacentes a él. De esta
forma sólo reservará memoria para los arcos adyacentes a i y no para todos
los posibles arcos que pudieran tener como origen i. El grafo, por tanto, se
representa por medio de un vector de n componentes (si |V|=n) donde cada
componente va a ser una lista de adyacencia correspondiente a cada uno de
los vértices del grafo. Cada elemento de la lista consta de un campo
indicando el vértice adyacente. En caso de que el grafo sea etiquetado, habrá
que añadir un segundo campo para mostrar el valor de la etiqueta.
Veamos un ejemplo. Para el grafo:

Lista de Incidencias en Python:


# coding: utf-8
# Grafo como lista de incidencias
li = [(1,2),(1,3),(1,4),(3,4)]
print( "Lista de Incidencias:" )
for i in li:
print(i)

Lista de adyacencias en Python:

# coding: utf-8
# Grafo como lista de adyacencias
la = [None, 1, 2, 3, 4]
la[1] = [ 2, 3, 4 ]
la[2] = [1]

6/12
Tecnología Computacional y Estructura de Datos

la[3] = [1, 4]
la[4] = [1, 3]

print( "Lista de Adyacencias:" )


for i in (1, 2, 3, 4):
print(i, ":", la[i])

CPM (Critical Path Method) o Método del Camino Crítico.


El objetivo principal de CPM es determinar la duración de un proyecto,
entendiendo éste como una secuencia de actividades relacionadas entre sí,
donde cada una de las actividades tiene una duración estimada.
En este sentido el principal supuesto de CPM es que las actividades y sus
tiempos de duración son conocidos, es decir, no existe incertidumbre. Este
supuesto simplificador hace que esta metodología sea fácil de utilizar y en la
medida que se quiera ver el impacto de la incertidumbre en la duración de un
proyecto, se puede utilizar un método complementario como lo es PERT.
Una ruta es una trayectoria desde el inicio hasta el final de un proyecto. En
este sentido, la longitud de la ruta crítica es igual a la la trayectoria más grande
del proyecto. Cabe destacar que la duración de un proyecto es igual a la ruta
crítica.
Para utilizar el método CPM o de Ruta Crítica se necesita seguir los
siguientes pasos:
1. Definir el proyecto identificando actividades o partes principales.
2. Establecer relaciones entre las actividades. Decidir cuál debe comenzar
antes y cuál debe seguir después.
3. Dibujar un diagrama conectando las diferentes actividades en base a sus
relaciones de precedencia.
4. Definir costos y tiempo estimado para cada actividad.
5. Identificar la trayectoria más larga del proyecto, siendo ésta la que
determinará la duración del proyecto (Ruta Crítica).
6. Utilizar el diagrama como ayuda para planear, supervisar y controlar el
proyecto.
Por simplicidad y para facilitar la representación de cada actividad,
frecuentemente se utiliza la siguiente notación:

7/12
Tecnología Computacional y Estructura de Datos

Donde:
• IC : Inicio más cercano, es decir, lo más pronto que puede comenzar la
actividad.
• TC : Término más cercano, es decir, lo más pronto que puede terminar la
actividad.
• IL : Inicio más lejano, es decir, lo más tarde que puede comenzar la actividad
sin retrasar el término del proyecto.
• TL : Término más lejano, es decir, lo más tarde que puede terminar la
actividad sin retrasar el término del proyecto.
Adicionalmente se define el término Holgura para cada actividad que
consiste en el tiempo máximo que se puede retrasar el comienzo de una
actividad sin que esto retrase la finalización del proyecto.
La holgura (indicado con la letra S) de una actividad se puede obtener con
cualquiera de los siguientes cálculos:
S = IL - IC = TL – TC
EJEMPLO: A continuación se presenta un resumen de las actividades que
requiere un proyecto para completarse. El tiempo de duración de cada
actividad en semanas es fijo. Se solicita que estime la duración total del
proyecto a través del método CPM.

Actividad Duración (sem) Actividad Antecesora


A 6 -
B 8 -
C 12 A,B
D 4 C
E 6 C
F 15 D,E
G 12 E
H 8 F,G

8/12
Tecnología Computacional y Estructura de Datos

En consideración a las etapas del método CPM definidas anteriormente, en


este caso se debe desarrollar el paso 3 y 5. En este sentido es necesario
construir el diagrama identificando las relaciones entre las actividades y con el
objetivo de resumir la metodología se incorporará inmediatamente el cálculo de
la Holgura, IC, TC, IL, TL para cada actividad, junto con la identificación de la
ruta crítica.
Las actividades con holgura igual a cero corresponden a las actividades del
camino crítico, teniendo en consideración que un proyecto puede tener más
de un camino crítico.

Para elaborar el gráfico se puede optar por indicar una tarea ficticia para
representar un único punto de inicio, ya que existen realmente dos comienzos.
Este paso es opcional.
Luego se representan las dos tareas iniciales A y B que confluyen en la tarea
C, y así sucesivamente con todos los nodos del grafo y sus aristas.
El siguiente paso es comenzar por asignar en la parte superior de cada nodo
el inicio temprano y el término cercano de cada tarea, siendo 0 y 6 para el nodo
A, 0 y 8 para el nodo B. Luego se calcula el inicio temprano del nodo C
tomando como referencia el mayor Termino Cercano de todos sus nodos
padres que en este caso es el 8 perteneciente a B. Los nodos D y E toman el
final temprano del nodo C que es el antecesor y que en este caso es 20 (8+12).
De la misma forma, tomando como IC el TC mayor de todos los nodos padres,
se va completando el grafo hasta el final.

9/12
Tecnología Computacional y Estructura de Datos

A continuación se completan los valores de IL y TL del nodo final con los


mismos valores que IC y TC, Luego se retrocede desde el nodo final (H en este
caso) que tiene un IL de 41 y un TL de 49, completando los terminos lejanos
(TL) de los nodos anteriores tomando siempre como TL el menor valor de los
IL de todos sus nodos hijos, restando el tiempo del nodo para obtener los IL
correspondientes.
Comenzando con el proceso final, se calculan los tiempos de holgura de cada
nodo con cualquiera de las fórmulas indicadas anteriormente (IL-IC o TL-TC).
Por último resaltamos el camino que comunica los nodos con holgura igual a 0
es el camino denominado Camino Crítico.
Veamos otro ejemplo:
En una empresa mecánica se debe realizar una tarea compuesta por varias
actividades simples, cada actividad las puede hacer un sólo operario y
cualquier operario de la empresa está capacitado para hacerlas.

Actividad Descripción Tarea Anterior Tiempo (hs)


A Sacar y desarmar el motor – 1
B Limpiar y pintar base A 2
C Rebobinar la armadura A 4
D Reemplazar anillos A 1
E Ensamblar e instalar el motor en la base B, C, D 3
F Prueba de Funcionamiento E 1

El objetivo del análisis sería evaluar cual es el tiempo total de la tarea hasta
concluir con la prueba de funcionamiento como para decirle al cliente cuando
debe retirarlo y además, pensando en optimizar el tiempo y los recursos:
¿Cuantos operarios como mínimo se requieren para realizar toda la tarea sin
que haya retrasos?
Primero nos concentraremos en desarrollar el grafo CPM:

Conclusiones:

10/12
Tecnología Computacional y Estructura de Datos

Se observa que la secuencia: sacar y desarmar el motor – rebobinar


armadura - ensamblar e instalar el motor en la base - prueba de
funcionamiento son las actividades que forman parte del camino crítico, por lo
tanto no sería aconsejable que haya un retraso en esa secuencia. Lo que
configura el tiempo total que en este caso son 9 horas.
Las tareas B y D se deben realizar en paralelo con la actividad C, por lo cual
requerían de 2 operarios que trabajen cada uno en cada tarea, pero como
existe una holgura suficiente, las tareas B y D se pueden hacer en secuencia
por el mismo operario sin exceder el tiempo de holgura de ambos, incluso
sobraría una hora.
Además como la tarea total suma 9 horas que es una hora más del tiempo
neto de trabajo máximo estandar (8 horas laborales) se podría armar la
secuencia de esta forma:
El primer operario se encarga de las tareas A, B y D. Al finalizar esta tarea
nos queda libre media jornada laboral para que se ocupe de otra cosa.
El segundo operario arranca una hora más tarde desde la tarea C en paralelo
con el otro operario y continúa con las tareas E y F completando la tarea total
dentro de sus 8 horas laborales.

11/12
Tecnología Computacional y Estructura de Datos

Información adicional
• Wikipedia: Problema de los puentes de Königsberg
https://es.wikipedia.org/wiki/Problema_de_los_puentes_de_K%C3%B6nigsberg
• TUTORIAL RUTA CRÍTICA, diagrama de red y cálculo de holguras | CPM en 10
minutos: https://www.youtube.com/watch?v=W42iXCU8hjk
• Camino Critico (CPM): https://www.youtube.com/watch?v=2M3J63evb2k

12/12

También podría gustarte