180 likes | 349 Vues
Problemas de Fluxo Máximo. Objecto de Aprendizagem. 2010. Problemas de Fluxo Máximo. Definição: Dada uma rede, com um nó de entrada e um nó de saída, com capacidades associadas a cada ramo, pretende-se saber qual é o fluxo máximo, de um certo bem, que se pode enviar da entrada para a saída.
E N D
Problemas de Fluxo Máximo Objecto de Aprendizagem 2010
Problemas de Fluxo Máximo Definição: Dada uma rede, com um nó de entrada e um nó de saída, com capacidades associadas a cada ramo, pretende-se saber qual é o fluxo máximo, de um certo bem, que se pode enviar da entrada para a saída. Modelo: xij – fluxo que passa no ramo (i, j), de i para j cij – capacidade do ramo (i, j) Nó 1 – nó de entrada Nó t – nó de saída Sujeito a: (equilíbrio de fluxos nos nós) (restrições de capacidade)
Exemplo de um problema de Fluxo Máximo nó 1 Nó de entrada = nó 4 Nó de saída = Capacidades totais dos ramos: Ramo 1 2 = 9 4 1 Ramo 1 3 = 8 2 Ramo 2 3 = 3 (7) (9) Ramo 2 4 = 7 Ramo 3 4 = 9 (3) (8) (9) 3
Algoritmo de fluxo máximo 1. Injectar um fluxo nulo (f = 0) no nó de entrada; 2.Fixar as capacidades utilizadas dos ramos em 0 (zero); 3.Seleccionar um caminho não saturado (caminho com capacidade 0) entre o nó de entrada e o nó de saída. Se não existir nenhum, foi encontrada a solução óptima;. 4.Somar ao fluxo de entrada um fluxo igual à capacidade do caminho seleccionado; 5.Alterar as capacidades utilizadas dos ramos do caminho seleccionado, somando-lhes o fluxo injectado; Capacidade total do ramo Capacidade utilizada do ramo 4 1 Caminho 1: capacidade = 7 2 6.Voltar ao ponto 3. Caminho 2:capacidade = 3 (0, 7) (7) (0, 9) (9) Vamos, por exemplo, seleccionar o caminho não saturado 1 34, com capacidade disponível = min (8; 9) = 8 Caminho: conjunto de ramos unindo o nó de entrada ao nó de saída, e que não passa duas vezes pelo mesmo nó. f = 0 f = 0 (3) (0, 3) f = 0+8 = 8 f = 0+8 = 8 Capacidade de um caminho: menor capacidade disponível de entre todos os ramos que fazem parte do caminho. (8) (9) (0, 8) (8, 8) (0, 9) (8, 9) 3 Caminho 3: capacidade = 8 Caminho saturado: caminho com capacidade disponível nula
Algoritmo de fluxo máximo (cont.) 3.Seleccionar um caminho não saturado (caminho com capacidade 0) entre o nó de entrada e o nó de saída. Se não existir nenhum, foi encontrada a solução óptima;. 4.Somar ao fluxo de entrada um fluxo igual à capacidade do caminho seleccionado; 5.Alterar as capacidades utilizadas dos ramos do caminho seleccionado, somando-lhes o fluxo injectado; 6.Voltar ao ponto 3. Vamos seleccionar o caminho não saturado 1 23 4, com capacidade disponível = min (9; 7) = 7 4 1 2 (0, 7) (7, 7) (7, 9) (0, 9) (0, 3) f = 8+7= 15 f = 8 f = 8+7 = 15 f = 8 (8, 8) (8, 9) 3
Algoritmo de fluxo máximo (cont.) 3.Seleccionar um caminho não saturado (caminho com capacidade 0) entre o nó de entrada e o nó de saída. Se não existir nenhum, foi encontrada a solução óptima;. 4.Somar ao fluxo de entrada um fluxo igual à capacidade do caminho seleccionado; 5.Alterar as capacidades utilizadas dos ramos do caminho seleccionado, somando-lhes o fluxo injectado; 6.Voltar ao ponto 3. Vamos, seleccionar o caminho não saturado 1 23 4 4 1 Não existe nenhum caminho não saturado. Logo, foi encontrada a solução óptima 2 Capacidades disponíveis dos ramos deste caminho: (8, 9) (7, 9) (7, 7) ramo 1 2: capacidade = 9 – 7 = 2 ramo 2 3: capacidade = 3 – 0 = 3 ramo 3 4: capacidade = 9 – 8 = 1 f = 15 f = 16 (1, 3) (0, 3) f = 15+1 = 16 f =15+1=16 f = 15 f = 16 Capacidade disponível do caminho 1 2 3 4 = min (2; 3; 1) =1 (8, 8) (9, 9) (8, 9) 3
Algoritmo de fluxo máximo (cont.) Vamos agora saturar os caminhos por uma ordem diferente. O que acontecerá? 1. Injectar um fluxo nulo (f = 0) no nó de entrada; 2.Fixar as capacidades utilizadas dos ramos em 0 (zero); 3.Seleccionar um caminho não saturado (caminho com capacidade 0) entre o nó de entrada e o nó de saída. Se não existir nenhum, foi encontrada a solução óptima;. 4.Somar ao fluxo de entrada um fluxo igual à capacidade do caminho seleccionado; 5.Alterar as capacidades utilizadas dos ramos do caminho seleccionado, somando-lhes o fluxo injectado; 4 1 2 6.Voltar ao ponto 3. (0, 7) (7) (3, 9) (0, 9) (9) f = 0 f = 0 (3, 3) (3) (0, 3) f = 0+3 = 3 f = 0+3 = 3 Vamos seleccionar o caminho não saturado 1 2 34, com capacidade disponível = min (9; 3; 9) = 3 (8) (9) (0, 8) (0, 9) (3, 9) 3
Algoritmo de fluxo máximo (cont.) 3.Seleccionar um caminho não saturado (caminho com capacidade 0) entre o nó de entrada e o nó de saída. Se não existir nenhum, foi encontrada a solução óptima;. 4.Somar ao fluxo de entrada um fluxo igual à capacidade do caminho seleccionado; 5.Alterar as capacidades utilizadas dos ramos do caminho seleccionado, somando-lhes o fluxo injectado; 6.Voltar ao ponto 3. Vamos seleccionar, por exemplo, o caminho não saturado 1 2 4 4 1 2 (0, 7) (7) (6, 7) (9, 9) (3, 9) (0, 9) (9) Capacidades disponíveis dos ramos deste caminho: ramo 1 2: capacidade = 9 – 3 = 6 f = 3 ramo 2 4: capacidade = 7 – 0 = 7 f = 3 f = 3+6 = 9 (3, 3) (3) f = 3+6= 9 (0, 3) Capacidade disponível do caminho 1 2 4 = min (6; 7) = 6 (8) (9) (0, 8) (0, 9) (3, 9) 3
Algoritmo de fluxo máximo (cont.) 3.Seleccionar um caminho não saturado (caminho com capacidade 0) entre o nó de entrada e o nó de saída. Se não existir nenhum, foi encontrada a solução óptima;. Aparentemente não há nenhum caminho não saturado, mas o fluxo máximo agora obtido (f = 15) é menor do que no caso anterior (f = 16). Como é que isto é possível , já que o algoritmo é de optimização? 4 1 2 (0, 7) (7) (6, 7) (9, 9) (3, 9) (0, 9) (9) f = 9 f = 15 (3, 3) (3) (0, 3) f =15 (8) (9) (0, 8) (6, 8) (0, 9) (9, 9) (3, 9) 3
Algoritmo de fluxo máximo (cont.) De facto, o exemplo anterior não está completamente resolvido (até à optimalidade) porque existe ainda um caminho não saturado. Para se encontrar esse caminho não saturado é necessário considerar o conceito de “fluxo negativo", isto é, fluxo que atravessa os ramos no sentido contrárioà sua orientação. Uma das restrições apresentadas no modelo do problema de fluxo máximo impunha que todos os fluxos fossem positivos ou nulos (xij 0). E de facto, na solução final, tal terá sempre que acontecer. No entanto, essa solução final obtém-se pela adição dos vários fluxos que vamos injectando na rede. Alguns desses fluxospoderão atravessar algum ramo no sentido contrário ao indicado, devendo nesse caso ser contabilizados como negativos. O resultado final (soma de todos os fluxos que foram injectados nesse ramo) é que terá que ser positivo ou nulo. No fundo, um “fluxo negativo" mais não é do que deixar de fazer passar fluxo por esse ramo. Observando a rede deste ponto de vista, verifica-se que o caminho 1 3 2 4 não está saturado, pois: 4 1 2 o ramo 1 3tem uma capacidade de 2 = (8 – 6). (6, 7) (3, 9) (9, 9) (0, 9) (9) o ramo 2 3está saturado no sentido do nó 2 para o nó 3; mas no sentido do nó 3 para o nó 2 tem uma capacidade de 3 (igual à capacidade que está a ser utilizada no sentido do nó 2 para o nó 3) isto é, podemos deixar de fazer passar, do nó 2 para o nó 3, até 3 unidades (que é fluxo actual). f = 9 (3, 3) f = 15 f =15 (9) (6, 8) (0, 9) (9, 9) (3, 9) o ramo 2 4tem uma capacidade de 1 = (7 – 6). 3 Logo, a capacidade do caminho 1 3 2 4 é de 1 = min (2; 3, 1)
Algoritmo de fluxo máximo (cont.) 3.Seleccionar um caminho não saturado (caminho com capacidade 0) entre o nó de entrada e o nó de saída. Se não existir nenhum, foi encontrada a solução óptima;. 4.Somar ao fluxo de entrada um fluxo igual à capacidade do caminho seleccionado; 5.Alterar as capacidades utilizadas dos ramos do caminho seleccionado, somando-lhes o fluxo injectado; 6.Voltar ao ponto 3. Seleccionamos então o caminho não saturado 1 3 2 4 (com capacidade = 1) 4 1 2 (7, 7) (6, 7) (3, 9) (9, 9) (0, 9) (9) f =15 f = 15 f = 15+1 =16 (3, 3) (2, 3) f =15+1=16 Vejamos com maior detalhe o que realmente se passa nesta iteração (9) (6, 8) (7, 8) (0, 9) (3, 9) (9, 9) 3
Algoritmo de fluxo máximo (cont.) Como se viu antes, a capacidade do caminho 1 3 2 4 é de 1 unidade. Vai-se então enviar uma unidade por esse caminho: 1º Enviar 1 unidade do nó 1 para o nó 3. Essa unidade enviada do nó 1 para o nó 3, não pode depois ser enviada pelo ramo 3 4, pois este ramo está saturado neste sentido. Então que fazer? A única forma de ultrapassar este problema é fazer com que uma das unidades que é presentemente enviada por 2 3 4, passe a ser enviada por 2 4, de forma a libertar uma unidade da capacidade do ramo 3 4. Corrigindo as capacidades utilizadas dos ramos obtém-se: 1 2 Utiliza-se depois essa unidade, assim libertada (da capacidade do ramo 3 4), para fazer fluir do nó 3 para o nó 4 a unidade que enviamos antes do nó 1 para o nó 3. (6, 7) (7, 7) (3, 9) (9, 9) (0, 9) (9) f = 15 f = 9 4 f = 15+1=16 (2, 3) (3, 3) f =15 O procedimento descrito é equivalente a: (6, 8) (7, 8) (9, 9) (8, 9) (9, 9) 2º Enviar 1 unidade do nó 3 para o nó 2. 3 3º Enviar 1 unidade do nó 2 para o nó 4.
Teorema do Fluxo Máximo – Corte Mínimo: Como saber se a rede está na situação de fluxo máximo? (ou seja, se a solução em presença é óptima) • através do Teorema do Fluxo Máximo – Corte Mínimo: • Uma rede está na situação de fluxo máximo se existir um corte mínimo, isto é, que separa a entrada da saída da rede, e que só atravessa: • ramos orientados da entrada para a saída saturados, e • ramos orientados da saída para a entrada com fluxo nulo • O fluxo máximo é, nestas condições, igual à capacidade do corte mínimo Ver conceitos 1 Capacidade do corte mínimo = 7 + 9 = 16 2 (6, 7) (7, 7) (3, 9) (9, 9) (0, 9) (9) Como a capacidade do corte mínimo (16) é igual ao fluxo actual (f =16) a solução é óptima 4 (2, 3) (3, 3) f = 16 f = 16 (7, 8) (6, 8) (9, 9) (8, 9) (9, 9) 3 corte mínimo
Teorema do Fluxo Máximo – Corte Mínimo Se analisarmos a solução anterior à óptima (com f = 15), podemos verificar que é impossível definir um corte mínimo Note-se que o corte abaixo representado, não é um corte mínimo, pois o fluxo do nó 2 para o nó 3 não é nulo. Ver explicação detalhada 4 1 2 (0, 7) (7) (6, 7) (9, 9) (3, 9) (0, 9) (9) f = 15 (3, 3) (3) (0, 3) f = 15 (8) (9) (0, 8) (6, 8) (0, 9) (9, 9) (3, 9) 3