15
Problema Camino Más Corto Los problemas conocidos como problemas del camino mínimo o camino más corto, tratan como su nombre indica de hallar la ruta mínima o más corta entre dos puntos. Este mínimo puede ser la distancia entre los puntos origen y destino o bien el tiempo transcurrido para trasladarse desde un punto a otro. Se aplica mucho para problemas de redes de comunicaciones. Este tipo de problemas pueden ser resueltos por el método del Simplex, sin embargo existen otros métodos más eficientes como por ejemplo el algoritmo de Dijkstra o el de Bellman-Ford. Este algoritmo calcula el camino mínimo de un nodo a a otro nodo z en particular, a la vez que calcula los caminos mínimos desde el nodo inicial a dado hasta cada uno de los otros nodos del grafo. Consiste en encontrar la ruta más corta entre dos nodos dados de un grafo dirigido y valuado (con capacidades). Veremos dos algoritmos, por un lado el algoritmo de Dijkstra, que encuentra el camino más corto entre el nodo origen y cada uno de los otros nodos de la red, y por otro lado el algoritmo de Floyd, que encuentra el camino más corto entre cualquier par de nodos de la red. Algoritmo de DIJKSTRA Tendremos a lo largo de todo el proceso dos conjuntos y dos vectores: Conjunto C : Conjunto de vértices candidatos. Inicialmente contiene todos los nodos menos el nodo origen. Conjunto S : Conjunto de vértices seleccionados, es decir, aquellos para los que ya conocemos su camino mínimo desde el nodo origen. Inicialmente contiene el nodo origen. Vector D : Almacenará la longitud del camino más corto desde el origen a cada nodo. Tendrá tantas posiciones como nodos tenga el grafo. El coste de ir del nodo origen a sí mismo lo estimaremos como cero. Vector P : Almacenará el nodo predecesor a cada nodo en el camino más corto desde el origen hasta él. Tendrá tantas posiciones como nodos tenga el grafo. La posición del nodo predecesor al origen estableceremos que sea cero para indicar que es el nodo origen. Llamaremos al nodo origen o, y el coste de ir del nodo i al nodo j lo denotaremos como COSTEij . Hay que seguir los siguientes pasos: Seleccionamos el nodo que sea destino de la arista con menor valor que salga del nodo o, llamémoslo u. Introducimos el nodo uen S y lo sacamos de C. Almacenamos en la posición u del vector D el valor COSTEou y en la posición u del vector P el valor del nodo predecesor, es decir, o. Seleccionamos el siguiente nodo al que podamos llegar con menor coste, bien directamente desde o, bien a través del otro nodo seleccionado u. Llamamos al nuevo nodo seleccionado v. Introducimos el nodo v en S y lo sacamos de C. Introducimos en la posición v del vector D el coste de llegar al nodo v, si es directamente desde o será COSTEov, si es a través de u seráD[u]+COSTEuv. Por último, en la posición v del vector P introducimos el valor del nodo predecesor, ya sea o o u. Repetiremos este proceso hasta que todos los nodos hayan sido seleccionados, es decir, hasta que el conjunto C esté vacío, o lo que es lo mismo, hasta que en el conjunto S se encuentren todos los nodos del grafo. En ese momento en el vector D tendremos almacenado el coste mínimo para llegar desde el nodo origen a cualquier nodo del grafo, y podremos obtener el camino más corto mediante el vector P. Ejemplo: Aplicar el algoritmo de Dijkstra sobre el siguiente grafo siendo el nodo origen el 1:

Problema de La Ruta Mas

Embed Size (px)

DESCRIPTION

Algoritmo de Ford-FulkersonAlgoritmo DE FLOYDAlgoritmo de DIJKSTRAProblema Árbol Expandido MínimoALGORITMO DE KRUSKALALGORITMO DE PRIM

Citation preview

Problema Camino MsCorto

Los problemas conocidos como problemas del camino mnimo o camino ms corto, tratan como su nombre indica de hallar la ruta mnima o ms corta entre dos puntos. Este mnimo puede ser la distancia entre los puntos origen y destino o bien el tiempo transcurrido para trasladarse desde un punto a otro. Se aplica mucho para problemas de redes de comunicaciones.

Este tipo de problemas pueden ser resueltos por el mtodo del Simplex, sin embargo existen otros mtodos ms eficientes como por ejemplo el algoritmo de Dijkstra o el de Bellman-Ford.

