Fluxo máximo incremental em gráficos dinâmicos

12

Estou procurando um algoritmo rápido para calcular o fluxo máximo em gráficos dinâmicos. ou seja, dado um gráfico e , temos o fluxo máximo em de para . Em seguida, novos / antigo nó adicionado / eliminadas com as suas arestas correspondentes de modo a formar um gráfico . O que é um fluxo máximo no gráfico recém-criado? Existe uma maneira de impedir o recálculo do fluxo máximo?s , t V F L s t u L 1G=(V,E)s,tVFGstuG1

Qualquer pré-processamento que não consome muito tempo / memória é apreciado.

A ideia mais simples é recalcular o fluxo.

Outra idéia simples é a seguinte: salve todos os caminhos de aumento usados ​​no cálculo de fluxo máximo anterior; para adicionar um vértice , podemos encontrar caminhos simples (no gráfico de capacidade atualizado pela etapa anterior) que começam na fonte, vão para o depois vão para o destino, mas o problema é que esse caminho deve ser simples, não consegui encontrar melhor que para esse caso, para. (Observe também que, se fosse apenas um caminho, isso poderia ser feito em mas não é assim.)v O ( n m ) m = | E | O ( n + m )vvO(nm)m=|E|O(n+m)

Também para remover o nó acima da ideia não funciona.

Também já vi papéis como a abordagem incremental para arestas , mas parece que não são bons o suficiente neste caso, é mais do que para cada aresta e parece não ser uma extensão adequada neste caso (apenas recalculamos um fluxo). Atualmente, também estou usando o algoritmo de fluxo máximo Ford-Fulkerson. Se houver uma opção melhor para algoritmos on-line, é bom conhecê-lo.O(m)

Saeed
fonte
Você poderia esclarecer "mas o problema é que esse caminho deve ser simples"? Eu não entendi.
Dmytro Korduban
@ maldini.ua, na verdade, quero dizer, o caminho que vai da fonte para caminho de para o destino não deve ter vértice comum (exceto ). Suponha que seja o novo nó adicionado. Se não fosse assim, podemos pular algumas verificações e ter um algoritmo mais rápido (em média, ou pode ser assintoticamente). v v vvvvv
Saeed
Entendi, mas quanto a mim não é algo especial sobre . Penso que a ideia mais simples de recalcular é a seguinte: 1) adicione um novo vértice com arestas ao gráfico residual ; 2) encontre o fluxo máximo no gráfico residual atualizado usando um algoritmo de fluxo máximo de sua escolha. O caso que você sugeriu será processado "automaticamente" pelo algoritmo de fluxo máximo (por exemplo, ele não encontrará nenhum caminho de aumento etc.). Se você estiver interessado em remover nós, eu posso escrever em resposta. PS Para ser claro, você tem um gráfico direcionado ou não direcionado? v
Dmytro Korduban
@ maldini.ua, recálculo normal adicionacomplexidade da solução atual, então eu não acho que seja bom (pode ser bom sabendo que normalmente muitas arestas são inúteis e, de fato, não causam problemas de desempenho muito alto), mas se você tiver alguma idéia de remover nó, estou interessado em ver sua idéia, também gráfico é direcionado. PS, mas estou interessado em ambos os casos. |G|
Saeed
Lembre-se de executá-lo no gráfico residual; neste momento, deve haver muitas arestas com capacidade zero. Normalmente, ele funciona muito rápido, especialmente em gráficos esparsos (funcionou para mim, pelo menos). Por outro lado, a abordagem "caminho simples" parece um pouco mais de sofisticação para mim. Além disso, não esqueça que você tem vinculado ao tempo de execução do Ford-Fulkerson (onde é limitado pela soma das capacidades das bordas adjacentes de ). | f | vO(|f||E|)|f|v
Dmytro Korduban

Respostas:

6

A abordagem descrita pode não ser teoricamente ideal. É apenas uma solução prática simples que pode funcionar para o autor. Não posso fornecer referências, porque sempre achei que era um folclore amplamente conhecido, mas, estranhamente, ninguém postou na resposta. Então eu faço.

