Soit la partie suivante d'un graphique:
Lorsque j'utilise la fonction shortest_path entre les points A et B, j'ai le chemin bleu. Pourquoi cela arrive-t-il?
postgis
postgresql
pgrouting
José Alejandro
la source
la source
Réponses:
C'est ainsi que shortest_path (l'algorithme de Dijkstra) se comporte dans pgRouting. S'il y a deux bords avec la même source et la même cible, un aléatoire (pour être précis: le premier, qui provient de la base de données) est utilisé. Je ne connais aucune solution à cela, mais il existe des solutions de contournement.
Si possible, vous devez diviser l'un de ces bords en deux. Je ne l'ai pas testé, mais cela devrait corriger ce comportement.
Autre solution pour le cas où vous ne pouvez pas modifier votre jeu de données. Ajoutez le champ 'short_alternative' à votre table. Exemple de requête, modifiez-le selon vos besoins. J'espère que cela explique l'idée:
Maintenant, le bord «0,098» contiendra l'identifiant du bord «0,011». Tous les autres bords auront null dans le champ short_alternative. Après avoir effectué la requête shortest_path, vérifiez le jeu de données renvoyé - si des lignes ont un champ short_alternative défini, modifiez-le.
la source
Le problème a déjà été décrit dans la réponse précédente. C'est un problème d'algorithmes de chemin le plus court "basés sur des sommets", qui ne se soucient que de la source et de la cible.
Il y a un ticket dans le tracker de problème et une solution possible pour changer l'implémentation de l'algorithme: https://github.com/pgRouting/pgrouting/issues/34 (Ce serait bien si quelqu'un pouvait l'essayer et envoyer une demande de tirage; - )
Une autre possibilité est de diviser les "liaisons routières parallèles" comme mentionné précédemment. Ou vous pouvez utiliser l'algorithme Shooting Star, qui route d'un bord à l'autre afin qu'il "connaisse" les deux liaisons routières.
Ou vous pouvez essayer de commander le réseau routier par coût, puis sélectionner uniquement des combinaisons distinctes de source et de cible:
Cela suppose que vous recherchez l'itinéraire le moins cher. Sinon, vous devez
ORDER BY ... DESC
.Vous devez essayer si cela affecte les performances.
la source
J'ai en fait créé un patch pour pgRouting, qui résout le problème: https://github.com/pgRouting/pgrouting/issues/78
la source