Recuperando o Caminho Mais Curto de um Gráfico Dinâmico


24

Atualmente, estou estudando caminhos mais curtos em gráficos direcionados. Existem muitos algoritmos eficientes para encontrar o caminho mais curto em uma rede, como o dijkstra ou o bellman-ford. Mas e se o gráfico for dinâmico? Ao dizer dinâmico, quero dizer que podemos inserir ou remover vértices durante a execução do programa. Estou tentando encontrar um algoritmo eficiente para atualizar os caminhos mais curtos de um vértice para todos os outros vértices , depois de inserir uma aresta , sem precisar executar o algoritmo de caminho mais curto no novo gráfico novamente. Como posso fazer isso? Desde já, obrigado.vue

  • Nota: as alterações podem ser feitas após a primeira iteração do algoritmo
  • Nota [2]: dois nós são dados, a fonte de e o alvo. Preciso encontrar o caminho mais curto entre esses nós. Quando o gráfico é atualizado, só preciso atualizar , que é o caminho mais curto entre e .stπ(s,t)st
  • Nota [3]: Estou interessado apenas no caso de inserção de arestas.

Uma definição formal : Dado um gráfico . Definir uma operação de actualização como 1) uma inserção de uma extremidade para ou 2) aa eliminação de uma extremidade a partir de . O objetivo é encontrar com eficiência o custo de todos os pares de caminhos mais curtos após uma operação de atualização. Com eficiência, queremos dizer, pelo menos, melhor do que executar um algoritmo Todos os pares com o caminho mais curto, como o algoritmo Bellman-Ford, após cada operação de atualização.G=(V,E)eEeE


Edit: Abaixo há uma versão simplificada do problema:

Um gráfico ponderado é fornecido, consistindo de arestas unidirecionais e dois vértices críticos e . Um conjunto de arestas bidirecionais candidatas também é fornecido. Eu tenho que construir uma aresta para minimizar a distância de a .s t C ( u , v ) C sG(V,E)stC(você,v)Cst


Mais perguntas de esclarecimento: Os pontos finais do seu caminho permanecem sempre fixos? Você está interessado apenas no caso de inserção de aresta ou em alterações arbitrárias no gráfico? Eu acho que existem pesquisas respondendo à sua pergunta, mas infelizmente não sei realmente para onde procurar. Uma rápida pesquisa no Google mostra esses slides que parecem muito úteis, e este artigo: "caminhos mais curtos em gráficos dinâmicos" (espero que o link funcione). (você,v)
usul

Respostas:


14

O problema, como você provavelmente já percebeu, é um problema bastante difícil. Verificar a web levará a algumas instâncias complexas que provavelmente você não precisará. Aqui está uma solução - conforme necessário (ou seja, você não precisa recalcular tudo do zero).

no caso de adicionar uma aresta - depois usar sua matriz de distância já construída - faça o seguinte:(você,v)

Para cada par de nós e y, verifique se d ( ( x , u ) ) + c ( ( u , v ) ) + d ( ( v , y ) ) < d ( ( x , y ) ) - isso pode ser feito em O ( n 2 ), pois você está comparando todos os pares de nós.xyd((x,u))+c((u,v))+d((v,y))<d((x,y))O(n2)

Para o caso de exclusão de arestas: Dada a matriz de distância já construída, você pode ter para cada nó uma árvore de caminho mais curto enraizada em u . Se a borda excluída e não estiver nessa árvore, os caminhos mais curtos de u para todos os outros não serão afetados - (eles permanecem os mesmos).uueu

Se estiver na árvore do caminho mais curto de u , então para cada nó v, de modo que o caminho mais curto π ( u , v ) inclua e , os caminhos serão alterados. Portanto, calcule o caminho mais curto de u para v . Agora, repita o anterior para cada nó - essa não é a melhor solução. De fato, no pior dos casos, é assintoticamente equivalente a fazer tudo do zero, mas pode ser melhor em média. euvπ(u,v)euv

se você deseja obter melhores resultados do que isso, consulte:

  1. Demetrescu, Camil e Giuseppe F. Italiano. "Uma nova abordagem para dinamizar todos os pares de caminhos mais curtos." Journal of the ACM (JACM) 51.6 (2004): 968-992. (pode ser encontrado gratuitamente no Google)

  2. ou dê uma olhada nesta pesquisa bem escrita


17

O problema que você está solicitando é um conhecido problema de algoritmo. Na verdade, ainda está aberto, quão difícil é exatamente esse problema. Além disso, você deve saber que existem diferentes encarnações desse problema. Por outro lado, o que você está solicitando, geralmente apenas as distâncias são retornadas, enquanto você está solicitando os caminhos mais curtos reais. Observe que esses caminhos já podem ser muito longos. Os algoritmos de gráfico dinâmico distinguem apenas as exclusões de arestas (algoritmos dg decrescentes), apenas as inserções de arestas (algoritmos dg incrementais) e as inserções e exclusões de arestas (algoritmos dg totalmente dinâmicos). Assim, você está interessado em algoritmos incrementais .

Os algoritmos mencionados no post do AJed estão um pouco desatualizados. Há resultados mais recentes da Thorup, veja aqui, na página 8, para uma breve pesquisa. Atualmente, o melhor algoritmo APSP exato totalmente dinâmico da Thorup (para consultas à distância, não o caminho), precisa de tempo de atualização amortizado , enquanto suporta O ( 1 ) no pior dos casos, observe que, se você tiver O ( n log n )O(n2(registron+registro2(1+m/n))O(1)O(nregistron)arestas, então você pode simplesmente recalcular do zero com Dijkstra e Fibonacci-heaps e obter o mesmo tempo de execução do algoritmo de Thorup. Portanto, se seus gráficos não forem densos, eu recomendaria o uso do Dijkstra.

Não conheço nenhum algoritmo incremental melhor . Mas você deve fazer uma pesquisa na web se houver resultados mais recentes para esse problema especializado.


Não preciso atualizar todos os caminhos mais curtos do gráfico, mas apenas entre um determinado par . Existe algo melhor para isso? (s,t)
Rontogiannis Aristofanis

@RondogiannisAristophanes, de fato, o que foi proposto até agora é de alguma forma o melhor. Dê uma olhada neste artigo que afirma que: "os problemas de caminhos curtos de fonte única incremental e decremental, para gráficos direcionados ou não direcionados ponderados, são, em um forte sentido, pelo menos tão difíceis quanto os caminhos curtos dos pares estáticos problema." (para ser sincero, li apenas a introdução) - referência: "Em problemas dinâmicos de caminhos mais curtos", Roditty & Zwick - mas você poderia nos dizer qual é o problema exato que você tem? que cenário específico? o que você vestiu até agora? - talvez possamos ajudá-lo melhor.
precisa saber é

@RondogiannisAristophanes, quanto melhor o desempenho, mais difícil é a implementação (na maioria dos casos) e, às vezes, em aplicativos práticos, você não precisa de tantas melhorias no desempenho.
precisa saber é

@AJed Eu editei meu post para incluir uma descrição simplificada do problema.
Rontogiannis Aristofanis

5

Acredito que o algoritmo AD * possa ajudá-lo.

http://www.cs.cmu.edu/~ggordon/likhachev-etal.anytime-dstar.pdf

Quando são recebidas informações atualizadas sobre o gráfico subjacente, o algoritmo repara incrementalmente sua solução anterior. O resultado é uma abordagem que combina os benefícios de planejadores a qualquer momento e incrementais para fornecer soluções eficientes para problemas de pesquisa complexos e dinâmicos

Destaques do AD *: é "a qualquer momento", o que significa que pode fornecer uma "solução subótima" muito rapidamente, embora possa não ser a melhor. Com tempo suficiente, ele retornará a solução ideal. Além disso, você pode restringir a solução subótima a não ser pior do que a solução ideal por alguma constante definida pelo usuário. Isso permite que você use isso em um cenário de planejamento em tempo real, onde ter uma solução aceitável (onde 'ok' é teoricamente limitado) é melhor do que não ter nenhuma solução.

http://www.cs.cmu.edu/~maxim/software.html

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.