Problemas de Fluxo em Redes

Documentos relacionados
Pesquisa Operacional

Investigação Operacional

MATEMÁTICA DISCRETA. Patrícia Ribeiro 2018/2019. Departamento de Matemática, ESTSetúbal 1 / 47

Grafos Parte 1. Aleardo Manacero Jr.

Problema do Caminho Mínimo

Teoria dos Grafos Aula 5

Pesquisa Operacional. Teoria dos Grafos

Problema do Caminho Mais Curto. Problema do Caminho Mais Curto

C 3 C 3. De acordo com o teorema de Euler, um grafo não orientado admite um ciclo de Euler se e só for conexo e não tiver vértices de grau ímpar.

GRAFOS Aula 08 Árvore Geradora Mínima: Algoritmos de Kruskal e Prim-Jarnik Max Pereira

Teoria dos Grafos. Árvores Geradoras

Otimização. Otimização em Redes. Paulo Henrique Ribeiro Gabriel Faculdade de Computação Universidade Federal de Uberlândia 2016/2

Problema de Fluxo Máximo

MATEMÁTICA DISCRETA PARA ENGENHARIA DE COMPUTAÇÃO

Problemas de Fluxo Máximo

Algoritmos em Grafos COM11087-Tópicos Especiais em Programação I

Problema da Árvore Geradora Mínima (The Minimum Spanning Tree Problem-MST)

Investigação Operacional

ESTRUTURAS DISCRETAS (INF 1631) GRAFOS. 1. O que é um grafo? Defina um grafo orientado. Defina um grafo não-orientado.

CONCEITOS BÁSICOS EM GRAFOS

Estruturas de Dados Grafos

Otimização em Grafos

ESTRUTURAS DE DADOS. prof. Alexandre César Muniz de Oliveira. 1. Introdução 2. Pilhas 3. Filas 4. Listas 5. Árvores 6. Ordenação 7. Busca 8.

Elementos de Matemática Discreta

Volmir Eugênio Wilhelm Departamento de Engenharia de Produção UFPR 21

Árvores: Conceitos Básicos e Árvore Geradora

Conceitos Básicos da Teoria de Grafos

Grafos: árvores geradoras mínimas. Graça Nunes

Teoria dos Grafos. Edson Prestes

Módulo 2 OTIMIZAÇÃO DE REDES

Departamento de Engenharia de Produção UFPR 22

MÓDULO 2 - OTIMIZAÇÃO DE REDES

Cap. 2 Conceitos Básicos em Teoria dos Grafos

Grafos: componentes fortemente conexos, árvores geradoras mínimas

Definição e Conceitos Básicos

GRAFOS E ALGORITMOS TEORIA DE GRAFOS

Grafos: Busca. Algoritmos e Estruturas de Dados 2. Graça Nunes

Introdução à Teoria dos Grafos

TEORIA DOS GRAFOS TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS MATEMÁTICA DISCRETA II PROFº MARCOS NASCIMENTO

Oalgoritmo de Dijkstra

Problemas de Transportes e de Afectação

Algoritmo Floyd-Warshall. Problema dos caminhos mínimos entre todos os pares. Programação dinâmica

Faculdade de Engenharia Optimização. Prof. Doutor Engº Jorge Nhambiu

Optimização em Redes e Não Linear

Introdução à Teoria dos Grafos (MAC-5770) IME-USP Depto CC Profa. Yoshiko. Capítulo 3

Teorema 1 - Todo corte de arestas de um grafo conexo G contém pelo menos uma aresta em comum com qualquer árvore geradora de G. Exemplo 2 - Seja T:

2º Trabalho Prático - Algoritmos em grafos

Algoritmos em Grafos

GRAFOS Aula 07 Algoritmos de Caminho Mínimo: Bellman-Ford / Floyd-Warshall Max Pereira

CAP4. ELEMENTOS DA TEORIA DE GRAFOS. Grafo [graph]. Estrutura que consiste num par ordenado de conjuntos, G ( V, E) , sendo:

Gabriel Coutinho DCC035 - Pesquisa Operacional Lista 6

Grafos Orientados (digrafos)

Resolução de problemas difíceis de programação linear através da relaxação Lagrangeana

Definição 1.1 : Uma árvore é um grafo simples conexo e sem ciclos.

Grafos - Introdução. Pedro Ribeiro 2014/2015 DCC/FCUP. Pedro Ribeiro (DCC/FCUP) Grafos - Introdução 2014/ / 32

TGR BCC Representação Computacional de Grafos. Prof. Ricardo José Pfitscher

Teoria dos Grafos. Edson Prestes

UNIVERSIDADE DE SÃO PAULO INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO Departamento de Ciências de Computação

Prova Didática Grafos: Árvores Geradoras e Caminhos Mínimos, Análise de Complexidade

Teoria dos Grafos. Profa. Alessandra Martins Coelho

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 10: Introdução aos Grafos

Grafos: caminhos (matriz adjacência)

CAPÍTULO 3. Método Simplex

Teoria dos Grafos Aula 6

Teoria dos Grafos. Valeriano A. de Oliveira Socorro Rangel Departamento de Matemática Aplicada.

Grafos. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Matemática Discreta 10

Simplex. Investigação Operacional José António Oliveira Simplex

Investigação Operacional

