Algoritmia y Lgica Computacional Algoritmos para redes de flujo Parte ! 1 Algoritmo Breath-first search 1 !mplementacin de Breath-first search en Wolfram Nathematica. 1 Algoritmo Ford-Fulkerson (1956) 1 !mplementacin de Ford-Fulkerson en Wolfram Nathematica. 1 Ejemplos. Profesora: Dra. Caputti, Telma Alumno: Bassi, Javier - (02-080206-0) Ano: 2013 Breath-first search El algoritmo de Breath-first search sirve para buscar un nodo en un grafo. Valores iniciales: grafo G = (P , E) donde P es un conjunto de nodos, y E es un conjunto de arcos, siendo un arco un par ordenado de nodos. Llamamos v al nodo raz. Llamamos buscado al nodo que queremos encontrar. Pseudocdigo BFS: 1. Creo una cola Q 2. Agrego v a la cola Q. 3. Marco v como nodo ya visitado. 4. Mientras Q no este vaca hacer 4.1 Saco un nodo de de la cola. Lo llamo t 4.2 Si t es el nodo que estamos buscando entonces Retorno t 4.3 Para cada arco e = (x, y) / x = t y R(t) hacer 4.3.1 Si y no est visitado hacer 4.3.1.1 marcar y como visitado 4.3.1.2 agregar y a Q 5. Retorno (en caso de que no lo haya encontrado) Encontrando el paso con Breath-first search Para encontrar el paso desde el nodo raz hasta el nodo buscado, en vez de guardar el nodo visitado v, guardamos el arco por el cual llegamos a ese nodo v. Entonces dado el nodo raz podemos encontrar el paso hasta v. Entonces funciona si el grafo G es acclico. Implementando Breath-first search en Mathematica. BFSG_, v_, buscado_:=ModuleP, E, Q =, M =, t, e, i, u, arcos=, + Breadth-first search + P =G1; + Nodos + E=G2; + Arcos + Q =AppendQ, v; + Cola + M =UnionM, v; + marcados + arcos=Appendarcos, Null, v; WhileLengthQ,0, t=QLengthQ; Q =DeleteQ, -1;+saco el ltimo de la cola + Ift=buscado, Returnarcos; ; e =CasesE, t, _;+arcos de t hacia su vencidad derecha Rt + Fori=1, is Lengthe, i++, u =ei2; IfLengthCasesM, u=0, M =UnionM, u; arcos=Appendarcos, t, u; Q =AppendQ, u; ; ; ; ReturnNull;
bfs=BFSG, v, buscado; Ifbfs==Null, ReturnNull;; lista=Prependlista, buscado; Foranterior =Casesbfs, _, buscadoAll, 11, anterior =!= Null, anterior =Casesbfs, _, anteriorAll, 11, lista=Prependlista, anterior; ; Returnlista; ; Algoritmo de Ford-Fulkerson (1956) El algoritmo de Ford-Fulkerson (un algoritmo para el problema de flujo mximo), computa el flujo mximo en una red de flujo (grafo con fuente y vertedero). Fue publicado en 1956 con el ttulo Maximal flow through a network en el Canadian Journal of Mathematics 8. p399-404. La idea del algoritmo es que mientras haya un paso entre la fuente y el vertedero cuya capacidad no est agotada en ningn arco del paso, aumento el flujo en ese paso. Ese aumento est dado por el arco con la menor capacidad libre. Pseudocdigo: 0. Dado un grafo G = (P, E) con fuente s y vertedero t, con capacidad de arco dada por la funcin c(u,v):[u,v P] . Sea f (u,v) es la funcin de flujo, definida por f(u,v) = 0 u,v P. 1. Definimos el grafo residual G f = (P, E f ) donde E f = EE 1 con capacidad c f (u, v) = c(u,v) - f(u,v) 2. Mientras (s, t) en G f / c f (u,v) > 0 (u,v) 2.1 tmp = min{c f (u,v) : (u,v) } 2.2 Para cada arco (u,v) hacer 2.2.1 f(u,v) f(u,v) + tmp 2.2.2 f(v,u) f(v,u) - tmp 2 ford-fulkerson2.nb Implementacin de Ford-Fulkerson en Mathematica. Tengo que modificar Breath-First search para que siga explorando solo si c f > 0 BFScapacidadG_, v_, buscado_, capacidad_, flujo_:= ModuleP, E, Q =, M =, t, e, i, u, arcos=, + Breadth-first search + P =G1; + Nodos + E=G2; + Arcos + Q =AppendQ, v; + Cola + M =UnionM, v; + marcados + arcos=Appendarcos, Null, v; WhileLengthQ,0, t=QLengthQ; Q =DeleteQ, -1;+saco el ltimo de la cola + Ift=buscado, Returnarcos; ; e =CasesE, t, _;+Rt,P,E;+ Fori=1, is Lengthe, i++, u =ei2; IfLengthCasesM, u=0 && Funccapacidad, t- u-Funcflujo, t- u>0, M =UnionM, u; arcos=Appendarcos, t, u; Q =AppendQ, u; ; ; ; ReturnNull;