Vous êtes sur la page 1sur 8

TECNOLOGICO DE ESTUDIOS SUPERIORES DE ECATEPEC

DIVISIN DE INGENIERA EN SISTEMAS COMPUTACIONALES

TEMA
Arboles de expansin y sus algoritmos

PROFESOR
Adolfo Melndez Ramrez

ALUMNA
Islas Lpez Sandy Paulina

MATERIA
Teora de las telecomunicaciones

GRUPO
5503

rbol de expansin
Un rbol es una grfica en la cual no existen ciclos. Un rbol de expansin es aquel rbol que
enlaza todos los nodos de la red, de igual manera no permite la existencia de ciclos.
Dado un grafo conexo, no dirigido G. Un rbol de
expansin es un rbol compuesto por todos los vrtices
y algunas (posiblemente todas) de las aristas de G. Al
ser creado un rbol no existirn ciclos, adems debe
existir una ruta entre cada par de vrtices.
Un grafo puede tener muchos rboles de expansin,
veamos un ejemplo con el siguiente grafo:
En la imagen se puede observar que el grafo dado
posee 3 rboles de expansin, dichos arboles cumplen
con las propiedades antes mencionadas como son unir todos los vrtices usando algunas aristas.
Figura 1.
rbol de Expansin Mnima
Dado un grafo conexo, no dirigido y con pesos en
las aristas, un rbol de expansin mnima es un
rbol compuesto por todos los vrtices y cuya
suma de sus aristas es la de menor peso. Al
ejemplo anterior le agregamos pesos a sus aristas
y obtenemos los arboles de expansiones ver figura
2.
De la imagen el rbol de expansin mnima sera
el primer rbol de expansin cuyo peso total es 6.
El problema de hallar el rbol de Expansin
Mnima (MST) puede ser resuelto con varios
algoritmos, los ms conocidos con Prim y Kruskal ambos usan tcnicas voraces (greedy).
Figura 2.

Algoritmos
Algoritmo del rbol de expansin mnima
El algoritmo del rbol de expansin mnima es un modelo de optimizacin
en enlazar todos los nodos de la red de forma directa y/o indirecta con
longitud total de los arcos o ramales sea mnima (entindase por longitud
variable segn el contexto operacional de minimizacin, y que puede
distancia o unidad de medida).

de redes que consiste


el objetivo de que la
del arco una cantidad
bien representar una

Sean:
N = {1,2,3,...,n} el conjunto de nodos de la red.
Ck= Conjunto de nodos que se han enlazado de forma permanente en la iteracin k
k= Conjunto de nodos que hacen falta por enlazarse de forma permanente.

Paso 0: Conceptualizacin del algoritmo


Definir los conjuntos C0 = {} y 0 = {N}, es decir que antes del paso 1 no se han enlazado de
forma permanente nodo alguno, y por ende el conjunto que representa a los nodos que hacen falta
por enlazarse de forma permanente es igual a la cantidad de nodos que existen en la red.
Paso 1:
Se debe de escoger de manera arbitraria un nodo en el conjunto 0 llamado i el cual ser el
primer nodo permanente, a continuacin se debe de actualizar el conjunto C1 = {i}, que significa
que al tiempo en que el conjunto C1 gana el elemento i el conjunto 0 pierde el elemento i por
ende ahora ser igual a 1 = N - {i}, adems se debe actualizar el subndice de los conjuntos k,
el cual ahora ser igual a 2.
Paso 2: paso general "k"
Se debe de seleccionar un nodo j del conjunto K-1 ("k-1" es el subndice que indica que se est
haciendo referencia al conjunto de la iteracin inmediatamente anterior) el cual tenga el arco o
ramal con menor longitud con uno de los nodos que se encuentran en el conjunto de nodos de
enlace permanente CK-1. Una vez seleccionado se debe de enlazar de forma permanente lo cual
representa que pasa a formar parte del conjunto de enlaces permanentes y deja de formar parte
del conjunto que todava se debe conectar para lograr la expansin. Al actualizar el algoritmo en
este paso los conjuntos deben de quedar de la siguiente forma:
CK = CK-1 + {j} mientras que K = K-1 - {j}
El paso general que define k que al mismo tiempo representa a las iteraciones debe de ejecutarse
toda vez que el conjunto K no sea vaco, cuando este conjunto sea igual a vaco se tendr el
rbol de expansin mnima.
El entendimiento del algoritmo desde el punto de vista algebraico no es quiz el ms simple, sin
embargo mediante el ejemplo grfico se ver que es un algoritmo muy sencillo de elaborar.