Este algoritmo calcula el camino mnimo de un nodoaa otro nodozen particular, a la vez que calcula los caminos mnimos desde el nodo inicialadado hastacada uno de los otrosnodos del grafo.

Consiste en encontrar la ruta ms corta entre dos nodos dados de un grafo dirigido y valuado (con capacidades). Veremos dos algoritmos, por un lado el algoritmo de Dijkstra, que encuentra el camino ms corto entre el nodo origen y cada uno de los otros nodos de la red, y por otro lado el algoritmo de Floyd, que encuentra el camino ms corto entre cualquier par de nodos de la red.

Algoritmo de DIJKSTRA

Tendremos a lo largo de todo el proceso dos conjuntos y dos vectores:

ConjuntoC:Conjunto de vrtices candidatos. Inicialmente contiene todos los nodos menos el nodo origen.

ConjuntoS:Conjunto de vrtices seleccionados, es decir, aquellos para los que ya conocemos su camino mnimo desde el nodo origen. Inicialmente contiene el nodo origen.

VectorD:Almacenar la longitud del camino ms corto desde el origen a cada nodo. Tendr tantas posiciones como nodos tenga el grafo. El coste de ir del nodo origen a s mismo lo estimaremos como cero.

VectorP:Almacenar el nodo predecesor a cada nodo en el camino ms corto desde el origen hasta l. Tendr tantas posiciones como nodos tenga el grafo. La posicin del nodo predecesor al origen estableceremos que sea cero para indicar que es el nodo origen.

Llamaremos al nodo origeno, y el coste de ir del nodoial nodojlo denotaremos comoCOSTEij.

Hay que seguir los siguientes pasos:

Seleccionamos el nodo que sea destino de la arista con menor valor que salga del nodoo, llammoslou. Introducimos el nodouenSy lo sacamos deC. Almacenamos en la posicinudel vectorDel valorCOSTEouy en la posicinudel vectorPel valor del nodo predecesor, es decir,o.

Seleccionamos el siguiente nodo al que podamos llegar con menor coste, bien directamente desdeo, bien a travs del otro nodo seleccionadou. Llamamos al nuevo nodo seleccionadov. Introducimos el nodovenSy lo sacamos deC. Introducimos en la posicinvdel vectorDel coste de llegar al nodov, si es directamente desdeoserCOSTEov, si es a travs deuserD[u]+COSTEuv. Por ltimo, en la posicinvdel vectorPintroducimos el valor del nodo predecesor, ya seaoou.

Repetiremos este proceso hasta que todos los nodos hayan sido seleccionados, es decir, hasta que el conjuntoCest vaco, o lo que es lo mismo, hasta que en el conjuntoSse encuentren todos los nodos del grafo. En ese momento en el vectorDtendremos almacenado el coste mnimo para llegar desde el nodo origen a cualquier nodo del grafo, y podremos obtener el camino ms corto mediante el vectorP.

Ejemplo:Aplicar el algoritmo de Dijkstra sobre el siguiente grafo siendo el nodo origen el1:

Algoritmo DE FLOYD

El algoritmo de Floyd es ms general que el de Dijkstra, ya que determina la ruta ms corta entre dos nodos cualquiera de la red.

El algoritmo representa una red dennodos como una matriz cuadrada de ordenn, la llamaremos matrizC. De esta forma, el valorCijrepresenta el coste de ir desde el nodoial nodoj, inicialmente en caso de no existir un arco entre ambos, el valorCijser infinito.

Definiremos otra matrizD, tambin cuadrada de ordenn, cuyos elementos van a ser los nodos predecesores en el camino hacia el nodo origen, es decir, el valorDijrepresentar el nodo predecesor ajen el camino mnimo desdeihastaj. Inicialmente se comienza con caminos de longitud1, por lo queDij = i.

Las diagonales de ambas matrices representan el coste y el nodo predecesor para ir de un nodo a si mismo, por lo que no sirven para nada, estarn bloqueadas.

Los pasos a dar en la aplicacin del algoritmo de Floyd son los siguientes:

Formar las matrices inicialesCyD.

Se tomak=1.

Se selecciona la fila y la columnakde la matrizCy entonces, paraiyj, conik,jkeij, hacemos:

Si(Cik + Ckj) < Cij Dij = DkjyCij = Cik + Ckj

En caso contrario, dejamos las matrices como estn.

Sik n, aumentamosken una unidad y repetimos el paso anterior, en caso contrario paramos las iteraciones.

