e algoritmo do caminho de aumento mais curto de Ahuja e

Propaganda
Problema do Fluxo Máximo
Algoritmos
Algoritmo de Ford Fulkerson para o Fluxo Máximo
begin
x := 0 (inicializar o fluxo);
Construir a rede residual G(x);
while existir algum caminho orientado de s para t
em G(x) do
begin
seja P um caminho de aumento de s para t em G(x);
 := d(P);
enviar  unidades de fluxo ao longo de P;
actualizar as capacidades residuais r;
end
end {o fluxo x é máximo}.
Algoritmo de
Ford-Fulkerson
2
Exemplo
4
2
3
5
1
1
1
2
2
s
4
3
1
t
2
3
3
Algoritmo Ford-Fulkerson
begin
Etiquetar t
while t está etiquetado do
begin
retirar as etiquetas a todos os nodos;
Pred(j):=0 para todo j em N;
Etiquetar s e fazer LISTA:={s};
While LISTA OU t não está etiquetado do
begin
retirar um nodo i da lista;
for cada arco (i,j) da rede residual do
se rij > 0 e j não está etiquetado then
pred(j):=i; etiquetar j; LISTA:=LISTA{j};
end
If t está etiquetado then aumentaFluxo;
end
end
4
Algoritmo Ford-Fulkerson
Procedure aumentaFluxo;
begin
 use o vector pred para encontrar o caminho de
aumento P de s para t;
 d(P) = min{rij : (i,j)  P};
 aumente o fluxo ao longo de P em d(P) unidades
actualizando as capacidades residuais:
rij := rij - d(P) e rji := rji + d(P) para (i,j)  P
end
Algoritmo de
Ford-Fulkerson
5
Exemplo
4
2
3
5
1
1
1
2
2
s
4
3
1
t
2
3
6
Algoritmo do caminho de aumento + curto
begin
determinar as etiquetas distância d(i)
while d(s) < n do
begin
if existe um nodo i com d(i)  d(s) e sem arcos
admissíveis then Relabel(i)
else encontrar um caminho admissível de s para t e
aumentar o fluxo ao longo do caminho (usar pred)
end
end
Procedure Relabel(i)
begin
if i não tem arcos admissíveis then
d(i) := 1 + min {d(j) : rij > 0};
Algoritmo de Ahuja e Orlin
if d(s) > n-1, then exit;
end
7
Exemplo
4
2
3
5
1
1
1
2
4
s
4
3
1
t
2
3
Rede inicial e rede residual inicial.
8
Download