Faculdade de Engenharia Optimização. Prof. Doutor Engº Jorge Nhambiu

CAPÍTULO 2. Grafos e Redes

2.3.4 Algoritmos de SAT

Teoria dos Grafos. Edson Prestes

Teoria dos Grafos AULA 3

Parte B Teoria dos Grafos

Teoria dos Grafos. Fluxo Máximo em Redes

INF 1010 Estruturas de Dados Avançadas

Transcrição:

CAPÍTULO 7 1. Conceitos fundamentais de grafos Em muitos problemas que nos surgem, a forma mais simples de o descrever, é representá-lo em forma de grafo, uma vez que um grafo oferece uma representação visual que trará vantagens na construção de um modelo matemático com vista à resolução do problema. Um grafo é uma estrutura constituída por dois conjuntos finitos : de vértices (nós ou nodos) e de arestas (arcos ou ramos). Um grafo pode ser representado por G = (N, A), em que N = {1,..., n} e A = {1,..., m} são os conjuntos de vértices e arestas, respectivamente, em que (A N N). Cada aresta é representado por um par (i, j), com i j e i, j N, em que i é o vértice origem e j o vértice destino. Uma aresta (i, j) diz-se não dirigida (não orientada), se (j, i) A e diz-se dirigida (orientada), se (j, i) A. Existem 3 tipos de grafos : orientado (dirigido) todas as arestas são dirigidas, não orientado (não dirigido) todas as arestas são não dirigidas e, misto algumas arestas são dirigidas e outras são não dirigidas. Um grafo diz-se completo, se entre quaisquer dois vértices existir uma aresta dirigida (grafos dirigidos) ou não dirigida (grafos não dirigidos). A densidade de um grafo é a razão entre a quantidade de arestas do grafo e a quantidade de arestas do grafo completo com o mesma quantidade de vértices. Dois vértices são adjacentes (vizinhos), se estiverem ligados por uma aresta. Duas arestas são adjacentes se forem ambas incidentes relativamente ao mesmo vértice. Um vértice é de ordem k, se tiver k arestas a ele adjacente.

90 Conceitos fundamentais de redes Considere-se dois vértices, S e T, do grafo G. Um caminho de S para T, é uma sucessão de vértices e arestas, p = [S = n 1, (n 1, n 2 ), n 2,..., (n h-1, n h ), n h = T]. No entanto, aquele caminho também pode ser representado apenas pela sucessão de vértices (p = [S = n 1, n 2,..., n h-1, n h = T]) ou de arestas (p = [(S, n 2 ),..., (n h-1, T)]). O caminho p diz-se simples, se cada vértice e aresta pertencem à sucessão uma única vez. Um ciclo é um caminho em que S = T. Num ciclo simples, todos os vértices são distintos. Um circuito (ciclo dirigido) é um ciclo formado por arestas dirigidas. Um grafo dirigido sem ciclos dirigidos, diz-se acíclico. Um grafo diz-se ligado (conexo), se existir um caminho entre quaisquer dois vértices. Uma árvore é um grafo orientado com um e um só caminho simples entre quaisquer dois vértices. Um subgrafo que seja uma árvore e contenha todos os vértices do grafo, é designado por árvore abrangente (árvore total Spanning Tree ). 2. Conceitos fundamentais de redes Quando se associam valores aos vértices e/ou às arestas, o grafo designa-se geralmente por rede. Neste caso, fala-se em nós (nodos) e arcos, e em vez de vértices e arestas, respectivamente. Uma rede pode ser representada por G = (N, A, C), em que (N, A) é um grafo e C corresponde ao conjunto de valores associados aos arcos ( comprimentos ) : ao arco (i, j) está associado o valor c ij. De uma maneira geral, os conceitos utilizados em grafos são extensíveis às redes. Considere-se um caminho p de S para T, na rede G. O comprimento do caminho p corresponde à soma dos comprimentos dos arcos que pertencem àquele caminho; ou seja, C (p) = c ij (i,j) p O conjunto de todos os caminhos de S para T, numa rede qualquer G, identifica-se por P. Define-se árvore mínima (árvore de caminhos mais curtos) com raiz em S, como a árvore que contém todos os nós de N acessíveis a partir de S, em que para cada nó n 2 o único caminho de S para n 2 é o caminho mais curto (de comprimento mínimo) na rede G que liga S a n 2.

O Problema do Caminho Mais Curto 91 3. O Problema do Caminho Mais Curto Os problemas de caminho mais curto, são fundamentais e frequentes quando se estuda redes de transportes e de comunicação. Este problema surge quando se pretende determinar o caminho mais curto, mais barato ou mais fiável, entre um ou vários pares de nós de uma rede. Existem três tipos de problemas de caminho mais curto : (i) de um nó para outro, (ii) de um nó para todos os outros, (iii) entre todos os pares de nós. No entanto, os dois primeiros são essencialmente o mesmo problema. Sejam S e T dois nós de uma rede G = (N, A, C), em que a cada arco é associado apenas um valor (comprimento do arco). O comprimento de um caminho de S para T, é a soma dos comprimentos dos arcos que o compõem. O problema do caminho mais curto entre os nós S e T, tem por objectivo determinar o caminho de valor mínimo existente em P. Ou seja, determinar p P tal que C(p) C(q), q P. Algumas observações relacionadas com este tipo de problemas : o comprimento de um caminho é maior do que o de qualquer dos seus subcaminhos; qualquer subcaminho de um caminho mais curto, é ele próprio um caminho mais curto (princípio da optimalidade); para uma rede com n nós, qualquer caminho mais curto tem no máximo n-1 arcos (no caminho mais curto entre dois nós, não existem nós repetidos). Matematicamente, este problema pode ser formulado da seguinte forma : Minimizar Z = c ij x ij i N j N sujeito a xsj = 1 j N xij x jk = 0, i N k N i N em que, x ij x it = 1 1, = 0, se (i, j) pertence se (i, j) j N {S, T} não pertence ao caminho ao caminho Existem vários algoritmos eficientes para resolver problemas de caminho mais curto, sendo os mais conhecidos os algoritmos de Dijkstra (i e ii) e de Floyd (iii).