La matriz finalCcontiene los costes ptimos para ir de un vrtice a otro, mientras que la matrizDcontiene los penltimos vrtices de los caminos ptimos que unen dos vrtices, lo cual permite reconstruir cualquier camino ptimo para ir de un vrtice a otro.

Ejemplo:Aplicar el algoritmo de Floyd sobre el siguiente grafo para obtener las rutas ms cortas entre cada dos nodos. El arco(3, 5)es direccional, de manera que no est permitido ningn trfico del nodo5al nodo3. Todos los dems arcos permiten el trfico en ambas direcciones.

Inicializamos las matrices :

Tomamosk=1:

Tomamosi=2 (i k):

j=3 (jk, ji):C[2,1]+C[1,3] = 3+10 = 13 < C[2,3] = , por tanto hacemos:

C[2,3] = 13yD[2,3] = 1.

j=4 (jk, ji): C[2,1]+C[1,4] = 3+ = , no hay que cambiar nada, no podemos llegar de2a4a travs de1.

j=5 (jk, ji): C[2,1]+C[1,5] = 3+ = , no hay que cambiar nada, no podemos llegar de2a5a travs de1.

Tomamosi=3 (i k):

j=2 (jk, ji):C[3,1]+C[1,2] = 10+3 = 13 < C[3,2] = , por tanto hacemos:

C[3,2] = 13yD[3,2] = 1.

j=4 (jk, ji):C[3,1]+C[1,4] = 10+ = , no hay que cambiar nada, no podemos llegar de3a4a travs de1.

j=5 (jk, ji):C[3,1]+C[1,5] = 10+ = , no hay que cambiar nada, no podemos llegar de3a5a travs de1.

Tomamosi=4 (i k):

j=2 (jk, ji):C[4,1]+C[1,2] = +3 = , no hay que cambiar nada, no podemos llegar de4a2a travs de1.

j=3 (jk, ji):C[4,1]+C[1,3] = +10 = , no hay que cambiar nada, no podemos llegar de4a3a travs de1.

j=5 (jk, ji):C[4,1]+C[1,5] = + = , no hay que cambiar nada, no podemos llegar de4a5a travs de1.

Tomamosi=5 (i k), en este caso ocurre como en el paso anterior, comoC[5,1]=, entonces no habr ningn cambio, no puede haber ningn camino desde5a travs de1.

Tomamosk=2:

Tomamosi=1:

j=3:C[1,2]+C[2,3] = 3+13 = 16 > C[1,3] = 10, por tanto no hay que cambiar nada, el camino es mayor que el existente.

j=4:C[1,2]+C[2,4] = 3+5 = 8 < C[1,4] = , por tanto hacemos:

C[1,4] = 8yD[1,4] = 2.

j=5:C[1,2]+C[2,5] = 3+ = , no hay que cambiar nada.

Tomamosi=3:

j=1:C[3,2]+C[2,1] = 13+3 = 16 > C[3,1] = 10, no hay que cambiar nada.

j=4:C[3,2]+C[2,4] = 13+5 = 18 > C[3,4] = 6, no hay que cambiar nada.

j=5:C[3,2]+C[2,5] = 13+ = , no hay que cambiar nada.

Tomamosi=4:

j=1:C[4,2]+C[2,1] = 5+3 = 8 < C[4,1] = , por tanto hacemos:

C[4,1] = 8yD[4,1] = 2.

j=3:C[4,2]+C[2,3] = 5+13 = 18 > C[4,3] = 6, no hay que cambiar nada.

j=5:C[4,2]+C[2,5] = 5+ = , no hay que cambiar nada.

Tomamosi=5, comoC[5,2]=, entonces no habr ningn cambio.

Tomamosk=3:

Tomamosi=1:

j=2:C[1,3]+C[3,2] = 10+13 = 23 > C[1,2] = 3, no hay que cambiar nada.

j=4:C[1,3]+C[3,4] = 10+6 = 16 > C[1,4] = 8, no hay que cambiar nada.

j=5:C[1,3]+C[3,5] = 10+15 = 25 < C[1,5] = , por tanto hacemos:

C[1,5] = 25yD[1,5] = 3.

Tomamosi=2:

j=1:C[2,3]+C[3,1] = 13+10 = 23 > C[2,1] = 3, no hay que cambiar nada.

j=4:C[2,3]+C[3,4] = 13+6 = 19 > C[2,4] = 5, no hay que cambiar nada.

j=5:C[2,3]+C[3,5] = 13+15 = 28 < C[2,5] = , por tanto hacemos:

