Deixe a próxima parte de um gráfico:
Quando uso a função shortest_path entre os pontos A e B, obtive o caminho azul. Por que isso acontece?
postgis
postgresql
pgrouting
José Alejandro
fonte
fonte
Respostas:
É assim que o shortest_path (algoritmo de Dijkstra) se comporta no pgRouting. Se houver duas arestas com a mesma origem e destino, será usada uma aleatória (para ser mais preciso: a primeira que sai do banco de dados). Não conheço nenhuma solução para isso, mas existem algumas soluções alternativas.
Se possível, você deve dividir uma dessas arestas em duas. Não testei, mas deve corrigir esse comportamento.
Outra solução para o caso, quando você não pode modificar seu conjunto de dados. Adicione o campo 'short_alternative' à sua tabela. Consulta de amostra, modifique-a de acordo com suas necessidades. Espero que explique a ideia:
Agora, a borda '0,098' conterá o ID da borda '0,011'. Todas as outras arestas terão nulo no campo short_alternative. Depois de fazer a consulta shortest_path, verifique o conjunto de dados retornado - se alguma linha tiver um conjunto de campos alternativos mais curtos, altere-o.
fonte
O problema já foi descrito na resposta anterior. É um problema dos algoritmos de caminho mais curto "baseados em vértices", que se preocupam apenas com a origem e o destino.
Existe um ticket no rastreador de problemas e uma possível solução para alterar a implementação do algoritmo: https://github.com/pgRouting/pgrouting/issues/34 (Seria bom se alguém pudesse tentar fazer isso e enviar uma solicitação pull; - )
Outra possibilidade é dividir "ligações rodoviárias paralelas", como mencionado anteriormente. Ou você pode usar o algoritmo Shooting Star, que é direcionado de ponta a ponta para que "conheça" os dois links da estrada.
Ou você pode tentar solicitar a rede rodoviária por custo e selecionar apenas combinações distintas de origem e destino:
Isso pressupõe que você procure a rota mais barata. Caso contrário, você precisa
ORDER BY ... DESC
.Você precisa experimentar se isso afeta o desempenho.
fonte
Na verdade, eu criei um patch para o pgRouting, que resolve o problema: https://github.com/pgRouting/pgrouting/issues/78
fonte