92 O Problema do Caminho Mais Curto 3.1. Algoritmo de Dijkstra Este algoritmo, que foi apresentado por Dijkstra e que só pode ser aplicada a redes cujos arcos têm associados comprimentos não negativos, baseia-se num processo de rotulação dos nós da rede e classificação dos respectivos rótulos. A cada nó i é atribuído um rótulo [ξ i, π i ], o qual pode ser permanente ou temporário. Isto quer dizer o seguinte : [ξ i, π i ] permanente, representa o caminho mais curto de S para i ξ i nó que antecede i no caminho mais curto de S para i π i valor do caminho mais curto de S para i [ξ i, π i ] temporário, representa um caminho mais curto de S para i ξ i nó que antecede i no melhor caminho, até ao momento, de S para i π i valor do melhor caminho, até ao momento, de S para i O rótulo temporário de um nó representa um limite superior da distância mais curta de S a esse nó, uma vez que o caminho que lhe está associado pode ser ou não o mais curto. O algoritmo consiste em rotular os nós da rede, começando pelo S, de uma forma ordenada, segundo as distâncias de cada nó a S : escolher o nó com rótulo temporário com menor valor de π, que se torna permanente, para depois serem varridos todos os seus adjacentes, de forma a actualizar os rótulos destes (temporários). O algoritmo termina quando não existirem nós com rótulos temporários. Inicialmente apenas o nó S é permanente, sendo os restantes temporários. Algoritmo : Passo 1. [ξ S, π S ] = [S, 0] (caminho mais curto para S custa 0 e não tem nós intermédios) [ξ i, π i ] = [S, C Si ], i N { S } e (S, i) A [ξ i, π i ] = [, ], i N { S } e (S, i) A Temporários = N { S } (Temporários = conjunto de nós com rótulos temporários) Permanentes = { S } (Permanentes = conjunto de nós com rótulos permanentes) Se Temporários = (todos os nós têm rótulos permanentes) Então STOP k = nó de Temporários tal que π k é mínimo (k : π k = min { π x, x Temporários }) Temporários = Temporários { k } Permanentes = Permanentes { k } (k passou a permanente)

O Problema do Caminho Mais Curto 93 Para todo o j N tal que (k, j) A e j Temporários Fazer Se π k + C kj < π j Então π j = π k + C kj ξ j = k Regressar ao O algoritmo apresentado, determina o caminho mais curto entre um dado nó S e todos os outros nós da rede. Portanto, no fim do algoritmo, para se verificar se existe caminho entre S e um qualquer nó k, bastando analisar o valor de π k : se π k = então não existe caminho. Se existir caminho mais curto de S para k, este pode ser determinado percorrendo (em sentido inverso) a 1ª parte dos rótulos dos nós (ξ) de k até S, da seguinte forma : Caminho = { k } i = k Enquanto i S Fazer i = ξ i Caminho Caminho { i } Exemplo : Determinar o caminho mais curto entre o nó S = 1 e todos os outros nós da seguinte rede :

94 O Problema do Caminho Mais Curto Passo 1. Colocar rótulo permanente no nó 1 e rótulos temporários nos restantes nós. Permanentes = { 1 } Temporários = { 2, 3, 4, 5, 6, 7, 8 } k = 4, pois π 4 = min { π 2, π 3, π 4, π 5, π 6, π 7, π 8 } = min { 4, 5, 2, 12,,, } Permanentes = Permanentes { 4 } = { 1, 4 } Temporários = Temporários { 4 } = { 2, 3, 5, 6, 7, 8 } Varrer todos os nós adjacentes a 4, com rótulos temporários e actualizar os seus rótulos: π 3 = min { π 3, π 4 + C 43 } = min { 5, 2 + 1 } = 3 [ξ 3, π 3 ] = [4, 3] π 6 = min { π 6, π 4 + C 46 } = min {, 2 + 11 } = 13 [ξ 6, π 6 ] = [4, 13] k = 3, pois π 3 = min { π 2, π 3, π 5, π 6, π 7, π 8 } = min { 4, 3, 12, 13,, } Permanentes = Permanentes { 3 } = { 1, 3, 4 } Temporários = Temporários { 3 } = { 2, 5, 6, 7, 8 }

