Problema de fluxo máximo - Maximum flow problem

Rede de fluxo para o problema: Cada ser humano (ri) está disposto a adotar um gato (wi1) e / ou um cachorro (wi2).  No entanto, cada animal de estimação (pi) tem preferência por apenas um subconjunto dos humanos.  Encontre qualquer correspondência de animais de estimação com humanos de forma que o número máximo de animais de estimação seja adotado por um de seus humanos preferidos.
Rede de fluxo para o problema: Cada ser humano (r i ) está disposto a adotar um gato (w i 1) e / ou um cachorro (w i 2). No entanto, cada animal de estimação (p i ) tem preferência por apenas um subconjunto dos humanos. Encontre qualquer correspondência de animais de estimação com humanos de forma que o número máximo de animais de estimação seja adotado por um de seus humanos preferidos.

Na teoria de otimização , os problemas de fluxo máximo envolvem encontrar um fluxo viável através de uma rede de fluxo que obtenha a taxa de fluxo máxima possível.

O problema de fluxo máximo pode ser visto como um caso especial de problemas de fluxo de rede mais complexos, como o problema de circulação . O valor máximo de um st flow (ou seja, fluxo da fonte s para o sumidouro t) é igual à capacidade mínima de um st corte (ou seja, corte separando s de t) na rede, conforme declarado no max-flow min- teorema de corte .

História

O problema de fluxo máximo foi formulado pela primeira vez em 1954 por TE Harris e FS Ross como um modelo simplificado do fluxo de tráfego ferroviário soviético.

Em 1955, Lester R. Ford, Jr. e Delbert R. Fulkerson criaram o primeiro algoritmo conhecido, o algoritmo Ford-Fulkerson . Em seu artigo de 1955, Ford e Fulkerson escreveram que o problema de Harris e Ross é formulado da seguinte forma (ver p. 5):

Considere uma rede ferroviária conectando duas cidades por meio de várias cidades intermediárias, onde cada link da rede possui um número atribuído a ela que representa sua capacidade. Assumindo uma condição de estado estacionário, encontre um fluxo máximo de uma determinada cidade para a outra.

Em seu livro Flows in Network , em 1962, Ford e Fulkerson escreveram:

Foi proposto aos autores na primavera de 1955 por TE Harris, que, em conjunto com o General FS Ross (aposentado), formulou um modelo simplificado de fluxo de tráfego ferroviário e apontou este problema particular como o problema central sugerido pelo modelo [11].

onde [11] se refere ao relatório secreto de 1955, Fundamentos de um Método para Avaliar Capacidades da Rede Ferroviária, de Harris e Ross (ver pág. 5).

Ao longo dos anos, várias soluções aprimoradas para o problema de fluxo máximo foram descobertas, notavelmente o algoritmo de caminho de aumento mais curto de Edmonds e Karp e, independentemente, Dinitz; o algoritmo de bloqueio de fluxo de Dinitz; o algoritmo push-relabel de Goldberg e Tarjan ; e o algoritmo de fluxo de bloqueio binário de Goldberg e Rao. Os algoritmos de Sherman e Kelner, Lee, Orecchia e Sidford, respectivamente, encontram um fluxo máximo aproximadamente ótimo, mas funcionam apenas em gráficos não direcionados.

Em 2013, James B. Orlin publicou um artigo descrevendo um algoritmo.

Definição

A rede de fluxo, com fonte s e pia t . Os números próximos à borda são as capacidades.

Primeiro, estabelecemos algumas notações:

  • Deixe ser uma rede sendo a fonte e o coletor de, respectivamente.
  • Se é função nas bordas de, então seu valor em é denotado por ou

Definição. A capacidade de uma borda é a quantidade máxima de fluxo que pode passar por uma borda. Formalmente é um mapa

Definição. Um fluxo é um mapa que satisfaz o seguinte:

  • Restrição de capacidade . O fluxo de uma borda não pode ultrapassar sua capacidade, ou seja: para todos
  • Conservação de fluxos. A soma dos fluxos que entram em um nó deve ser igual à soma dos fluxos que saem desse nó, exceto para a origem e o sumidouro. Ou:

Observação . Os fluxos são assimétricos: para todos

Definição. O valor do fluxo é a quantidade de fluxo que passa da fonte para o sumidouro. Formalmente, para um fluxo , é dado por:

Definição. O problema do fluxo máximo é direcionar o máximo de fluxo possível da fonte ao coletor, ou seja, encontrar o fluxo com valor máximo.

Observe que vários fluxos máximos podem existir, e se valores reais arbitrários (ou mesmo racionais arbitrários) de fluxo são permitidos (em vez de apenas inteiros), há exatamente um fluxo máximo, ou infinitamente muitos, uma vez que existem infinitas combinações lineares de os fluxos máximos de base. Em outras palavras, se enviarmos unidades de fluxo na borda em um fluxo máximo, e unidades de fluxo em outro fluxo máximo, então, para cada um , podemos enviar unidades e direcionar o fluxo nas bordas restantes de acordo, para obter outro fluxo máximo. Se os valores de fluxo podem ser quaisquer números reais ou racionais, então existem infinitos desses valores para cada par .

Algoritmos

A tabela a seguir lista algoritmos para resolver o problema de fluxo máximo.

Método Complexidade Descrição
Programação linear Restrições dadas pela definição de um fluxo legal . Veja o programa linear aqui.
Algoritmo Ford-Fulkerson Enquanto houver um caminho aberto no gráfico residual, envie o mínimo das capacidades residuais no caminho.

O algoritmo só tem garantia de término se todos os pesos forem racionais , caso em que a quantidade adicionada ao fluxo em cada etapa é pelo menos o maior divisor comum dos pesos. Caso contrário, é possível que o algoritmo não convirja para o valor máximo. No entanto, se o algoritmo terminar, é garantido encontrar o valor máximo.

Algoritmo Edmonds-Karp Uma especialização de Ford – Fulkerson, encontrando caminhos ampliadores com pesquisa abrangente .
Algoritmo de Dinic Em cada fase, os algoritmos constroem um gráfico em camadas com pesquisa em largura no gráfico residual . O fluxo máximo em um gráfico em camadas pode ser calculado com o tempo, e o número máximo de fases é . Em redes com capacidades unitárias, o algoritmo de Dinic termina no tempo.
Algoritmo MKM (Malhotra, Kumar, Maheshwari) Uma modificação do algoritmo de Dinic com uma abordagem diferente para construir fluxos de bloqueio. Consulte o papel original .
Algoritmo de Dinic com árvores dinâmicas A estrutura de dados de árvores dinâmicas acelera o cálculo de fluxo máximo no gráfico em camadas para .
Algoritmo push-relabel geral O algoritmo push relabel mantém um pré-fluxo, ou seja, uma função de fluxo com possibilidade de excesso nos vértices. O algoritmo é executado enquanto houver um vértice com excesso positivo, ou seja, um vértice ativo no gráfico. A operação push aumenta o fluxo em uma borda residual e uma função de altura nos vértices controla através da qual as bordas residuais podem ser empurradas. A função de altura é alterada pela operação de reclassificação. As definições adequadas dessas operações garantem que a função de fluxo resultante seja um fluxo máximo.
Algoritmo push-relabel com regra de seleção de vértice FIFO Variante do algoritmo push-relabel que sempre seleciona o vértice ativo mais recentemente e executa operações push enquanto o excesso é positivo e há arestas residuais admissíveis deste vértice.
Algoritmo push-relabel com regra de seleção de vértice de distância máxima Variante do algoritmo push-relabel que sempre seleciona o vértice mais distante de ou ( ou seja, o vértice de rótulo mais alto), mas de outra forma continua como o algoritmo FIFO.
Algoritmo push-relabel com árvores dinâmicas O algoritmo constrói árvores de tamanho limitado no gráfico residual em relação à função altura. Essas árvores fornecem operações de push multinível, ou seja, empurrar ao longo de um caminho de saturação inteiro em vez de uma única aresta.
Algoritmo de KRT (King, Rao, Tarjan)
Algoritmo de fluxo de bloqueio binário O valor U corresponde à capacidade máxima da rede.
Algoritmo de James B Orlin + KRT (King, Rao, Tarjan) Resolve o algoritmo do Orlin max-fluir em tempo para enquanto KRT resolve-lo em para .
Algoritmo Kathuria-Liu-Sidford Métodos de ponto interno e aumento de borda usando fluxos -norm. Baseia-se no algoritmo anterior de Madry, que alcançou o tempo de execução .
Algoritmo BLNPSSSW / BLLSSSW