Suponha que temos uma rede não direcionada . Suponha que ele seja armazenado em uma estrutura de dados que permita inserções / exclusões fáceis de vértices / arco. Às vezes, usaremos a rede residual (ou seja, com capacidades atualizadas ).G f c f = c - fG=(V,E,c)Gfcf=cf

A primeira parte é como processar inserções / exclusões de vértices. É mais ou menos simples para inserções:

  1. Adicione um novo vértice com arestas correspondentes à rede residual.
  2. Encontre um fluxo máximo na rede residual atualizada usando o algoritmo maxflow de sua escolha.

Para exclusões, as coisas ficaram mais complicadas. Imagine que dividimos o vértice que estamos prestes a excluir em duas metades e modo que todos os arcos-pontos para , todos os arcos-out vão de e esses novos vértices são conectados por um arco de capacidade infinita. A exclusão de é equivalente à exclusão do arco entre e . O que acontecerá neste caso? Vamos denotar por o fluxo que passa pelo vértice . Então experimentará excesso de unidades de fluxo ev i n v o u t v i n v o u t v v i n v o u t f v v v i n f v v o u t f vvvinvoutvinvoutvvinvoutfvvvinfvvouthaverá escassez de unidades de fluxo logo após a exclusão (as restrições de fluxo serão obviamente quebradas). Para fazer com que as restrições de fluxo sejam mantidas novamente, devemos reorganizar os fluxos, mas também queremos manter o valor original do fluxo o mais alto possível. Vamos ver primeiro se podemos fazer um rearranjo sem diminuir o fluxo total. Para verificar se encontra um maxflow de a na rede residual "cortada" (ou seja, sem o arco conectando e ). Deveríamos limitá-lo por obviamente. Se for igual a , teremos sorte: reatribuímos o fluxo que passava porfv vinvoutvinvoutfvfvvΔ=fv~vinvoutvinvoutfvfvvde tal maneira que o fluxo total não foi alterado. No outro caso, o fluxo total deve ser diminuído pelo excesso "inútil" de unidades . Para fazer isso, conecte temporariamente e por um arco de capacidade infinita e execute o algoritmo maxflow novamente de a (devemos limitar o fluxo por ). Isso fixará a rede residual e fará com que as restrições de fluxo sejam mantidas novamente, diminuindo automaticamente o fluxo total em . s t v i n v o u t Δ ΔΔ=fvfv~stvinvoutΔΔ

A complexidade do tempo dessas atualizações pode depender do algoritmo maxflow que usamos. Os piores casos podem ser bem ruins, mas ainda são melhores do que o recálculo total.

A segunda parte é qual o algoritmo maxflow a ser usado. Tanto quanto eu entendo, o autor não precisa de um algoritmo muito complexo (mas ainda eficiente) com pequena constante oculta para executá-lo em uma plataforma móvel. Sua primeira escolha de Ford-Fulkerson (eu espero que seja Edmonds-Karp ) não parece muito ruim desse ponto de vista. Mas existem outras possibilidades. O que eu recomendaria tentar primeiro é a variante do algoritmo de Dinic porque é bastante rápido na prática e pode ser implementado de uma maneira muito simples. Outras opções podem incluir o dimensionamento da capacidade Ford-Fulkerson emO ( | E | 2 log C m a x )O(|V|2|E|)O(|E|2logCmax)e, afinal, diferentes versões do push-re-label com heurísticas. De qualquer forma, o desempenho dependerá de um caso de uso, para que o autor encontre o melhor empiricamente.

Dmytro Korduban
fonte
Depois de ler a resposta da última vzn, encontrei a abordagem semelhante descrita na página 90 deste artigo .
Dmytro Korduban
fv~fvfv~Δ
vucf(v,u)cf(u,v)f(v,u)=f(u,v)
Alguma idéia de como você faria isso se quiser alterar uma capacidade de borda?
Chet
-1

ok, levando em conta as novas informações e evitando algumas referências complicadas e falsas antes do início / arenque vermelho (mea culpa), aqui estão algumas novas referências sobre isso.