O Problema do Caminho Mais Curto 95 Varrer todos os nós adjacentes a 3, com rótulos temporários e actualizar os seus rótulos : π 2 = min { π 2, π 3 + C 32 } = min { 4, 3 + 3 } = 4 [ξ 3, π 3 ] = [1, 4] (sem alteração) π 8 = min { π 8, π 3 + C 38 } = min {, 3 + 13 } = 16 [ξ 8, π 8 ] = [3, 16] k = 2, pois π 2 = min { π 2, π 5, π 6, π 7, π 8 } = min { 4, 12, 13,, 16 } Permanentes = Permanentes { 2 } = { 1, 2, 3, 4 } Temporários = Temporários { 2 } = { 5, 6, 7, 8 } Varrer todos os nós adjacentes a 2, com rótulos temporários e actualizar os seus rótulos : π 5 = min { π 5, π 2 + C 25 } = min { 12, 4 + 1 } = 5 [ξ 5, π 5 ] = [2, 5] k = 5, pois π 5 = min { π 5, π 6, π 8 } = min { 5, 13, 16 } Permanentes = Permanentes { 5 } = { 1, 2, 3, 4, 5 } Temporários = Temporários { 5 } = { 6, 7, 8 }

96 O Problema do Caminho Mais Curto Varrer todos os nós adjacentes a 5, com rótulos temporários e actualizar os seus rótulos : π 7 = min { π 7, π 5 + C 57 } = min {, 5 + 6 } = 11 [ξ 7, π 7 ] = [5, 11] π 8 = min { π 8, π 5 + C 58 } = min { 16, 5 + 9 } = 14 [ξ 8, π 8 ] = [5, 14] k = 7, pois π 7 = min { π 6, π 7, π 8 } = min { 13, 11, 14 } Permanentes = Permanentes { 7 } = { 1, 2, 3, 4, 5, 7 } Temporários = Temporários { 7 } = { 6, 8 } Varrer todos os nós adjacentes a 7, com rótulos temporários e actualizar os seus rótulos : π 8 = min { π 8, π 7 + C 78 } = min { 14, 11 + 7 } = 14 [ξ 8, π 8 ] = [5, 14] (sem alteração) k = 6, pois π 6 = min { π 6, π 8 } = min { 13, 14 } Permanentes = Permanentes { 6 } = { 1, 2, 3, 4, 5, 6, 7 } Temporários = Temporários { 6 } = { 8 } Varrer todos os nós adjacentes a 6, com rótulos temporários e actualizar os seus rótulos : π 8 = min { π 8, π 6 + C 68 } = min { 14, 13 + 8 } = 14 [ξ 8, π 8 ] = [5, 14] (sem alteração) k = 8, pois π 8 = min { π 8 } = min { 14 } Permanentes = Permanentes { 8 } = { 1, 2, 3, 4, 5, 6, 7, 8 } Temporários = Temporários { 8 } = Não existem nós adjacentes a 8, com rótulos temporários.