Métodos de pontos interiores e manutenção dinâmica de fluxos elétricos com decomposições expansoras.
Algoritmo Gao-Liu-Peng O algoritmo de Gao, Liu e Peng gira em torno de manter dinamicamente os fluxos elétricos crescentes no núcleo do algoritmo baseado no método do ponto interior de [Mądry JACM '16]. Isso envolve o projeto de estruturas de dados que, em configurações limitadas, retornam bordas com grande energia elétrica em um gráfico submetido a atualizações de resistência.

Para algoritmos adicionais, consulte Goldberg & Tarjan (1988) .

Teorema do fluxo integral

O teorema do fluxo integral afirma que

Se cada borda em uma rede de fluxo tem capacidade integral, então existe um fluxo máximo integral.

A alegação não é apenas que o valor do fluxo é um número inteiro, que segue diretamente do teorema de corte mínimo do fluxo máximo , mas que o fluxo em cada aresta é integral. Isso é crucial para muitas aplicações combinatórias (veja abaixo), onde o fluxo através de uma borda pode codificar se o item correspondente a essa borda deve ser incluído no conjunto procurado ou não.

Aplicativo

Problema de fluxo máximo de múltiplos sumidouros de fontes múltiplas

Fig. 4.1.1. Transformação de um problema de fluxo máximo de múltiplos sumidouros de fontes múltiplas em um problema de fluxo máximo de sumidouro único de fonte única

Dada uma rede com um conjunto de fontes e um conjunto de sumidouros em vez de apenas uma fonte e um sumidouro, devemos encontrar o fluxo máximo . Podemos transformar o problema de múltiplos sumidouros de múltiplas fontes em um problema de fluxo máximo, adicionando uma fonte consolidada conectada a cada vértice em e um sumidouro consolidado conectado por cada vértice em (também conhecido como supersource e supersink ) com capacidade infinita em cada aresta ( Consulte a Fig. 4.1.1.).

Correspondência bipartida de cardinalidade máxima

Fig. 4.3.1. Transformação de um problema de correspondência bipartida máxima em um problema de fluxo máximo

Dado um grafo bipartido , devemos encontrar uma correspondência de cardinalidade máxima em , que é uma correspondência que contém o maior número possível de arestas. Este problema pode ser transformado em um problema de fluxo máximo através da construção de uma rede , onde

  1. contém as arestas direcionadas de para .
  2. para cada um e para cada um .
  3. para cada um (Ver Fig. 4.3.1).

Então, o valor do fluxo máximo em é igual ao tamanho da correspondência máxima em , e uma correspondência de cardinalidade máxima pode ser encontrada tomando as arestas que têm fluxo em um fluxo máximo integral.

Cobertura mínima do caminho no gráfico acíclico direcionado

Dado um grafo acíclico direcionado , devemos encontrar o número mínimo de caminhos disjuntos de vértices para cobrir cada vértice em . Podemos construir um grafo bipartido a partir de , onde

  1. .

Em seguida, pode ser mostrado que tem uma correspondência de tamanho se e somente se tem uma cobertura de caminho de vértice disjunta contendo arestas e caminhos, onde é o número de vértices em . Portanto, o problema pode ser resolvido encontrando a correspondência de cardinalidade máxima em .

Intuitivamente, se dois vértices forem correspondidos , a aresta estará contida em . Claramente, o número de arestas em é . Para ver que é disjunta de vértice, considere o seguinte:

  1. Cada vértice no pode ser não-correspondida em , caso em que não existem arestas deixando em ; ou ele pode ser combinado , caso em que não é exatamente uma borda deixando em . Em qualquer caso, não mais do que uma aresta deixa qualquer vértice dentro .
  2. Da mesma forma, para cada vértice em - se houver correspondência, há uma única aresta de entrada em ; caso contrário , não tem bordas de entrada .

Portanto, nenhum vértice tem duas arestas de entrada ou duas de saída , o que significa que todos os caminhos de entrada são separados por vértice.

Para mostrar que a capa tem tamanho , começamos com uma capa vazia e a construímos de forma incremental. Para adicionar um vértice à cobertura, podemos adicioná-lo a um caminho existente ou criar um novo caminho de comprimento zero começando nesse vértice. O primeiro caso é aplicável sempre que um e algum caminho na capa começa em , ou e algum caminho termina em . O último caso é sempre aplicável. No primeiro caso, o número total de arestas na tampa é aumentado em 1 e o número de caminhos permanece o mesmo; no último caso, o número de caminhos é aumentado e o número de arestas permanece o mesmo. Agora está claro que depois de cobrir todos os vértices, a soma do número de caminhos e arestas na capa é . Portanto, se o número de arestas na capa for , o número de caminhos será .

Fluxo máximo com capacidades de vértice

Fig. 4.4.1. Transformação de um problema de fluxo máximo com restrição de capacidades de vértice no problema de fluxo máximo original por divisão de nó

Deixe ser uma rede. Suponha que haja capacidade em cada nó além da capacidade da borda, ou seja, um mapeamento tal que o fluxo deve satisfazer não apenas a restrição de capacidade e a conservação dos fluxos, mas também a restrição de capacidade do vértice

Em outras palavras, a quantidade de fluxo que passa por um vértice não pode exceder sua capacidade. Para encontrar o fluxo máximo transversal , podemos transformar o problema no problema de fluxo máximo no sentido original, expandindo . Primeiro, cada um é substituído por e , onde é conectado pelas bordas que entram e são conectadas às bordas que saem , então atribua capacidade para a borda que conecta e (ver Fig. 4.4.1). Nessa rede expandida, a restrição de capacidade do vértice é removida e, portanto, o problema pode ser tratado como o problema de fluxo máximo original.

Número máximo de caminhos de s a t

Dado um grafo direcionado e dois vértices e , devemos encontrar o número máximo de caminhos de a . Este problema tem várias variantes:

1. Os caminhos devem ser desconexos. Esse problema pode ser transformado em um problema de fluxo máximo construindo uma rede de , com e sendo a fonte e o sumidouro de , respectivamente, e atribuindo a cada aresta uma capacidade de . Nesta rede, o fluxo máximo é se houver caminhos disjuntos de borda.

2. Os caminhos devem ser independentes, ou seja, separados por vértice (exceto para e ). Podemos construir uma rede de com capacidade de vértice, onde as capacidades de todos os vértices e todas as arestas são . Então, o valor do fluxo máximo é igual ao número máximo de caminhos independentes de a .

3. Além dos caminhos serem desconexos de aresta e / ou desconexão de vértice, os caminhos também têm uma restrição de comprimento: contamos apenas caminhos cujo comprimento é exatamente , ou no máximo . A maioria das variantes desse problema são NP-completas, exceto para pequenos valores de .

Problema de fechamento

Um fecho de um grafo orientado é um conjunto de vértices C , de tal modo que não há bordas deixar C . O problema de fechamento é a tarefa de encontrar o fechamento de peso máximo ou mínimo em um gráfico direcionado ponderado por vértice. Pode ser resolvido em tempo polinomial usando uma redução ao problema de fluxo máximo.

Aplicativos do mundo real

Eliminação de beisebol

Construção de fluxo de rede para problema de eliminação de beisebol

No problema de eliminação do beisebol,n equipes competindo em uma liga. Em um estágio específico da temporada da liga, w i é o número de vitórias er i é o número de jogos restantes para as equipes i e r ij é o número de jogos restantes contra a equipe j . Uma equipe é eliminada se não tiver chance de terminar a temporada em primeiro lugar. A tarefa do problema de eliminação do beisebol é determinar quais times são eliminados em cada ponto durante a temporada. Schwartz propôs um método que reduz esse problema ao fluxo máximo da rede. Neste método, uma rede é criada para determinar se a equipe k é eliminada.

Seja G = ( V , E ) uma rede com s , tV sendo a fonte e o sumidouro, respectivamente. Adiciona-se um nó de jogo ij - que representa o número de jogadas entre essas duas equipes. Nós também adicionar um nó equipe para cada equipe e conectar cada nó jogo { i , j } com i < j a V , e conecta cada um deles de s por uma aresta com capacidade r ij - que representa o número de jogos entre estes dois equipes. Também adicionamos um nó de equipe para cada equipe e conectamos cada nó de jogo { i , j } com dois nós de equipe i e j para garantir que um deles vença. Não é necessário restringir o valor do fluxo nessas bordas. Finalmente, as arestas são feitas do nó da equipe i para o nó sorvedouro t e a capacidade de w k + r k - w i é definida para evitar que a equipe i ganhe mais do que w k + r k . Seja S o conjunto de todas as equipes participantes da liga e deixe

.

Neste método, diz-se equipa k não é eliminada se e só se um valor de fluxo de tamanho r ( S - { k }) existe na rede G . No artigo mencionado é provado que este valor de fluxo é o valor máximo de fluxo de s para t .

Agendamento da companhia aérea

No setor de aviação civil, um grande problema é a programação das tripulações de vôo. O problema de programação de companhias aéreas pode ser considerado como uma aplicação de fluxo máximo de rede estendido. A entrada deste problema é um conjunto de voos F que contém as informações sobre onde e quando cada voo sai e chega. Em uma versão da programação da companhia aérea, o objetivo é produzir uma programação viável com no máximo k tripulações.

Para resolver este problema, usa-se uma variação do problema de circulação chamada circulação limitada, que é a generalização dos problemas de fluxo de rede , com a restrição adicional de um limite inferior nos fluxos de borda.

Seja G = ( V , E ) uma rede com s , tV como nós fonte e sorvedouro. Para a origem e o destino de cada voo i , adiciona-se dois nós a V , o nó s i como a origem e o nó d i como o nó de destino do voo i . Também se adiciona as seguintes arestas a E :

  1. Uma borda com capacidade [0, 1] entre s e cada um s i .
  2. Uma aresta com capacidade [0, 1] entre cada d i e t .
  3. Uma aresta com capacidade [1, 1] entre cada par de s i e d i .
  4. Uma aresta com capacidade [0, 1] entre cada d i e s j , se a fonte s j for alcançável com uma quantidade razoável de tempo e custo a partir do destino do vôo i .
  5. Uma aresta com capacidade [0, ] entre s e t .

No método mencionado, é afirmado e provado que encontrar um valor de fluxo de k em G entre s e t é igual a encontrar um horário viável para o conjunto de vôo F com no máximo k tripulações.

Outra versão da programação da companhia aérea é encontrar as tripulações mínimas necessárias para realizar todos os voos. A fim de encontrar uma solução para este problema, um gráfico bipartido L' = ( AB , E ) é criado onde cada voo tem uma cópia em conjunto Um e conjunto B . Se o mesmo plano pode realizar voo j depois de voo i , iA está ligado ao jB . Uma correspondência em G ' induz uma programação para F e, obviamente, a correspondência bipartida máxima neste gráfico produz uma programação de linha aérea com um número mínimo de tripulações. Como é mencionado na parte de Aplicação deste artigo, a correspondência bipartida de cardinalidade máxima é uma aplicação do problema de fluxo máximo.

Problema de demanda de circulação

Existem algumas fábricas que produzem mercadorias e algumas aldeias onde as mercadorias devem ser entregues. Eles são conectados por uma rede de estradas com cada estrada tendo uma capacidade c para o máximo de mercadorias que podem fluir por ela. O problema é saber se existe uma circulação que atenda a demanda. Esse problema pode ser transformado em um problema de fluxo máximo.

  1. Adicione um nó de origem s e adicione arestas a partir dele para cada nó de fábrica f i com capacidade p i, onde p i é a taxa de produção da fábrica f i .
  2. Adicione um nó sumidouro t e adicione arestas de todas as aldeias v i a t com capacidade d i onde d i é a taxa de demanda da aldeia v i .

Seja G = ( V , E ) esta nova rede. Existe uma circulação que satisfaz a demanda se e somente se:

Valor de fluxo máximo ( G ) .

Se existe uma circulação, olhar para a solução de fluxo máximo daria a resposta quanto à quantidade de bens que devem ser enviados em uma estrada particular para satisfazer as demandas.

O problema pode ser estendido adicionando-se um limite inferior ao fluxo em algumas bordas.


Segmentação de imagem

Imagem original de tamanho 8x8.
Rede construída a partir do bitmap. A fonte está à esquerda, a pia à direita. Quanto mais escura for uma borda, maior será sua capacidade. a i é alto quando o pixel é verde, b i quando o pixel não é verde. As penalidades p ij são todas iguais.

Em seu livro, Kleinberg e Tardos apresentam um algoritmo para segmentar uma imagem. Eles apresentam um algoritmo para encontrar o fundo e o primeiro plano em uma imagem. Mais precisamente, o algoritmo toma um bitmap como uma entrada modelada da seguinte forma: a i ≥ 0 é a probabilidade de que o pixel i pertença ao primeiro plano, b i ≥ 0 a probabilidade de que o pixel i pertença ao plano de fundo, e p ij é o penalidade se dois pixels adjacentes i e j forem colocados um no primeiro plano e o outro no plano de fundo. O objetivo é encontrar uma partição ( A , B ) do conjunto de pixels que maximize a seguinte quantidade

,

De fato, para pixels em A (considerados como o primeiro plano), ganhamos a i ; para todos os pixels em B (considerados como fundo), ganhamos b i . Na borda, entre dois pixels adjacentes i e j , perdemos p ij . É equivalente a minimizar a quantidade

Porque

Corte mínimo exibido na rede (triângulos VS círculos).

Agora construímos a rede cujos nós são o pixel, mais uma fonte e um coletor, consulte a Figura à direita. Conectamos a fonte ao pixel i por uma aresta de peso a i . Conectamos o pixel i à pia por uma aresta de peso b i . Conectamos o pixel i ao pixel j com peso p ij . Agora, resta calcular um corte mínimo nessa rede (ou, de forma equivalente, um fluxo máximo). A última figura mostra um corte mínimo.

Extensões

1. No problema de fluxo de custo mínimo , cada aresta ( u , v) também tem um coeficiente de custo a uv além de sua capacidade. Se o fluxo através da borda é f uv , em seguida, o custo total é uma uv f UV . É necessário encontrar um fluxo de determinado tamanho d , com o menor custo. Na maioria das variantes, os coeficientes de custo podem ser positivos ou negativos. Existem vários algoritmos de tempo polinomial para esse problema.

2. O problema de fluxo máximo pode ser aumentado por restrições disjuntivas : uma restrição disjuntiva negativa diz que um certo par de arestas não pode ter simultaneamente um fluxo diferente de zero; uma restrição disjuntiva positiva diz que, em um determinado par de arestas, pelo menos um deve ter um fluxo diferente de zero. Com restrições negativas, o problema se torna fortemente NP-difícil, mesmo para redes simples. Com restrições positivas, o problema é polinomial se fluxos fracionários forem permitidos, mas pode ser fortemente NP-difícil quando os fluxos devem ser integrais.


Referências

Leitura adicional