Solução rápida de uma sequência on-line de problemas de fluxo máximo com extensões para calcular cortes mínimos robustos Doug Altner e Özlem Ergun

essa referência considera sequências on-line de MFPs e "partidas a quente", ou seja, com base em alterações incrementais a uma MFP anterior. "Demonstramos que nossos algoritmos reduzem o tempo de execução em uma ordem de grandeza quando comparados códigos semelhantes que usam um solucionador de MFP de caixa preta. Em particular, mostramos que nosso algoritmo para cortes mínimos robustos pode resolver instâncias em segundos que exigiriam mais de quatro horas usando um solucionador de fluxo máximo de caixa preta ".


avanços em problemas envolvendo fluxos máximos Altner, Douglas S., georgia tech

nesta tese de doutorado de 2008 (pdf para download), o autor considera o problema de adicionar gradualmente arcos que parecem estar "suficientemente próximos" ao problema de adicionar novos vértices (com vários novos arcos).

grande parte desta referência se refere à exclusão de partes da rede (cortes / "interdições"), conforme declarado na 1ª parte do resumo

consulte esp "IV SOLUÇÃO DE SEQUÊNCIAS ONLINE DE FLUXOS MÁXIMOS...... pág. 63".

p 63 "O objetivo deste capítulo, no entanto, é convencer o leitor de que o uso iterativo de um solucionador de fluxo máximo de caixa preta para resolver uma grande sequência de MFPs pode levar a um número enorme de cálculos desnecessários".

p66 "Nas aplicações mencionadas, as MFPs são tipicamente topologicamente semelhantes. Ou seja, a próxima MFP da sequência difere da anterior adicionando ou removendo um pequeno número de arcos ou alterando previsivelmente as capacidades de um conjunto de arcos localizado. , ao resolver essas instâncias, o tempo e o espaço necessários para armazenar qualquer coisa além da solução para o problema anterior geralmente são injustificados ".

O autor da p67 também usa a abordagem "início a quente" aqui. "Uma estratégia eficaz para resolver rapidamente uma seqüência on-line inteira de problemas de otimização é desenvolver heurísticas de reoptimização eficientes. Para esse fim, desenvolvemos um algoritmo de fluxo máximo modificado, projetado para partidas a quente eficientes".

veja esp p71 que possui o problema incremental específico de novo arco:

Novo problema de reoptimização do fluxo máximo do arco (NAMFRP)

o autor considera os problemas mais gerais p67

Problema de reoptimização de fluxo máximo (MFROP)
Problema de reoptimização de arco único de fluxo máximo (MFSAROP)

vzn
fonte
-3

a partir de uma pesquisa rápida, parece que a versão online é uma área de pesquisa ativa. você não menciona a área de aplicação que pode ajudar a restringir a pesquisa de literatura. uma opção é procurar uma área de aplicação onde exista a maior ou mais recente inovação. portanto, existe alguma aplicação de fluxo máximo incremental em sistemas de visão e alguns algoritmos para isso; tente Fluxos máximos por pesquisa incremental em primeiro lugar nos laboratórios de pesquisa da microsoft. parafraseando a introdução deste artigo, aparentemente para instâncias de visão o algoritmo de Boykov e Kolmogorov se sai bem e não há contra-exemplos de tempo exponencial conhecidos, embora fora dos aplicativos de visão possa ter um desempenho ruim. vale a pena experimentar o algoritmo B&K nos seus dados e ver como ele se comporta e

você parece estar dizendo que um algoritmo incremental linear no número de arestas do gráfico não é velocidade suficiente? mas não é essa eficiência bastante alta? com quantas arestas você está lidando? talvez a abordagem seja diminuir o custo de percorrer o gráfico se isso for caro ou um fator significativo (por exemplo, gráfico armazenado em db vs gráfico armazenado na memória)

Aqui está um artigo interessante que argumenta que, enquanto o algoritmo não incremental para fluxo máximo está em P, a versão incremental é NP completa. "Até onde sabemos, nossos resultados são os primeiros a encontrar um problema de tempo P cuja versão incremental é NP completa".

Fluxo incremental da Hartline, Sharp

