You are on page 1of 8

Pontificia Universidad Catlica Argentina

Santa Naria de los Buenos Aires


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;

PasoG_, v_, buscado_:=Modulebfs, lista=, anterior =Null, i=0,


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;

La funcin Paso2 utiliza BFS para encontrar el / c


f
(u,v) > 0 (u,v)
Paso2G_, v_, buscado_, capacidad_, flujo_:=Modulebfs, lista=, anterior =Null, i=0,
bfs=BFScapacidadG, v, buscado, capacidad, flujo;
Ifbfs==Null, ReturnNull;;
lista=Prependlista, buscado;
Foranterior =Casesbfs, _, buscadoAll, 11,
anterior =!= Null, anterior =Casesbfs, _, anteriorAll, 11,
lista=Prependlista, anterior;
;
Returnlista;
;
Otras funciones auxiliares.
ford-fulkerson2.nb 3
ImprimirFlowNetworkG_, capacidad_, flujo_:=Modulegrafo=, tmp, i,
Fori=1, is Lengthflujo, i++,
tmp=flujoi1;
tmp=Appendtmp, StringJoin
ToStringFuncflujo, flujoi1, "", ToStringFunccapacidad, flujoi1;
grafo=Uniongrafo, tmp;
;
GraphPlotgrafo, VertexLabeling -True, DirectedEdges-True
;
TOarcp_:=Tablepj1- pj2, j, 1, Lengthp;
Funclista_, x_:=Caseslista, x, _All, 21;
MinimalesP_, E_:=Modulenomin =, i=0,
Fori=1, is LengthE, i++,
IfEi1, Ei2,
nomin =Unionnomin, Ei2;
;
;
ComplementP, nomin

MaximalesP_, E_:=Modulenomax =, i=0,


Fori=1, is LengthE, i++,
IfEi1, Ei2,
nomax =Unionnomax, Ei1;
;
;
ComplementP, nomax

Funcin que ejecuta el algoritmo de Ford-Fulkerson