C[2,5] = 28yD[2,5] = 3.

Tomamosi=4:

j=1:C[4,3]+C[3,1] = 6+10 = 16 > C[4,1] = 8, no hay que cambiar nada.

j=2:C[4,3]+C[3,2] = 6+13 = 19 > C[4,2] = 5, no hay que cambiar nada.

j=5:C[4,3]+C[3,5] = 6+15 = 21 > C[4,5] = 4, no hay que cambiar nada.

Tomamosi=5, comoC[5,3]=, entonces no habr ningn cambio.

Tomamosk=4:

Tomamosi=1:

j=2:C[1,4]+C[4,2] = 8+5 = 13 > C[1,2] = 3, no hay que cambiar nada.

j=3:C[1,4]+C[4,3] = 8+6 = 14 > C[1,3] = 10, no hay que cambiar nada.

j=5:C[1,4]+C[4,5] = 8+4 = 12 < C[1,5] = 25, por tanto hacemos:

C[1,5] = 12yD[1,5] = 4.

Tomamosi=2:

j=1:C[2,4]+C[4,1] = 5+8 = 13 > C[2,1] = 3, no hay que cambiar nada.

j=3:C[2,4]+C[4,3] = 5+6 = 11 < C[2,3] = 13, por tanto hacemos:

C[2,3] = 11yD[2,3] = 4.

j=5:C[2,4]+C[4,5] = 5+4 = 9 < C[2,5] = 28, por tanto hacemos:

C[2,5] = 9yD[2,5] = 4.

Tomamosi=3:

j=1:C[3,4]+C[4,1] = 6+8 = 14 > C[3,1] = 10, no hay que cambiar nada.

j=2:C[3,4]+C[4,2] = 6+5 = 11 < C[3,2] = 13, por tanto hacemos:

C[3,2] = 11yD[3,2] = 4.

j=5:C[3,4]+C[4,5] = 6+4 = 10 < C[3,5] = 15, por tanto hacemos:

C[3,5] = 10yD[3,5] = 4.

Tomamosi=5:

j=1:C[5,4]+C[4,1] = 4+8 = 12 < C[5,1] = , por tanto hacemos:

C[5,1] = 12yD[5,1] = 2.

j=2:C[5,4]+C[4,2] = 4+5 = 9 < C[5,2] = , por tanto hacemos:

C[5,2] = 9yD[5,2] = 4.

j=3:C[5,4]+C[4,3] = 4+6 = 10 < C[5,3] = , por tanto hacemos:

C[5,3] = 10yD[5,3] = 4.

Tomamosk=5:

Tomamosi=1:

j=2:C[1,5]+C[5,2] = 12+9 = 21 > C[1,2] = 3, no hay que cambiar nada.

j=3:C[1,5]+C[5,3] = 12+10 = 22 > C[1,3] = 10, no hay que cambiar nada.

j=4:C[1,5]+C[5,4] = 12+4 = 16 > C[1,4] = 8, no hay que cambiar nada.

Tomamosi=2:

j=1:C[2,5]+C[5,1] = 9+12 = 21 > C[2,1] = 3, no hay que cambiar nada.

j=3:C[2,5]+C[5,3] = 9+10 = 19 > C[2,3] = 11, no hay que cambiar nada.

j=4:C[2,5]+C[5,4] = 9+4 = 13 > C[2,4] = 5, no hay que cambiar nada.

Tomamosi=3:

j=1:C[3,5]+C[5,1] = 10+12 = 22 > C[3,1] = 10, no hay que cambiar nada.

j=2:C[3,5]+C[5,2] = 10+9 = 19 > C[3,2] = 11, no hay que cambiar nada.

j=4:C[3,5]+C[5,4] = 10+4 = 14 > C[3,4] = 6, no hay que cambiar nada.

Tomamosi=4:

j=1:C[4,5]+C[5,1] = 4+12 = 16 > C[4,1] = 8, no hay que cambiar nada.

j=2:C[4,5]+C[5,2] = 4+9 = 13 > C[4,2] = 5, no hay que cambiar nada.

j=3:C[4,5]+C[5,3] = 4+10 = 14 > C[4,3] = 6, no hay que cambiar nada.

FIN del proceso, las matrices quedan como sigue:

Las matrices finalesCyDcontienen toda la informacin necesaria para determinar la ruta ms corta entre dos nodos cualquiera de la red. Por ejemplo, la distancia ms corta del nodo1al nodo5esC[1,5] = 12.