vzn
fonte
Obrigado, eu não li os seus documentos referenciados, vou dar uma olhada neles (já vi alguns artigos antes e os achei inúteis), mas sobre a minha área problemática, é um problema na situação real de trabalho no marketing de ações. É um pouco complicado dizer o que aconteceu quando descobri que deveria resolver esse problema. Na verdade, não achei difícil à primeira vista, mas depois de tentar algum código, vejo que não é tão fácil. esse algoritmo será executado em telefones celulares, eles não são tão rápidos (e os clientes não gostam do meu algoritmo :). Às vezes, também muitas bordas virão com um novo nó. e isso é gargalo.
Saeed
interessante. Parece que você provavelmente deveria usar heurísticas com base no poder de processamento limitado e na necessidade de atualizações rápidas. o processamento pode ser movido do "cliente" (no seu caso, aparentemente, os telefones) para o servidor? todo cliente precisa calcular uma versão diferente (ou seja, dados diferentes) do problema?
vzn
No Irã, o maior problema é a velocidade da conexão à Internet, então não posso movê-la para o lado do servidor. Se estivesse bom (boa velocidade), com certeza recalcular não seria ruim.
Saeed
6
Não vejo como isso responde à pergunta original, que é sobre um gráfico que evolui ao longo do tempo pela adição de nós e arestas. O primeiro artigo descreve um algoritmo incremental para o problema de vazão máxima padrão one-shot. O segundo artigo descreve um papel para um diferente problema "Maxflow incrementais", onde o conjunto de arestas é fixa, mas as suas capacidades crescer ao longo do tempo.
Jeffε
1
@ Jɛ ff E, sim, você está certo :) de fato, antes disso, vejo trabalhos similares aos trabalhos referenciados, mas como você disse que eles não estão relacionados ao meu problema, o artigo mais próximo que vejo até agora é o que referenciei.
Saeed
-5

outra possibilidade / direção é o algoritmo de fluxo máximo push-re-label , que é "um dos algoritmos mais eficientes para o fluxo máximo" e pode ter melhores perfis de complexidade, dependendo dos seus dados. por exemplo, como afirma a página da Wikipedia

O(V3)O(V2EO(VElog(V2/E))

vzn
fonte
3
Mais uma vez, não vejo como essa resposta é relevante para a pergunta postada. O push-re-label é uma estratégia conhecida do livro para responder ao problema padrão de fluxo máximo.
Jeffε
então é Ford-Fulkerson ... certo? & OP pede algo melhor. você sabe algo que prova que push-re-label é pior que ford-fulkerson? seu OP não claro está familiarizado com o push-re-label. Nossa, o algoritmo que aparece no livro didático certamente não é um critério imediato para rejeitar a resposta aqui, certo?
vzn
3
Na verdade sim; as perguntas respondidas nos livros-texto padrão (ou na wikipedia) não são de nível de pesquisa. No entanto, a primeira pergunta postada sobre fluxos incrementais é interessante e definitivamente de escopo. (A falta de respostas definitivas sugere que a resposta correta pode ser "Boa pergunta Ninguém sabe.".)
Jeffε
vzn, obrigado por sua contribuição, mas: "você sabe que algo que prova que o push-re-label é pior que o ford-fulkerson" não é um bom motivo para publicá-lo como resposta? Se você sabe por que o "push-re-label" nos algoritmos on-line é melhor do que Ford-Falkerson é bom em dizer isso, eu pessoalmente gosto de Ford-Falkerson por causa da simplicidade, baixo fator constante e conheço isso no passado. Mas como eu disse, eu não poderia dizer que é uma boa opção em todos os casos, também esses algoritmos não são simplesmente comparáveis, eles precisam de testes práticos.
quer
veja que o pt é que, se você tiver um algoritmo de fluxo máximo que não está funcionando bem para seus dados, tente outro, especialmente um que tenha bom desempenho, porque há alguns otimizados para diferentes perfis de dados. não, não é on-line / "vértice incremental", mas pode ter um desempenho melhor para o caso off-line se não houver alternativa. as versões online, enquanto eles existem como eu encontrei acima, são prov vai ser significativamente difícil de implementar ...
vzn