Sunteți pe pagina 1din 12

TRABAJO FINAL: GRAFOS DIRIGIDOS

INGENERIA DE SISTEMA

ESTRUCTURA DE DATOS

SEMESTRE III
Concepto y Aplicaciones.
Concepto.
La teoría de grafos es una disciplina antigua con muchas aplicaciones modernas.
Sus ideas básicas las introdujo el gran matemático suizo Leonhard Euler en el siglo
XVIII. Euler utilizo los grafos para resolver el famoso problema de los puentes de
Königsberg. Los grafos se emplean para resolver problemas de diversas ´áreas.
Pueden utilizarse, por ejemplo, para determinar si se puede o no implementar un
circuito sobre una placa de una sola capa, para estudiar la estructura de una red de
internet, para determinar si dos ordenadores están conectados o no dentro de una
red informática, para hallar el camino más corto entre dos ciudades en una red de
transportes, ... El primer trabajo sobre la teoría de grafos aparece en 1736 y fue
escrito por el matemático Leonhard Euler (1700-1783). Este trabajo comienza con
la discusión de un problema surgido en la ciudad de Königsberg (ahora
Kaliningrado, Rusia). La ciudad estaba dividida en cuatro partes por los dos brazos
en los que se bifurca el río Pregel. Estas cuatro partes eran las dos regiones a orillas
del río Pregel, la isla de Kneiphof y la región que quedaba entre ambos brazos del
río. Siete puentes conectaban entre sí estas regiones en el Siglo XVII. La figura
siguiente ilustra las regiones y los puentes.

Los habitantes se preguntaban: ¿Es posible recorrer los siete puentes pasando por
todos ellos una única vez, partiendo y llegando al mismo sitio? Para tratar de
resolver el problema, conocido como Problema de los puentes de Königsberg, Euler
representó esquemáticamente las ´áreas de tierra por puntos y los puentes por
líneas conectando esos puntos. El resultado constituye un ejemplo de grafo:

De la obtención de algunas propiedades básicas de grafos, Euler dedujo que no era


posible recorrer todos los puentes una sola vez.
Aplicaciones.
Gracias a la teoría de grafos se pueden resolver diversos problemas como por
ejemplo la síntesis de circuitos secuenciales, contadores o sistemas de apertura. Se
utiliza para diferentes áreas por ejemplo, Dibujo computacional, en toda las áreas
de Ingeniería. Los grafos se utilizan también para modelar trayectos como el de una
línea de autobús a través de las calles de una ciudad, en el que podemos obtener
caminos óptimos para el trayecto aplicando diversos algoritmos como puede ser el
algoritmo de Floyd. Para la administración de proyectos, utilizamos técnicas como
PERT en las que se modelan los mismos utilizando grafos y optimizando los tiempos
para concretar los mismos. La teoría de grafos también ha servido de inspiración
para las ciencias sociales, en especial para desarrollar un concepto no metafórico
de red social que sustituye los nodos por los actores sociales y verifica la posición,
centralidad e importancia de cada actor dentro de la red. Esta medida permite
cuantificar y abstraer relaciones complejas, de manera que la estructura social
puede representarse gráficamente. Por ejemplo, una red social puede representar
la estructura de poder dentro de una sociedad al identificar los vínculos (aristas), su
dirección e intensidad y da idea de la manera en que el poder se transmite y a
quiénes. Los grafos son importantes en el estudio de la biología y hábitat. El vértice
representa un hábitat y las aristas (o "edges" en inglés) representa los senderos de
los animales o las migraciones. Con esta información, los científicos pueden
entender cómo esto puede cambiar o afectar a las especies en su hábitat.

Grafos dirigidos y no dirigidos


Definición:
Un grafo (grafo no dirigido) G consta de un conjunto V de vértices o nodos y un
conjunto E de lados, (ramas o aristas) tales que cada lado e E esta asociado a un
par no ordenado de vértices.
Si un lado e esta asociado a un único par de vértices v y w se escribe e = (v, w) o
también se escribe e = (w, v).
NOTA:
En este contexto (v, w) denota un lado de un grafo no dirigido y no un par ordenado
de números.
Definición:
Un grafo dirigido (o dígrafo) G consta de un conjunto V de vértices y un
conjunto E de lados, tal que e E esta asociado a un par ordenado único de
vértices v y w y se escribe e = (v, w).

Definición:
Se dice que un lado e = (v, w) de un grafo (dirigido o no dirigido) es incidente
en v y w. Se dice que los vértices v y w son incidentes en e y también que los
vértices son adyacentes.
Si G es un grafo (dirigido o no dirigido) con un conjunto de vértices V y un conjunto
de lados E, se escribe G = (V, E).

Ejemplo:

G
Este grafo G consta de un conjunto V de vértices
V = {S, T, U, V, W, X, Y, Z}
y el conjunto de lados
E = {e1, e2, e3, .... , e11 }.

El lado e1 esta asociado con el par no ordenado {T, U}, el lado e10 esta asociado
al par no ordenado {S, X}. El lado e1 se denota por (U, T) o bien (T, U). El lado e4
es incidente en los vértices Y y Z por lo que Y y Z son vértices adyacentes.
Ejemplo:

G
En este dígrafo los lados dirigidos están indicados por flechas. El lado e 1 esta
asociado al par ordenado de vértices (v2 , v1) por lo que se escribe e1 = (v2 , v1) y el
lado e7 con el par ordenado (v6, v6), por lo que se escribe e7 = (v6, v6).
Grado entrante de un vértice.
El grado entrante de un vértice es el número de aristas que llegan al vértice.

Ejemplo: el vértice 3 del grafo G3 de la figura, tiene grado entrante 4 y en el grafo


G1 de la misma figura, el grado entrante del vértice 3 es 1.

Grado saliente de un vértice.

El grado saliente de un vértice corresponde al número de aristas que salen del


vértice.

Ejemplo: en G3 de la figura el vértice 3 tiene grado saliente igual a 4. Ahora, en G1


de la figura el vértice 1 tiene grado 2.

Grado de un vértice.

Se llama grado de un vértice v al número de aristas que lo tienen como extremo,


(cada bucle lo cuenta dos veces). Se designa por d(v) y corresponde al número de
aristas incidentes sobre el vértice v. Un vértice aislado tiene grado cero.
En los grafos dirigidos el grado total de un vértice es la suma del grado entrante más
el grado saliente. En los grafos no dirigidos, el grado total de un vértice es igual al
número de aristas que tiene el vértice. Por lo tanto, la suma de los grados de los
vértices es igual al doble de las aristas del grafo. Compruébalo con varios ejemplos.

Ejemplo: de la figura, el vértice a tiene grado total igual a 3; vértice b, grado 3; vértice
c, grado 2; vértice d, grado 1; vértice e, grado 1.
Bucle o Lazo.
es una secuencia que ejecuta repetidas veces un trozo de código, hasta que la
condición asignada a dicho bucle deja de cumplirse. Los tres bucles más utilizados
en programación son el bucle while, el bucle for y el bucle do-while.
El bucle for o ciclo for
es una estructura de control en programación en la que se puede indicar de
antemano el número mínimo de iteraciones que la instrucción realizará. Está
disponible en casi todos los lenguajes de programación imperativos.
“Variable de control': prácticamente un mandato impuesto por el uso habitual es
utilizar la letra i Iterador como variable de control, o bien sus sucesoras en caso de
bucles anidados.
El bucle while o bucle mientras
es un ciclo repetitivo basado en los resultados de una
expresión lógica, se encuentra en la mayoría de
la programación estructurados. El propósito es repetir
un bloque de código mientras una condición se mantenga
verdadera.
El bucle do, bucle hacer
hacer-mientras o también llamado ciclo do-while, es
una estructura de control de la mayoría de los lenguajes de
programación estructurados cuyo propósito es ejecutar un bloque
de código y repetir la ejecución mientras se cumpla cierta condición
expresada en la cláusula while. La diferencia con el bucle while
radica en que este evalúa la condición al principio, y si esta no se
cumple, el código que está encerrado dentro del cuerpo no se
ejecuta. En cambio, el bucle do-while evalúa la condición para
seguir ejecutándose luego de haber ejecutado el código dentro de
su cuerpo; es decir, siempre se ejecuta por lo menos una vez el
código.
Algoritmo de Dijkstra y Ford
Algoritmo de Dijkstra:
El Algoritmo de Dijkstra se controlará desde el panel situado en la parte izquierda
del applet. En la siguiente figura se muestra cómo se comporta el panel cuando
estamos editando un algoritmo (parte izquierda de la figura) y cuando estamos
trazando un algoritmo (parte derecha de la figura).

Una vez introducido el grafo en el panel de edición de grafos, tenemos dos


posibilidades: la primera sería encontrar el camino mínimo entre dos vértices, que
se conseguiría pulsando el botón etiquetado “Calcular”. El resultado dentro del panel
de edición de grafos podría ser el siguiente:
En este el nodo número seis es el origen y el nodo número cinco el destino.

En cambio, si lo que deseamos es trazar el algoritmo para este mismo grafo,


debemos pulsar el botón etiquetado “Trazar” con lo que el aspecto del panel donde
reside este botón cambiará al mostrado en la figura Figura., eliminándose el panel
donde modificamos los datos de los nodos y los vértices.
En la parte superior se muestran todos los nodos del grafo que dinámicamente
cambiarán de color. El significado de los colores es el siguiente:

Representará el nodo actual en el Algoritmo de Dijkstra. En cada paso del


algoritmo solamente habrá un nodo de estas características.

Representa que el nodo se encuentra dentro de los nodos alcanzados y que


es un candidato a ser el nodo alcanzado si su distancia estimada es la menor
de todos los nodos que también están alcanzados.

Representa que el nodo no ha sido tratado.

Sobre cada nodo se representa la distancia estimada para este en cada iteración.
Este panel contiene una barra de scroll que para desplazar el área que ocupan los
nodos.
Por su parte el panel de edición de algoritmos podría tener el siguiente aspecto:
donde los colores de los nodos tienen el mismo significado que el representado por
la tabla anterior.
Los arcos de color azul representan los caminos mínimos desde el origen a cada
uno de los nodos. Los arcos de color verde representan el camino desde el nodo
origen al nodo que en ese momento es el nodo actual.
En el panel del Algoritmo de Dijkstra en la parte inferior existen cuatro
seleccionables que sirven para mostrar u ocultar, en el panel de edición de
algoritmos, los elementos anteriormente comentados.
Por último, hacer notar que, cuando estamos trazando un algoritmo, las fichas del
resto de los algoritmos (parte superior del panel) se encuentran desactivadas, y no
podemos pasar a otro algoritmo hasta que el que esté en curso no finalice, mediante
el botón “Terminar” en la barra de herramientas.

Algoritmo de Bellman-Ford (camino mínimo)


Soluciona el problema de la ruta más corta o camino mínimo desde un nodo origen,
de un modo más general que el Algoritmo de Dijkstra, ya que permite valores
negativos en los arcos.

El algoritmo devuelve un valor booleano si encuentra un circuito o lazo de peso


negativo. En caso contrario calcula y devuelve el camino mínimo con su coste. Para
cada vértice v perteneciente a V, se mantiene el atributo d[v] como cota superior o
coste del camino mínimo desde el origen s al vértice v. A continuación se muestra
el pseudocódigo del algoritmo:

Bellman-Ford (G,s)

Inicializar

for cada v perteneciente a V[G]

do d[v] = infinito

p[v] = nulo

p[s] = 0
for i=1 to V[G]-1

do for cada arco (u,v) perteneciente a A[G]

Relajación

if d[v] > d[u] + w(u,v) then

d[v] = d[u] + w(u,v)

p(v) = u

for cada arco (u,v) chequea lazo de peso negativo

do if d[v] > d[u] + w(u,v) then

return FALSO 'el algoritmo no converge

return VERDADERO

algoritmo de Bellman-Ford (camino máximo)


El problema de la ruta más larga puede ser transformado en el de ruta más corta
cambiando el signo de los costes de los arcos. De manera alternativa se puede
transformar también cambiando los procesos de inicialización y relajación. En este
caso el problema es inconsistente para circuitos de peso positivo.

Inicializar

for cada v perteneciente a V[G]

do d[v] = - infinito

p[v] = nulo

p[s] = 0

Relajación

if d[v] < d[u] + w(u,v) then

d[v] = d[u] + w(u,v)

p(v) = u
Puede encontrar más información en:

▪ Richard E. Bellman
▪ L. R. Ford Jr.
▪ Delbert Ray Fulkerson prize
▪ Bellman, R. E., On a routing problem, quarterly of Applied Mathematics, 16,
87-90, 1958.
▪ Ford, L. R.Jr., Network Flow Theory, Paper P-923, RAND Corporation, Santa
Monica, California, 1956.
ejemplo de camino mínimo

El proceso de utilización y la interpretación de los resultados es exactamente la


misma que en el caso del algoritmo de Dijkstra. Tras construir el grafo, se de
seleccionar un nodo origen y un nodo destino antes de ejecutar el algoritmo. Los
resultados deberían ser los mismos que en el caso del algoritmo de Dijkstra, pero
puede ocurrir que el grafo tenga varias soluciones óptimas y que cada uno de estos
algoritmos muestre una de ellas.

En el ejemplo sencillo utilizado anteriormente, ambas soluciones coinciden en el


mismo camino de mínimo coste 7 unidades.
Arcos calculados desde el nodo origen (0) hasta el nodo destino (4):

* 0 ----(5)---> 3

* 3 ----(2)---> 4

Coste total = 7

Matriz de Arcos con coste mínimo:

N1\N2 0 1 2 3 4

0 0 0 0 1 0

1 0 0 0 0 0

2 0 0 0 0 0

3 0 0 0 0 1

4 0 0 0 0 0

S-ar putea să vă placă și