Para determinar la ruta asociada del camino mnimo entre el nodo1y el nodo5haremos lo siguiente:

ConsultamosD[1,5]=4, por tanto el nodo predecesor al5es el4, es decir,45.

ConsultamosD[1,4]=2, por tanto el nodo predecesor al4es el2, es decir,245.

ConsultamosD[1,2]=1, por tanto el nodo predecesor al2es el1, es decir,1245, y as ya tenemos la ruta completa.

Problema FlujoMximo

En algunas redes circula por los arcos unflujo(envo o circulacin de unidades homogneas de algn producto: automviles en una red de carreteras, litros de petrleo en un oleoducto, bits por un cable de fibra ptica) desde elorigenofuentealdestino, tambin denominadosumideroovertedero. Los arcos tienen una capacidad mxima de flujo, y se trata de enviar desde la fuente al sumidero la mayor cantidad posible de flujo, de tal manera que:

El flujo es siempre positivo y con unidades enteras.

El flujo a travs de un arco es menor o igual que la capacidad.

El flujo que entra en un nodo es igual al que sale de l.

En el caso de que el origen o el destino no existan en el problema, se aaden ficticiamente utilizando arcos unidireccionales de capacidad infinita, como en grafo mostrado a continuacin:

Corte:Un corte define una serie de arcos cuya supresin de la red causa una interrupcin completa del flujo entre el origen y el destino. Lacapacidad de cortees igual a la suma de las capacidades de los arcos asociados. Entretodoslos cortes posibles en la red , el corte con lamenor capacidadproporciona el flujo mximo en la red.

El siguiente grafo ilustra 3 cortes: el Corte 1 con capacidad 60, el Corte 2 con capacidad 110 y el Corte 3 con capacidad 70. Todo lo que podemos obtener de los 3 cortes es que el flujo mximo en la red no excede de 60 unidades. No podemos saber cual es el flujo mximo hasta que se hayan enumeradotodoslos cortes en la red:

Las capacidades se identifican como sigue: por ejemplo, para el arco(3,4), el lmite de flujo es de10unidades de3a4y de5unidades de4a3.

Algoritmo de Ford-Fulkerson

El algoritmo de Ford-Fulkerson propone buscar caminos en los que se pueda aumentar el flujo, hasta que se alcance el flujo mximo.

La idea es encontrar unaruta de penetracincon un flujo positivo neto que una los nodos origen y destino.

Consideraremos las capacidades iniciales del arco que une el nodoiy el nodojcomoCijyCji. Estas capacidades iniciales irn variando a medida que avanza el algoritmo, denominaremoscapacidades residualesa las capacidades restantes del arco una vez pasa algn flujo por l, las representaremos comocijycji.

Para un nodojque recibe el flujo del nodoi, definimos una clasificacin[aj,i]dondeajes el flujo del nodoial nodoj.

Los pasos del algoritmo se definen como sigue:

Paso 1:Inicializamos las capacidades residuales a las capacidades iniciales, hacemos(cij,cji)=(Cij,Cji)para todo arco de la red. Suponiendo el nodo 1 como el nodo origen, hacemosa1=y clasificamos el nodo origen con[,-]. Tomamosi=1y vamos al paso 2.

Paso 2:DeterminamosSicomo un conjunto que contendr los nodos a los que podemos acceder directamente desdeipor medio de un arco con capacidad positiva, y que no formen parte del camino en curso. SiSicontiene algn nodo vamos al paso 3, en el caso de que el conjunto sea vaco saltamos al paso 4.

Paso 3:ObtenemoskSicomo el nodo destino del arco de mayor capacidad que salga deihacia un nodo perteneciente aSi. Es decir,cik = max{cij} con jSi. Hacemosak=ciky clasificamos el nodokcon[ak,i]. Sikes igual al nodo destino o sumidero, entonces hemos encontrado una ruta de penetracin, vamos al paso 5. En caso contrario continuamos con el camino, hacemosi=ky volvemos al paso 2.

Paso 4 (retroceso):Sii=1, estamos en el nodo origen, y comoSies vaco, entonces no podemos acceder a ningn nodo, ni encontrar algn nuevo camino, hemos terminado, vamos al paso 6.En caso contrario,i1, le damos al valoriel del nodo que se ha clasificado inmediatamente antes, eliminamosidel conjuntoSiactual y volvemos al paso 2.