O Problema do Caminho Mais Curto 97 Temporários = Fim do algoritmo. Resultados após o término do algoritmo : caminho mais curto entre os nós 1 e 8 calcula-se da seguinte forma : p = { 8 } i = 8 Como i 1 então { i = ξ i = ξ 8 = 5 ; p = p { i } = { 5, 8 } Como i 1 então { i = ξ i = ξ 5 = 2 ; p = p { i } = { 2, 5, 8 } Como i 1 então { i = ξ i = ξ 2 = 1 ; p = p { i } = { 1, 2, 5, 8 } Como i = 1 então termina o processo. Logo, o caminho mais curto entre 1 e 8 é p = { 1, 2, 5, 8 } e o comprimento é C(p) = 14 (= π 8 ). a árvore de caminho mais curto do nó 1 para todos os outros é a seguinte : e tem um comprimento total de 34 (Σ c ij na árvore de caminhos mais curtos). 3.2. Algoritmo de Floyd Ao pretender-se determinar o caminho mais curto entre todos os pares de nós, pode-se aplicar o algoritmo de Dijkstra n vezes, utilizando cada nó, sucessivamente, como origem. No entanto, existem outros algoritmos para resolver este problema, como é o caso do algoritmo de Floyd, desde que não haja circuitos negativos os arcos podem ter comprimentos negativos. Considere-se uma rede G = (N, A, D). Um arco (i, j) designa-se por arco básico, se constituir o caminho mais curto entre os nós i e j. Um caminho mais curto entre quaisquer dois nós da rede será totalmente constituído por arcos básicos (embora existam arcos básicos não pertencentes ao caminho mais curto). O algoritmo de Floyd utiliza a matriz D, de ordem n, das distâncias directas mais curtas entre nós. Os nós que não são adjacentes (não existe arco a ligá-los) têm associado uma distância directa

98 O Problema do Caminho Mais Curto infinita. Como os nós são (por convenção) adjacentes com eles próprios, têm associado um arco de comprimento 0. Os ciclos próprios são ignorados. Entre cada par de nós não ligados por um arco básico é criado um arco, através de um processo identificado por tripla ligação : d ij min { d ij, d ik + d kj } Fixando um k, a tripla ligação é efectuada para todos os nós i, j k. Após efectuar a tripla ligação para cada k N com i, j N { k }, a rede (na matriz D alterada ao longo deste processo) é apenas constituída por arcos básicos. Logo, o comprimento associado a cada arco dirigido do nó i ao nó k, é o caminho mais curto entre aqueles dois nós. Para conhecer todos os nós intermédios num dado caminho, mantém-se paralelamente uma matriz P, de ordem n, onde o elemento P ij representa o primeiro nó intermédio entre os nós i e j. Algoritmo : Passo 1. D = matriz das distâncias directas P ij = j, i, j N k 0 Se k n Então STOP k k + 1 Se D ij > D ik + D kj (i, j k não se considera a linha e a coluna k) Então D ij D ik + D kj P ij P ik No final, os elementos da matriz D são as distâncias mais curtas entre qualquer par de nós. Exemplo : Determinar o caminho mais curto entre todos os pares de nós da seguinte rede :

O Problema do Caminho Mais Curto 99 Passo 1. 0 8 5 1 2 3 D = 3 0 P= 1 2 3 2 0 1 2 3 k = 0 0 3 (n = 3) Falso k = k + 1 = 1 D 22 < D 21 + D 12 (0 < 3 + 8 = 11) D 23 > D 21 + D 13 ( > 3 + 5 = 8) D 23 = D 21 + D 13 = 8; P 23 = P 21 = 1 D 32 < D 31 + D 12 (2 < + 8) D 33 < D 31 + D 13 (0 < + 5) 0 8 5 1 2 3 D= 3 0 8 P= 1 2 1 2 0 1 2 3 1 3 Falso k = k + 1 = 2 D 11 < D 12 + D 21 (0 < 8 + 3 = 11) D 13 < D 12 + D 23 (5 < 8 + 8 = 16) D 31 > D 32 + D 21 ( > 2 + 3 = 5) D 31 = D 32 + D 21 = 5; P 31 = P 32 = 2 D 33 < D 32 + D 23 (0 < 2 + 8) 0 8 5 1 2 3 D= 3 0 8 P= 1 2 1 5 2 0 2 2 3 2 3 Falso k = k + 1 = 3 D 11 < D 13 + D 31 (0 < 5 + 5 = 10) D 12 > D 13 + D 32 (8 > 5 + 2= 7) D 12 = D 13 + D 32 = 7; P 12 = P 13 = 3 D 21 < D 23 + D 31 (3 < 8 + 3 = 11)

100 O Problema da Árvore Abrangente Mínima -- algoritmos de PRIM D 22 < D 23 + D 32 (0 < 8 + 2) 0 7 5 D= 3 0 8 5 2 0 3 3 Verdadeiro STOP (termina o algoritmo) 1 3 3 P= 1 2 1 2 2 3 Resultados após o final do algoritmo : o comprimento do caminho mais curto entre os nós 1 e 2 é 7 (D 12 = 7); o caminho mais curto entre os nós 1 e 2 é { 1, 3 (P 12 = 3), 2 (P 32 = 2) }. 4. O Problema da Árvore Abrangente Mínima -- algoritmos de PRIM A árvore abrangente mínima ( Minimum Spanning Tree ), é a árvore abrangente com o menor comprimento entre todas as árvores abrangentes. O comprimento de uma árvore abrangente é o somatório dos comprimentos associados aos respectivos arcos. Note-se que, em geral, a árvore abrangente mínima é diferente da árvore de caminho mais curto entre um nó origem e todos os outros nós da rede (calculada pelo algoritmo de Dijkstra). Algoritmo 1 : Passo 1. Toma-se arbitrariamente um nó S e atribui-se-lhe um rótulo permanente nulo : π S = 0. Aos restantes nós da rede atribuem-se rótulos temporários : π j = C Sj π j = se (S, j) A se (S, j) A Permanentes = { S } Temporários = N { S } k = nó com rótulo temporário que possua menor valor (que é vizinho de um nó i); Permanentes = Permanentes { k } Temporários = Temporários { k } O arco com o mínimo valor C ik = π k passa a fazer parte da árvore abrangente mínima Se Temporários = Então STOP (foi determinada a árvore abrangente mínima)

O Problema da Árvore Abrangente Mínima -- algoritmos de PRIM 101 Para todo o j N tal que (k, j) A e j Temporários Fazer π j = min { π j, C kj } Voltar ao Exemplo : Determinar a árvore abrangente mínima da seguinte rede : Passo 1. Colocar rótulo permanente no nó 1 e rótulos temporários nos restantes nós : π 1 = 0 π 2 = 4; π 3 = 5; π 4 = 2; π 5 = 12 π 6 = π 7 = π 8 = Permanentes = { 1 } Temporários = { 2, 3, 4, 5, 6, 7, 8 } k = 4 Permanentes = Permanentes { 4 } = { 1, 4 } Temporários = Temporários { 4 } = { 2, 3, 5, 6, 7, 8 } O arco (1, 4) passa a fazer parte da árvore abrangente mínima, pois C 14 = π 4 = 2 π 3 = min { 5, 1 } = 1 π 6 = min {, 11 } = 11 k = 3 Permanentes = Permanentes { 3 } = { 1, 4, 3 } Temporários = Temporários { 3 } = { 2, 5, 6, 7, 8 } O arco (4, 3) passa a fazer parte da árvore abrangente mínima, pois C 43 = π 3 = 1

102 O Problema da Árvore Abrangente Mínima -- algoritmos de PRIM π 2 = min { 4, 3 } = 3 π 8 = min {, 13 } = 13 k = 2 Permanentes = Permanentes { 2 } = { 1, 4, 3, 2 } Temporários = Temporários { 3 } = { 5, 6, 7, 8 } O arco (3, 2) passa a fazer parte da árvore abrangente mínima, pois C 32 = π 2 = 3 π 5 = min { 12, 1 } = 1 k = 5 Permanentes = Permanentes { 5 } = { 1, 4, 3, 2, 5 } Temporários = Temporários { 5 } = { 6, 7, 8 } O arco (2, 5) passa a fazer parte da árvore abrangente mínima, pois C 25 = π 5 = 1 π 7 = min {, 6 } = 6 π 8 = min { 13, 9 } = 9 k = 7 Permanentes = Permanentes { 6 } = { 1, 4, 3, 2, 5, 7 } Temporários = Temporários { 7 } = { 6, 8 } O arco (5, 7) passa a fazer parte da árvore abrangente mínima, pois C 57 = π 7 = 6 π 8 = min { 9, 7 } = 7 k = 8 Permanentes = Permanentes { 8 } = { 1, 4, 3, 2, 5, 7, 8 } Temporários = Temporários { 8 } = { 6 } O arco (7, 8) passa a fazer parte da árvore abrangente mínima, pois C 78 = π 8 = 7 π 6 = min { 11, 8 } = 8

O Problema da Árvore Abrangente Mínima -- algoritmos de PRIM 103 k = 6 Permanentes = Permanentes { 6 } = { 1, 4, 3, 2, 5, 7, 8, 6 } Temporários = Temporários { 6 } = O arco (8, 6) passa a fazer parte da árvore abrangente mínima, pois C 86 = π 6 = 8 Como Temporários = STOP (foi determinada a árvore abrangente mínima) Resultados após o final do algoritmo : a árvore abrangente mínima (árvore que visita todos os nós) é a seguinte : a árvore abrangente mínima tem um comprimento total igual a 28 (2 + 1 + 3 + 1 + 6 + 7 + 8). Existe uma outra versão do algoritmo de PRIM, que opera sobre a matriz das distâncias (custos) da rede. Algoritmo 2 : Passo 1. Riscar a 1ª coluna e marcar a 1ª linha. Seleccionar o menor elemento (C ij ) das linhas marcadas (não considerar as colunas riscadas). Se tiverem todas as colunas riscadas, STOP foi determinada a árvore abrangente mínima. Riscar a coluna j e marcar a linha j. Voltar ao Os arcos que constituem a árvore abrangente mínima, são os correspondentes aos seleccionados, e o seu valor é o somatório daqueles C ij.

104 O Problema da Árvore Abrangente Mínima -- algoritmos de PRIM Exemplo : Determinar o árvore abrangente mínima da rede do exemplo apresentado neste capítulo. Passo 1. Riscar a 1ª coluna e marcar a 1ª linha : 1 2 3 4 5 6 7 8 1 0 4 5 2 12 2 4 0 3 1 3 5 3 0 1 4 2 1 0 13 5 12 1 0 6 9 6 11 0 8 7 6 0 7 8 13 9 8 7 0 O menor elemento não riscado da linha 1 (a única seleccionada) é : C 14 = 2 Riscar a 4ª coluna e marcar a 4ª linha : 1 2 3 4 5 6 7 8 1 0 4 5 2 12 2 4 0 3 1 3 5 3 0 1 4 2 1 0 13 5 12 1 0 6 9 6 11 0 8 7 6 0 7 8 13 9 8 7 0 O menor elemento não riscado das linhas 1 e 4 (as seleccionadas) é : C 43 = 1 Riscar a 3ª coluna e marcar a 3ª linha : 1 2 3 4 5 6 7 8 1 0 4 5 2 12 2 4 0 3 1 3 5 3 0 1 4 2 1 0 13 5 12 1 0 6 9 6 11 0 8 7 6 0 7 8 13 9 8 7 0

O Problema da Árvore Abrangente Mínima -- algoritmos de PRIM 105 O menor elemento não riscado das linhas 1, 3 e 4 (as seleccionadas) é : C 32 = 3 Riscar a 2ª coluna e marcar a 2ª linha : 1 2 3 4 5 6 7 8 1 0 4 5 2 12 2 4 0 3 1 3 5 3 0 1 4 2 1 0 13 5 12 1 0 6 9 6 11 0 8 7 6 0 7 8 13 9 8 7 0 O menor elemento não riscado das linhas 1, 2, 3 e 4 (as seleccionadas) é : C 25 = 1 Riscar a 5ª coluna e marcar a 5ª linha : 1 2 3 4 5 6 7 8 1 0 4 5 2 12 2 4 0 3 1 3 5 3 0 1 4 2 1 0 13 5 12 1 0 6 9 6 11 0 8 7 6 0 7 8 13 9 8 7 0 O menor elemento não riscado das linhas 1, 2, 3, 4 e 5 (as seleccionadas) é : C 57 = 6 Riscar a 7ª coluna e marcar a 7ª linha : 1 2 3 4 5 6 7 8 1 0 4 5 2 12 2 4 0 3 1 3 5 3 0 1 4 2 1 0 13 5 12 1 0 6 9 6 11 0 8 7 6 0 7 8 13 9 8 7 0

106 O Problema da Árvore Abrangente Mínima -- algoritmos de PRIM O menor elemento não riscado das linhas 1, 2, 3, 4, 5 e 7 (as seleccionadas) é : C 78 = 7 Riscar a 8ª coluna e marcar a 8ª linha : 1 2 3 4 5 6 7 8 1 0 4 5 2 12 2 4 0 3 1 3 5 3 0 1 4 2 1 0 13 5 12 1 0 6 9 6 11 0 8 7 6 0 7 8 13 9 8 7 0 O menor elemento não riscado das linhas 1, 2, 3, 4, 5, 7 e 8 (as seleccionadas) é : C 86 = 8 Riscar a 6ª coluna e marcar a 6ª linha : 1 2 3 4 5 6 7 8 1 0 4 5 2 12 2 4 0 3 1 3 5 3 0 1 4 2 1 0 13 5 12 1 0 6 9 6 11 0 8 7 6 0 7 8 13 9 8 7 0 Como todas as colunas se encontram riscadas, então STOP foi determinada a árvore abrangente mínima. Resultados no final do algoritmo : A árvore abrangente mínima é constituída pelos seguintes arcos : (1, 4), (2, 5), (3, 2), (4, 3), (5, 7), (7, 8) e (8, 6) O valor da árvore abrangente mínima é : 2 + 1 + 3 + 1 + 6 + 7 + 8 = 28 Como se pode verificar, a árvore é a mesma que foi determinada pela versão anterior.

O Problema do Fluxo Máximo -- algoritmo de Ford-Fulkerson 107 5. O Problema do Fluxo Máximo -- algoritmo de Ford-Fulkerson Neste capítulo, será estudado o problema de fluxo máximo numa rede G. Os valores associados aos arcos desta rede, b ij, representam as respectivas capacidades, isto é, a quantidade máxima de fluxo que pode ser enviada pelos arcos. Estes valores terão que ser positivos (b ij 0). Portanto, podese definir a rede da seguinte forma : G = (N, A, B), em que B = [b ij ]. Em problemas de fluxo máximo, existem 2 nós especiais : nó origem e nó terminal. Com a resolução do problema de fluxo máximo, pretende-se determinar a quantidade máxima de unidades de fluxo que podem ser enviados de um nó origem S para um nó terminal T. O fluxo no arco (i, j) é designado por x ij. Devido às restrições de capacidade nos arcos, tem-se o conjunto de restrições : 0 x ij b ij, para todo (i, j) A [1] Além disso, em cada nó (excepto em S e T) deve haver conservação de fluxo : a quantidade de fluxo que chega a um nó é igual à quantidade de fluxo que sai desse nó; ou seja, = x ij x jk i k para todo j S, T [2] Como existe conservação de fluxo em todos os nós, o fluxo que sai do nó S é igual ao fluxo que chega ao nó T; isto é, x Si = f = onde f é o valor de fluxo i j x jt Portanto, com a resolução do problema de fluxo máximo, pretende-se determinar o valor do fluxo nos arcos x ij [1], que maximize o valor do fluxo f, sujeito às restrições de capacidade [2] e de conservação de fluxo [3]. Matematicamente, este problema pode ser formulado da seguinte forma : Maximizar sujeito a f = x Sj j x ij = x jk para todo j S, T [2] i k x Si = x jt [3] i j 0 x ij b ij, para todo (i, j) A [1] Dado um caminho qualquer de S para T numa rede, p = [ S = n 1, n 2, n 3,..., n k-1, n k = T ], [3]

108 O Problema do Fluxo Máximo -- algoritmo de Ford-Fulkerson a quantidade máxima de fluxo que pode ser enviada de S para T, satisfazendo [1], [2] e [3], por aquele caminho, é a seguinte : min { b ij : (i, j) p }. Logo, o arco com a menor capacidade fica saturado, não podendo passar mais fluxo por ele. Um corte ( cut ) é o conjunto de todos os arcos de um subconjunto de nós para o seu complementar : o corte ( X, X) é o conjunto de todos os arcos (i, j), tal que i X e j X. A remoção de todos os arcos do corte, desliga a rede em duas ou mais partes. A capacidade de um corte é : CX (, X) = b, comi Xe j X. (,) i j ij Em geral, CXX (, ) CXX (, ). Um corte separando S de T, com uma capacidade mínima, designa-se por corte mínimo. Teorema do fluxo máximo corte mínimo ( max flow min cut ). Para qualquer rede com capacidades de valor inteiro associadas aos arcos, o fluxo máximo do nó origem S, para o nó terminal T, é igual à capacidade de um corte mínimo que separa S de T. Enquanto existir um caminho de aumento de fluxo (c.a.f.) satisfazendo uma das condições : x ij < b ij arco forward (sentido correcto) : pode enviar-se fluxo adicional de i para j, x ji > 0 arco backward (sentido inverso) : pode enviar-se fluxo adicional de i para j, diminuindo o fluxo que existe de j para i, é possível aumentar a quantidade de fluxo a enviar de S para T. Assumindo que as capacidades dos arcos são valores inteiros, definido um caminho de aumento de fluxo constituído por arcos forward e arcos backward, o fluxo a enviar de S para T pode ser alterado de ε unidades : ε = min { ε 1, ε 2 } [inteiro positivo] com ε 1 = min { b ij x ij } nos arcos forward do c.a.f. ε 2 = min { x ji } nos arcos backward do c.a.f. O valor do fluxo é, então, aumentado em ε unidades nos arcos forward e diminuído em ε unidades nos arcos backward. Como a capacidade de um corte mínimo é um número finito e em cada caminho de aumento de fluxo, o fluxo é aumentado de pelo menos 1 unidade, o fluxo máximo obtém-se após um número finito de iterações. Um fluxo é máximo, se e só se, não existir um caminho de aumento de fluxo.

O Problema do Fluxo Máximo -- algoritmo de Ford-Fulkerson 109 Algoritmo de Ford Fulkerson : Este algoritmo, é um modo sistemático de pesquisar todos os possíveis c.a.f. de S para T, atribuindo rótulos aos nós para indicar a direcção em que o fluxo pode ser aumentado. Cada nó pode estar num dos 3 estados : rotulado e varrido tem um rótulo e todos os seus vizinhos estão rotulados; rotulado e não varrido tem um rótulo, mas nem todos os seus vizinhos estão rotulados; não rotulado não tem rótulo. O rótulo do nó j tem 2 partes : [i +, ε(j)] (ou [i, ε(j)]), em que, i + (ou i ) : índice de um nó i, indicando que pode-se enviar fluxo de i para j (ou de j para i) ε(j) : fluxo máximo adicional que se pode enviar de S para j. Algoritmo : Passo 1. S [S +, ] S fica rotulado e varrido (processo de rotulação) j (rotulado e não varrido) [i +, ε(j)] ou [i, ε(j)] Para todo o k N tal que (j, k) A e x jk < b jk Fazer k [j +, ε(k)] com ε(k) = min { ε(j), b jk x jk } Para todo o k N tal que (k, j) A e x kj > 0 Fazer k [j, ε(k)] com ε(k) = min { ε(j), x kj } j fica rotulado e varrido. Todos os k ficam rotulados e não varridos. Se (T está rotulado) ou (não é possível rotular T) Então (foi determinado um c.a.f.) ou (não existe c.a.f. o fluxo actual é máximo) Senão Regressar ao Passo 2 (início) (mudança de fluxo) T [k +, ε(t)] x kt = x kt + ε(t) Enquanto k S Fazer Se k [j +, ε(k)] Se k [j, ε(k)] x jk = x jk + ε(t) x kj = x kj ε(t) k j Apagar os rótulos e regressar ao Passo 1.

110 O Problema do Fluxo Máximo -- algoritmo de Ford-Fulkerson Exemplo : Considere a rede em baixo, onde os valores correspondem às capacidades e ao fluxo nos arcos. Pretende-se determinar o fluxo máximo a enviar do nó 1 para o nó 4, atendendo a que o fluxo actual enviado entre aqueles 2 nós é de 2 unidades. Passo 1. Fluxo actual = 2 1 [1 +, ] RotuladosVarridos = RotuladosNãoVarridos = { 1 } NãoRotulados = { 2, 3, 4 } j 1 (rotulado e não varrido) Vizinhos (não rotulados) do nó 1 : 2 e 3. 2 não pode ser rotulado, pois b 12 = x 12 3 [1 +, min { ε(1), b 12 x 12 }] [1 +, min {, 1 }] [1 +, 1] RotuladosVarridos = { 1 } RotuladosNãoVarridos = { 3 } NãoRotulados = { 2, 4 } j 3 (rotulado e não varrido) Vizinhos (não rotulados) do nó 3 : 2 e 4. 2 [3, min { ε(3), x 23 }] [3, min { 1, 1 }] [3, 1] 4 não pode ser rotulado, pois b 34 = x 34 RotuladosVarridos = { 1, 3 } RotuladosNãoVarridos = { 2 } NãoRotulados = { 4 }

O Problema do Fluxo Máximo -- algoritmo de Ford-Fulkerson 111 j 2 (rotulado e não varrido) Vizinhos (não rotulados) do nó 2 : 4. 4 [2 +, min { ε(2), b 24 x 24 }] [2 +, min { 1, 3 }] [2 +, 1] RotuladosVarridos = { 1, 3, 2 } RotuladosNãoVarridos = { 4 } NãoRotulados = Como T = 4 foi rotulado, foi determinado um caminho de aumento de fluxo. (mudança de fluxo : o aumento de fluxo é de ε(4) = 1 unidades) fluxo = fluxo + ε(4) =2 + 1 = 3 4 [2 +, 1] x 24 = x 24 + ε(4) = 0 + 1 = 1 2 [3, 1] x 23 = x 23 ε(4) = 1 1 = 0 3 [1 +, 1] x 13 = x 13 + ε(4) = 1 + 1 = 2 Passo 1. Fluxo actual = 3 1 [1 +, ] RotuladosVarridos = RotuladosNãoVarridos = { 1 } NãoRotulados = { 2, 3, 4 } j 1 (rotulado e não varrido) Vizinhos (não rotulados) do nó 1 : 2 e 3. 2 não pode ser rotulado, pois b 12 = x 12 3 não pode ser rotulado, pois b 13 = x 13 Como não é possível rotular mais nenhum nó, e como o nó T = 4 não foi rotulado, então não existe caminho de aumento de fluxo; logo, o fluxo actual é máximo.

112 O Problema do Fluxo Máximo -- algoritmo de Ford-Fulkerson Resultados a retirar após o final do algoritmo : Fluxo máximo = 3. X = { 1 } X = { 2, 3, 4 } C(X, X) = b 12 + b 13 = 3 = Fluxo máximo