Algoritmo de Kruskal
Como trabaja:
Primeramente ordenaremos las aristas del grafo por su
peso de menor a mayor. Mediante la tcnica greedy
Kruskal intentara unir cada arista siempre y cuando no
se forme un ciclo, ello se realizar mediante Union-Find.
Como hemos ordenado las aristas por peso
comenzaremos con la arista de menor peso, si los
vrtices que contienen dicha arista no estn en la
misma componente conexa entonces los unimos para
formar una sola componente mediante Union(x , y),
para revisar si estn o no en la misma componente
conexa usamos la funcin Same Component(x , y) al
hacer esto estamos evitando que se creen ciclos y que la arista que une dos vrtices siempre sea
la mnima posible.

Algoritmo en Pseudocdigo

1mtodoKruskal(Grafo):
2inicializamosMSTcomovaco
3inicializamosestructurauninfind
4ordenamoslasaristasdelgrafoporpesodemenoramayor.
5para cada arista equeunelosvrticesuyv

6si uyvnoestnenlamismacomponente
7agregamoslaaristaealMST
8realizamoslaunindelascomponentesdeuyv

Algoritmo de Prim
El siguiente algoritmo a considerar es Prim. En este algoritmo comenzamos con cualquier vrtice y
lo tomamos como parte del rbol mnimo. En cada iteracin, buscamos la arista de menor costo
que conecte el rbol mnimo con algn vrtice no utilizado. Una vez que hayamos utilizado todos
los vrtices, el rbol resultante es el mnimo generador. Esto se asemeja mucho a Dijkstra, ya que
en ambos casos buscamos la forma de llegar a los vrtices no utilizados mediante un costo
mnimo.

Algoritmo en Pseudocdigo

En seguida tenemos la funcin Prim (lneas 6 a 31), que es donde calculamos el rbol mnimo
generador. Las variables i y j las utilizamos para los ciclos, el peso de la arista mnima la
guardamos en min y su posicin en p, para el peso total usamos tot y el arreglo vis lo empleamos
para saber cules vrtices ya utilizamos.
Al principio inicializamos todos los no usados, excepto el primero que es desde el cual
generaremos el rbol mnimo; tambin inicializamos el total a cero (lneas 11 y 12). A continuacin
utilizamos un ciclo en el cul agregaremos un vrtice en cada iteracin. Empezamos buscando,
entre los vrtice no utilizados, la arista de menor peso que una al vrtice con el rbol (lneas 15 a
20).
Una vez que lo encontramos, lo marcamos como usado (lnea 21) e incrementamos el peso total
del rbol en el valor de la arista (lnea 22). Proseguimos revisando si con el vrtice que agregamos
existe una arista que conecte con los vrtices que no hemos utilizado y que sea de menor peso
(lneas 23 a 29).

Una vez obtenemos el rbol, devolvemos su peso (lnea 30). Podemos observar como la
implementacin es prcticamente igual a la de Dijkstra, slo que estamos guardando en el arreglo
el peso de arista ms liviana que nos conecta con el vrtice, en lugar de la distancia ms corta.

Algoritmo de la ruta ms corta