Paso 5:Llegados a este paso tenemos un nuevo camino:Np={1,k1,k2,,n}, esta ser lap-simaruta de penetracin desde el nodo origen al nodo destino. El flujo mximo a lo largo de esta ruta ser la capacidad mnima de las capacidades residuales de los arcos que forman el camino, es decir:fp=min{a1,ak1,ak2,,an}.La capacidad residual de cada arco a lo largo de la ruta de penetracin se disminuye porfpen direccin del flujo y se incrementa porfpen direccin inversa, es decir, para los nodosiyjen la ruta, el flujo residual se cambia de la(cij,cji)actual a(cij-fp,cji+fp)si el flujo es deiaj, o(cij+fp,cji-fp)si el flujo es dejaiInicializamosi=1y volvemos al paso 2 para intentar una nueva ruta de penetracin.

Paso 6 (solucin):Una vez aqu, hemos determinadomrutas de penetracin. El flujo mximo en la red ser la suma de los flujos mximos en cada ruta obtenida, es decir:F=f1+f2++fm. Teniendo en cuenta que las capacidades residuales inicial y final del arco(i, j)las dan(Cij,Cji)y(cij,cji)respectivamente, el flujo mximo para cada arco se calcula como sigue: sea(, )=(Cij-cij, Cji-cji), si>0, el flujo ptimo deiajes, de lo contrario, si>0, el flujo ptimo dejaies. Es imposible lograr que tantocomosean positivas.

Ejemplo:Determinar el flujo mximo en la red siguiente:

Iteracin 1:

Determinamos las residuales iniciales(cij,cji)iguales a las capacidades iniciales(Cij,Cji).

Paso 1:Hacemosai=, y clasificamos el nodo 1 con[a1,-]. Tomamosi=1.

Paso 2:S1={2,3,4}(no vaco).

Paso 3:k=3ya quec13=max{c12,c13,c14}={20,30,10}=30. Hacemosa3=c13=30y clasificamos el nodo 3 con[30,1]. Tomamosi=3y repetimos el paso 2.

Paso 2:S3={4,5}

Paso 3:k=5ya5=c35=max{10,20}=20. Clasificamos el nodo 5 con[20,3]. Logramos la penetracin, vamos al paso 5.

Paso 5:La ruta de la penetracin se determina de las clasificaciones empezando en el nodo 5 y terminando en el nodo 1, es decir,5[20,3]3[30,1]1.

Entonces la ruta esN1={1,3,5}yf1=min{a1,a3,a5}={,30,20}=20. Las capacidades residuales a lo largo de esta ruta son:

(c13,c31)=(30-20, 0+20)=(10,20)

(c35,c53)=(20-20, 0+20)=(0,20)

Iteracin 2:

Paso 1:Hacemosai=, y clasificamos el nodo 1 con[a1,-]. Tomamosi=1.

Paso 2:S1={2,3,4}.

Paso 3:k=2ya2=c12=max{20,10,10}=20. Clasificamos el nodo 2 con[20,1]. Tomamosi=2y repetimos el paso 2.

Paso 2:S2={3,5}

Paso 3:k=3ya3=c23=max{30,40}=40. Clasificamos el nodo 3 con[40,2]. Tomamosi=3y repetimos el paso 2.

Paso 2:S3={4}(c35=0,el nodo 1 ya ha sido clasificado y el nodo 2 cumple ambas condiciones, por tanto los nodos 1, 2 y 5 no pueden ser incluidos enS3).

Paso 3:k=4ya4=c34=10. Clasificamos el nodo 4 con[10,3]. Tomamosi=4y repetimos el paso 2.

Paso 2:S4={5}

Paso 3:k=5ya5=c45=20. Clasificamos el nodo 5 con[20,4]. Logramos la penetracin, vamos al paso 5.

Paso 5:La ruta de la penetracin es:5[20,4]4[10,3]3[40,2]2[20,1]1.

Entonces la ruta esN2={1,2,3,4,5}yf2=min{,20,40,10,20}=10. Las capacidades residuales a lo largo de esta ruta son:

(c12,c21)=(20-10, 0+10)=(10,10)

(c23,c32)=(40-10, 0+10)=(30,10)

(c34,c43)=(10-10, 5+10)=(0,15)

(c45,c54)=(20-10, 0+10)=(10,10)

Iteracin 3:

Paso 1:Hacemosai=, y clasificamos el nodo 1 con[a1,-]. Tomamosi=1.

Paso 2:S1={2,3,4}.