FordFulkersonG_, capacidad_, flujo_:=Modules, t, P, E, Gf, Ef, i, cf=, u, v,
flux =flujo, cap=capacidad, elpaso, tmparcos=, min, valorviejo1, valorviejo2,
+ Etapa 0: Inicializacin +
P =G1; + Nodos +
E=G2; + Arcos +
+ Busco la fuente s y el vertedero t +
s=MinimalesP, E;
t=MaximalesP, E;
+Verifico que haya encontrado s y t +
IfLengths=0 Lengtht=0,
Print"Grafo invalido. Tiene que tener una fuente y un vertedero.";
ReturnNull;
, s=s1;t=t1;
;
Gf=G; + Etapa 1: Creo el grafo residual +
Ef=Gf2;
Fori=1, is LengthE, i++,
u =Ei1;v =Ei2; + u,v e E +
IfMemberQE, v, u=False, + si v,e E +
4 ford-fulkerson2.nb
+ Compelto la capacidadflujo con la inversa de los arcos en 0 +
cap=Appendcap, v - u, 0;
flux =Appendflux, v - u, 0;
Ef=AppendEf, v, u; + Agrego v,u a E
f
+
;
+ c
f
u,v=cu,v-fu,v +
cf=Appendcf, u - v, Funccap, u -v-Funcflux, u -v;
cf=Appendcf, v - u, Funccap, v -u-Funcflux, v -u;
;
+Etapa 2: Mientras S s,t en G
f
c
f
u,v > 0 v u,v e +
Forelpaso=Paso2P, Ef, s, t, cap, flux,
elpaso=!=Null, elpaso=Paso2P, Ef, s, t, cap, flux,
tmparcos=;
Fori=1, is Lengthelpaso-1, i++, +reconstruyo los arcos del paso +
tmparcos=Appendtmparcos, elpasoi, elpasoi+1;
;
+ Etapa 2.1: tmp=mincfu,v:u,ve +
min =MinTableFunccf, TOarctmparcosw, w, 1, Lengthtmparcos;
Fori=1, is Lengthtmparcos, i++, + 2.2 +
u =tmparcosi1;v =tmparcosi2;
valorviejo1=Funcflux, u - v;
valorviejo2=Funcflux, v - u;
flux =Complementflux, Casesflux, u - v, _;
flux =Complementflux, Casesflux, v - u, _;+Le quito el viejo+
flux =Appendflux, u - v, valorviejo1+min ; + 2.2.1 +
flux =Appendflux, v - u, valorviejo2-min ; + 2.2.2 +
;
;
+ Devuelvo solo los flujos de arcos de E +
Fori=1, is LengthEf, i++,
u =Efi1;v =Efi2;
IfMemberQE, u, v=False,
flux =Complementflux, Casesflux, u - v, _;
;
;
ReturnG, capacidad, flux;
;
Ejemplo 1
P1="A", "B", "C", "D";
E1="A", "B", "A", "C", "B", "C", "B", "D", "C", "D";
c1="A"- "B", 1000, "A"- "C", 1000, "B"- "C", 1, "B"- "D", 1000, "C"- "D", 1000;
f1="A"- "B", 0, "A"- "C", 0, "B"- "C", 0, "B"- "D", 0, "C"- "D", 0;
ford-fulkerson2.nb 5
GraphPlotc, VertexLabeling -True, DirectedEdges-True
1000
1000
1
1000
1000
A
B
C
D
FF=FordFulkersonP1, E1, c1, f1
A, B, C, D, A, B, A, C, B, C, B, D, C, D,
A B, 1000, A C, 1000, BC, 1, BD, 1000, C D, 1000,
A B, 1000, A C, 1000, BC, 0, BD, 1000, C D, 1000
ImprimirFlowNetworkFF
10001000
10001000
01
10001000
10001000
A
B
C
D
Ejemplo 2
P2=1, 2, 3, 4, 5, 6, 7, 8, 9;
E2=1, 2, 1, 3, 2, 4, 2, 3, 2, 5, 3, 6,
4, 7, 5, 3, 5, 7, 6, 5, 5, 8, 6, 8, 7, 8, 7, 9, 8, 9, 5, 4;
c2=1- 2, 16, 1- 3, 10, 2- 4, 7, 2- 3, 9, 2- 5, 7, 3- 6, 11, 4- 7, 4, 5- 3, 10,
5- 7, 4, 6- 5, 7, 5- 4, 5, 5- 8, 8, 6- 8, 9, 7- 8, 6, 7- 9, 12, 8- 9, 9;
f2=1- 2, 0, 1- 3, 0, 2- 4, 0, 2- 3, 0, 2- 5, 0, 3- 6, 0, 4- 7, 0, 5- 3, 0,
5- 7, 0, 6- 5, 0, 5- 4, 0, 5- 8, 0, 6- 8, 0, 7- 8, 0, 7- 9, 0, 8- 9, 0;
GraphPlotc2, VertexLabeling -True, DirectedEdges-True
16
10
7
9
7
11
4
10
4
5
8
7
9
6
12
9
1
2
3
4
5
6
7
8
9
6 ford-fulkerson2.nb
FF2=FordFulkersonP2, E2, c2, f2
1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 1, 3, 2, 4, 2, 3, 2, 5,
3, 6, 4, 7, 5, 3, 5, 7, 6, 5, 5, 8, 6, 8, 7, 8, 7, 9, 8, 9, 5, 4,
12, 16, 13, 10, 24, 7, 23, 9, 25, 7, 36, 11, 47, 4, 53, 10,
57, 4, 65, 7, 54, 5, 58, 8, 68, 9, 78, 6, 79, 12, 89, 9,
12, 4, 13, 13, 23, 0, 24, 4, 25, 0, 36, 13, 47, 4, 53, 0,
54, 0, 57, 4, 58, 0, 65, 4, 68, 9, 78, 0, 79, 8, 89, 9
ImprimirFlowNetworkFF2
416
1310
09
47
07
1311
44
010
05
44
08
47
99
06
812
99
1
2
3
4
5
6
7
8
9
J. T. Bassi - Mayo 2013.
ford-fulkerson2.nb 7

You might also like