El nombre que distingue este conjunto de problemas de por s es bastante sugestivo, existen de
forma manual algoritmos capaces de resolver tanto problemas de redes que presentan ciclos
como de redes que no, entre los ms conocidos se encuentran los algoritmos de Bellman-Ford,
Dijkstra y Floyd-Warshall siendo el segundo ms general que el primero. Sin embargo la
complejidad de los algoritmos, en la prctica la complejidad que alcanzan las redes a ser resueltas
mediante el algoritmo de la ruta ms corta, y las herramientas de resolucin de problemas de
programacin matemtica hacen que la enseanza de dichos algoritmos manuales sea muy
ineficiente.

Algoritmo de Bellman-Ford
Descripcin:
El algoritmo de Bellman-Ford determina la ruta ms corta desde un nodo origen hacia los dems
nodos para ello es requerido como entrada un grafo cuyas aristas posean pesos. La diferencia de
este algoritmo con los dems es que los pesos pueden tener valores negativos ya que BellmanFord me permite detectar la existencia de un ciclo negativo.
Como trabaja:
El algoritmo parte de un vrtice origen que ser ingresado, a diferencia de Dijkstra que utiliza una
tcnica voraz para seleccionar vrtices de menor peso y actualizar sus distancias mediante el paso
de relajacin, Bellman-Ford simplemente relaja todas las aristas y lo hace |V| 1 veces, siendo |V|
el nmero de vrtices del grafo.
Para la deteccin de ciclos negativos realizamos el paso de relajacin una vez ms y si se
obtuvieron mejores resultados es porque existe un ciclo negativo, para verificar porque tenemos
un ciclo podemos seguir relajando las veces que queramos y seguiremos obteniendo mejores
resultados.

Algoritmo en pseudocdigo
Considerar distancia[ i ] como la distancia ms corta del vrtice origen ingresado al vrtice i y |V|
el nmero de vrtices del grafo.
1mtodoBellmanFord(Grafo,origen):
2inicializamoslasdistanciasconunvalorgrande
3distancia[origen]=0
4para i = 1 hasta |V| - 1:
5para cada aristaEdelGrafo:
6sea(u,v)vrticesqueunenlaaristaE
7seawelpesoentrevrtices(u,v)
8Relajacion(u,v,w)
9para cada aristaEdelGrafo:
10sea(u,v)vrticesqueunenlaaristaE
11seawelpesoentrevrtices(u,v)
12siRelajacion(u,v,w)
13ImprimirExisteciclonegativo
15TerminarAlgoritmo

1 Relajacion(actual,adyacente,peso):
2sidistancia[actual]+peso<distancia[adyacente]
3distancia[adyacente]=distancia[actual]+peso

Algoritmo de dijkstra
Descripcin:
El algoritmo de dijkstra determina la ruta ms corta desde un nodo origen hacia los dems nodos
para ello es requerido como entrada un grafo cuyas aristas posean pesos. Algunas
consideraciones:

Si los pesos de mis aristas son de valor 1, entonces bastar con usar el algoritmo.

Si los pesos de mis aristas son negativos no puedo usar el algoritmo de dijkstra, para pesos
negativos tenemos otro algoritmo llamado Algoritmo de Bellmand-Ford.
Como trabaja:
Primero marcamos todos los vrtices como no utilizados.
El algoritmo parte de un vrtice origen que ser
ingresado, a partir de ese vrtices evaluaremos sus
adyacentes, como dijkstra usa una tcnica greedy - La
tcnica greedy utiliza el principio de que para que
un camino sea ptimo, todos los caminos que
contiene tambin deben ser ptimos- entre todos los
vrtices adyacentes, buscamos el que est ms cerca de
nuestro punto origen, lo tomamos como punto intermedio
y vemos si podemos llegar ms rpido a travs de este
vrtice a los dems.
Despus escogemos al siguiente ms cercano (con las
distancias ya actualizadas) y repetimos el proceso. Esto
lo hacemos hasta que el vrtice no utilizado ms cercano
sea nuestro destino. Al proceso de actualizar las distancias tomando como punto intermedio al
nuevo vrtice se le conoce como relajacin (relaxation).
Dijkstra es muy similar a BFS, si recordamos BFS usaba una Cola para el recorrido para el caso de
Dijkstra usaremos una Cola de Prioridad o Heap, este Heap debe tener la propiedad de Min-Heap
es decir cada vez que extraiga un elemento del Heap me debe devolver el de menor valor, en
nuestro caso dicho valor ser el peso acumulado en los nodos.
Tanto java como C++ cuentan con una cola de prioridad ambos implementan un Binary Heap
aunque con un Fibonacci Heap la complejidad de dijkstra se reduce hacindolo ms eficiente, pero
en un concurso ms vale usar la librera que intentar programar una nueva estructura como un
Fibonacci Heap, claro que particularmente uno puede investigar y programarlo para saber cmo
funciona internamente.