Paso 3:k=2ya2=c12=max{10,10,10}=10, rompemos el empate arbitrariamente. Clasificamos el nodo 2 con[10,1]. Tomamosi=2y repetimos el paso 2.

Paso 2:S2={3,5}

Paso 3:k=3ya3=c23=max{30,30}=30. Clasificamos el nodo 3 con[30,2]. Tomamosi=3y repetimos el paso 2.

Paso 2:S3vaco ya quec34=c35=0. Vamos al paso 4 para retroceder.

Paso 4:La clasificacin[30,2]nos dice que el nodo inmediatamente precedente es el 2. Eliminamos el nodo 3 de una consideracin posterior en esta iteracin. Tomamosi=2y repetimos el paso 2.

Paso 2:S2={5}

Paso 3:k=5ya5=c25=30. Clasificamos el nodo 5 con[30,2]. Logramos la penetracin, vamos al paso 5.

Paso 5:La ruta de la penetracin es:5[30,2]2[10,1]1.

Entonces la ruta esN2={1,2,5}yf3=min{,10,30}=10. Las capacidades residuales a lo largo de esta ruta son:

(c12,c21)=(10-10, 10+10)=(0,20)

(c25,c52)=(30-10, 0+10)=(20,10)

Iteracin 4:

Paso 1:Hacemosai=, y clasificamos el nodo 1 con[a1,-]. Tomamosi=1.

Paso 2:S1={3,4}.

Paso 3:k=3ya3=c13=max{10,10}=10. Clasificamos el nodo 3 con[10,1]. Tomamosi=3y repetimos el paso 2.

Paso 2:S3={2}

Paso 3:k=2ya2=c32=10. Clasificamos el nodo 2 con[10,3]. Tomamosi=2y repetimos el paso 2.

Paso 2:S2={5}

Paso 3:k=5ya5=c25=20. Clasificamos el nodo 5 con[20,2]. Logramos la penetracin, vamos al paso 5.

Paso 5:La ruta de la penetracin es:5[20,2]2[10,3]3[10,1]1.

Entonces la ruta esN4={1,3,2,5}yf4=min{,10,10,20}=10. Las capacidades residuales a lo largo de esta ruta son:

(c13,c31)=(10-10, 20+10)=(0,30)

(c32,c23)=(10-10, 30+10)=(0,40)

(c25,c52)=(20-10, 10+10)=(10,20)

Iteracin 5:

Paso 1:Hacemosai=, y clasificamos el nodo 1 con[a1,-]. Tomamosi=1.

Paso 2:S1={4}.

Paso 3:k=4ya4=c14=10. Clasificamos el nodo 4 con[10,1]. Tomamosi=4y repetimos el paso 2.

Paso 2:S4={3,5}

Paso 3:k=3ya3=c23=max{15,10}=15. Clasificamos el nodo 3 con[15,4]. Tomamosi=3y repetimos el paso 2.

Paso 2:S3vaco ya quec32=c34=c35=0. Vamos al paso 4 para retroceder.

Paso 4:La clasificacin[15,4]nos dice que el nodo inmediatamente precedente es el 4. Eliminamos el nodo 3 de una consideracin posterior en esta iteracin. Tomamosi=4y repetimos el paso 2.

Paso 2:S4={5}

Paso 3:k=5ya5=c45=10. Clasificamos el nodo 5 con[10,4]. Logramos la penetracin, vamos al paso 5.

Paso 5:La ruta de la penetracin es:5[10,4]4[10,1]1.

Entonces la ruta esN2={1,4,5}yf3=min{,10,10}=10. Las capacidades residuales a lo largo de esta ruta son:

(c14,c41)=(10-10, 0+10)=(0,10)

(c45,c54)=(10-10, 10+10)=(0,20)

Iteracin 6:

No son posibles ms penetraciones, debido a que todos los arcos fuera del nodo 1 tienen residuales cero. Vayamos al paso 6 para determinar la solucin.

Paso 6:El flujo mximo en la red esF=f1+f2++f5=60 unidades. El flujo en los diferentes arcos se calcula restando las ltimas residuales obtenidas en la ltima iteracin de las capacidades iniciales:

Problema rbol ExpandidoMnimo

rbol:Es un grafo en el que existe un nico nodo desde el que se puede acceder a todos los dems y cada nodo tiene un nico predecesor, excepto el primero, que no tiene ninguno. Tambin podemos definir un rbol como:

Un grafo conexo y sin ciclos.

