Quais os melhores algoritmos de caminho mais curto que devo considerar?


13

Estou resolvendo um problema de otimização de pesquisa de gráficos. Preciso encontrar os k caminhos mais curtos acíclicos através de um gráfico ponderado direcionado.

Eu sei que existem vários algoritmos k-best exatos e aproximados, mas a maioria das pesquisas recentes parece estar orientada para gráficos muito grandes e muito pouco conectados (por exemplo, roteiros e direções), e meu gráfico não é.

Distinguindo aspectos do meu problema:

  • O gráfico consiste em aproximadamente 160 vértices.

  • O gráfico está quase totalmente conectado (bidirecionalmente, então ~ 160 ^ 2 ~ = 25k arestas)

  • k será bem pequeno (provavelmente menor que 10)

  • O comprimento máximo do caminho provavelmente também será limitado e muito pequeno (por exemplo, 3-5 arestas)

  • Eu disse 'acíclico' acima, mas apenas para reiterar - as soluções não devem incluir ciclos. Esse não é um problema para o melhor caminho mais curto, mas torna-se um problema para o k-best - por exemplo, considere um roteiro - o segundo caminho mais curto de A a B pode ser o mesmo que o 1, uma viagem rápida em torno de uma quadra em algum lugar. Isso pode ser matematicamente ideal, mas não é uma solução muito útil. ;-)

  • Talvez seja necessário ponderar novamente as arestas rapidamente para cada cálculo. Um custo de borda consiste em uma soma ponderada de vários fatores, e os requisitos finais (sempre que os obtemos) podem permitir que um usuário especifique sua própria priorização desses fatores de ponderação, alterando os pesos das bordas. Este é um gráfico relativamente pequeno (poderemos representá-lo em algumas centenas de KB); portanto, é provavelmente razoável clonar o gráfico na memória, aplicar a nova ponderação e executar a pesquisa no gráfico clonado. Mas se houver um método mais eficaz de realizar a pesquisa enquanto estiver computando pesos on-the-fly, estou interessado.

Estou olhando para os algoritmos descritos em Santos (algoritmos de caminho mais curto K), Eppstein 1997 (Finding the k Shortest Paths) e outros. O algoritmo de Yen é interessante, principalmente por causa da implementação Java existente . Não tenho medo de ler os trabalhos de pesquisa, mas achei que valia a pena jogar fora os detalhes do meu problema e pedir dicas para economizar tempo de leitura.

E se você tiver ponteiros para implementações Java, melhor ainda.


+1, porque estou interessado nas sugestões que as pessoas têm e esse parece ser o tipo exato de pergunta para a qual este site foi feito.
precisa saber é o seguinte

Sua condição acíclica não significa que QUALQUER outro caminho do início ao objetivo criaria um ciclo com o primeiro caminho? E se o início e o objetivo estiverem em um beco sem saída, todo caminho deve usar essas duas arestas.
user470365

Talvez eu não estivesse claro. A restrição acíclica se aplica apenas a um único caminho - naturalmente, quaisquer 2 caminhos distintos de A a B formarão um ciclo.
AaronD

@ AaronD: então, qual você usou no final?
Dagnelies

@arnaud: Não tenho certeza de ter decidido um algoritmo ainda; Vou adicionar uma atualização a esta pergunta quando tiver. Eu eliminei o Eppstein porque ele não garante soluções acíclicas (também conhecidas como "simples"). Atualmente, estou trabalhando com o algoritmo de Yen, mas ainda não cheguei a um perfil ou otimização detalhados, por isso talvez precise substituí-lo por outro. Vou atualizar na próxima semana ou duas.
AaronD

Respostas:


2

Para responder parcialmente a minha própria pergunta:

Desde que postei essa pergunta, descobri que precisamos lidar com pesos de borda negativos e positivos (a limitação aos caminhos acíclicos / simples / sem loop significa que a melhor solução é definida, enquanto sem essa limitação o caminho mais curto em um gráfico com valores negativos- ciclos de custo é indefinido).

O algoritmo de Yen, e a maioria dos outros que examinei, dependem de uma série de uma das melhores pesquisas; a maioria usa o Dijkstra para essas pesquisas intermediárias. Dijkstra não suporta pesos negativos, mas podemos substituir Bellman-Ford em seu lugar (pelo menos em ienes; presumivelmente em Lawler ou Eppstein também). Desenvolvi uma modificação do Bellman-Ford com uma limitação de comprimento do caminho (nas bordas) e verificação explícita do ciclo durante a pesquisa (no lugar da detecção padrão do ciclo pós-pesquisa). A complexidade computacional é pior, mas ainda é tratável para meus requisitos. Vou editar esta resposta e vincular a um relatório técnico se tiver permissão para publicá-lo.


1

Eu diria que esta pergunta pode ser facilmente pesquisada no Google e também é uma duplicata:

Dito isto, eu já usei e implementei o Eppstein e o recomendo. Eu achei bastante elegante. Se bem me lembro, pode ser ideal também, e o artigo a seguir explica muito bem:

http://pdf.aminer.org/001/059/121/finding_the_k_shortest_paths.pdf


Primeiro, obrigado pela recomendação de Eppstein. Vou procurar mais lá. Eu diria que essa não é uma duplicata exata, nem é fácil pesquisar no Google; é fácil encontrar um algoritmo k-best, mas não é tão fácil escolher sensivelmente entre eles. Espero que deseje um algoritmo muito diferente para um gráfico escassamente conectado de milhões de vértices do que o desejo para esse problema. Eu me importaria muito mais com a complexidade em k se eu quisesse os 1000 melhores em vez dos 10 melhores. E, embora fatores constantes não sejam tão importantes na publicação de documentos, certamente são no envio do código de produção.
AaronD

@ AaronD: apenas para sua informação, acho que o algoritmo é muito eficiente em qualquer caso. Talvez existam casos especiais em que as pesquisas orientadas por heurísticas o superam, mas para o caso geral, acho que funciona muito bem. O desempenho exato provavelmente dependerá mais de como exatamente você o implementou, da eficiência de suas estruturas de dados e de como é adaptado ao seu problema.
dagnelies

@arnaud Oi, é possível compartilhar a implementação do seu eppstein? Eu tenho uma pergunta semelhante postada aqui: math.stackexchange.com/questions/1661737/…
Tina J
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.