Algoritmo en pseudocdigo
Considerar distancia[ i ] como la distancia ms corta del vrtice origen ingresado al vrtice i.

1mtodoDijkstra(Grafo,origen):
2creamosunacoladeprioridadQ
3agregamosorigenalacoladeprioridadQ
4mientrasQnoestevaco:

5sacamosunelementodelacolaQllamadou
6siuyafuevisitadocontinuosacandoelementosdeQ
7marcamoscomovisitadou
8para cada vrticevadyacenteauenelGrafo:
9seawelpesoentrevrtices(u,v)
10sivnoahsidovisitado:
11Relajacion(u,v,w)
1mtodoRelajacion(actual,adyacente,peso):
2sidistancia[actual]+peso<distancia[adyacente]
3distancia[adyacente]=distancia[actual]+peso
4agregamosadyacentealacoladeprioridadQ

Algoritmo de Floyd-Warshall
El algoritmo de Floyd-Warshall (tambin conocido como algoritmo de Roy-Floyd) aprovecha que los
sub-problemas son ptimos, pero desde una perspectiva de programacin dinmica.
Este algoritmo se basa en lo siguiente: supongamos que tenemos la forma de llegar del
vrtice i al jde forma ptima contando con k-1 puntos intermedios. Ahora queremos encontrar la
distancia ms corta agregando un k-simo punto intermedio. Existen dos casos: podemos ir
de i a k y despus a j, o mantener la distancia de i a j que ya tenamos. En ambos estamos
considerando los k -1 puntos como intermedios. Al hacer que k tome el valor de todos los vrtices,
obtenemos la distancia ms corta entre todas las parejas.
Visto como formula, donde dk(i,j) es la distancia mnima para ir de i a j con k puntos, y p(i, j) es el
peso de la arista de i a j, tenemos que:

Algoritmo en cdigo

En el procedimiento Floyd (lneas 5 a 13), calculamos la distancia ms corta entre todos los pares
de vrtices. En cada iteracin del ciclo k, utilizamos al vrtice k como punto intermedio para ir de i
a j. Si utilizndolo como punto intermedio logramos llegar ms rpido, actualizamos la distancia
(lnea 12). Una vez que utilizamos a todos los vrtices como intermedio, obtenemos las distancias
ms cortas para cada par de vrtices.
Bibliografa

http://www.ingenieriaindustrialonline.com/herramientas-para-el-ingenieroindustrial/investigaci%C3%B3n-de-operaciones/teor%C3%ADa-de-redes/
http://jariasf.wordpress.com/2013/01/01/camino-mas-corto-algoritmo-de-bellman-ford/
http://jariasf.wordpress.com/2012/04/19/arbol-de-expansion-minima-algoritmo-de-kruskal/
http://jariasf.wordpress.com/2012/03/19/camino-mas-corto-algoritmo-de-dijkstra/
http://pier.guillen.com.mx/algorithms/10-graficas/10.6-prim_kruskal.htm
http://pier.guillen.com.mx/algorithms/10-graficas/10.5-floyd.htm