Un grafo sin ciclos y conn-1aristas, siendonel nmero de vrtices.

Gradode un nodo en un rbol es el nmero de subrboles de aquel nodo (en el ejemplo, el grado dev1es2y dev21).

Denominamoshojasen un rbol a los nodos finales (v3,v5yv6).

Unrbol de mximo alcancees aquel que obtenemos en un grafo conexo y sin ciclos.

rbol de mnima expansin:rbol de mximo alcance cuyo valor es mnimo, es decir, la suma de sus aristas es mnima.

ALGORITMO DE KRUSKAL

El algoritmo de Kruskal permite hallar el rbol minimal de cualquier grafo valorado (con capacidades). Hay que seguir los siguientes pasos:

1. Se marca la arista con menor valor. Si hay ms de una, se elige cualquiera de ellas.

2. De las aristas restantes, se marca la que tenga menor valor, si hay ms de una, se elige cualquiera de ellas.

3. Repetir el paso 2 siempre que la arista elegida no forme un ciclo con las ya marcadas.

4. El proceso termina cuando tenemos todos los nodos del grafo en alguna de las aristas marcadas, es decir, cuando tenemos marcadosn-1arcos, siendonel nmero de nodos del grafo.

Ejemplo:Determinar el rbol de mnima expansin para el siguiente grafo:

Siguiendo el algoritmo de Kruskal, tenemos:

Elegimos, por ejemplo, la arista(5, 6)= 1(menor valor) y la marcamos.

Elegimos la siguiente arista con menor valor(1, 3)= 1y la marcamos.

Elegimos la siguiente arista con menor valor(5, 7)= 2y la marcamos, ya que no forma ciclos con ninguna arista de las marcadas anteriormente.

Elegimos la siguiente arista con menor valor(1, 2)= 3y la marcamos, ya que no forma ciclos con ninguna arista de las marcadas anteriormente.

Elegimos la siguiente arista con menor valor(6, 7)= 4y la desechamos, ya que forma ciclos con las aristas(5, 7)y(5, 6)marcadas anteriormente.

Elegimos la siguiente arista con menor valor(2, 5)= 5y la marcamos, ya que no forma ciclos con ninguna arista de las marcadas anteriormente.

Elegimos la siguiente arista con menor valor(4, 5)= 6y la marcamos, ya que no forma ciclos con ninguna arista de las marcadas anteriormente.

FIN. Finalizamos dado que los7nodos del grafo estn en alguna de las aristas, o tambin ya que tenemos marcadas6aristas (n-1).

Por tanto el rbol de mnima expansin resultante sera:

ALGORITMO DE PRIM

El algoritmo de Prim permite hallar el rbol minimal de cualquier grafo valorado (con capacidades). Hay que seguir los siguientes pasos:

1. Se marca un nodo cualquiera, ser el nodo de partida.

2. Seleccionamos la arista de menor valor incidente en el nodo marcado anteriormente, y marcamos el otro nodo en el que incide.

3. Repetir el paso 2 siempre que la arista elegida enlace un nodo marcado y otro que no lo est.

4. El proceso termina cuando tenemos todos los nodos del grafo marcados.

Ejemplo:Determinar el rbol de mnima expansin para el siguiente grafo:

Siguiendo el algoritmo de Prim, tenemos:

Elegimos, por ejemplo, el nodo1y lo marcamos.

Elegimos la arista con menor valor incidente en1,la(1, 3)= 1la marcamos y marcamos el otro nodo en el que incide, el3.

Elegimos la arista con menor valor incidente en un nodo marcado y otro que no lo est, la(1, 2)= 3la marcamos y marcamos el nodo no marcado, el2.

Elegimos la arista con menor valor incidente en un nodo marcado y otro que no lo est, la(2, 5)= 5la marcamos y marcamos el nodo no marcado, el5.

Elegimos la arista con menor valor incidente en un nodo marcado y otro que no lo est, la(5, 6)= 1la marcamos y marcamos el nodo no marcado, el6.

Elegimos la arista con menor valor incidente en un nodo marcado y otro que no lo est, la(5, 7)= 2la marcamos y marcamos el nodo no marcado, el7.

Elegimos la arista con menor valor incidente en un nodo marcado y otro que no lo est, la(5, 4)= 6la marcamos y marcamos el nodo no marcado, el4.

FIN. Finalizamos dado que tenemos marcados los7nodos del grafo.

Por tanto el rbol de mnima expansin resultante sera: