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.
- 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 .
- 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.
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 s
fonte
Respostas:
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:( u , 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.x y d((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).u u e u
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.e u v π(u,v) e u v
se você deseja obter melhores resultados do que isso, consulte:
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)
ou dê uma olhada nesta pesquisa bem escrita
fonte
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( logn + log2( 1 + m / n ) ) O ( 1 ) O ( n logn ) 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.
fonte
Acredito que o algoritmo AD * possa ajudá-lo.
http://www.cs.cmu.edu/~ggordon/likhachev-etal.anytime-dstar.pdf
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
fonte