Пусть следующая часть графа:
Когда я использую функцию shorttest_path между точками A и B, я получаю синий путь. Почему это происходит?
postgis
postgresql
pgrouting
Хосе Алехандро
источник
источник
Ответы:
Так ведет себя кратчайший путь (алгоритм Дейкстры) в pgRouting. Если есть два ребра с одинаковым источником и целью, используется случайный (если быть точным: первый, который выходит из базы данных). Я не знаю, как это исправить, но есть некоторые обходные пути.
Если возможно, вы должны разделить один из этих краев на два. Я не проверял это, но это должно исправить это поведение.
Другое решение для случая, когда вы не можете изменить свой набор данных. Добавьте поле 'shorter_alternative' в свою таблицу. Пример запроса, измените его в соответствии с вашими потребностями. Я надеюсь, что это объясняет идею:
Теперь ребро «0.098» будет содержать идентификатор ребра «0.011». Все остальные ребра будут иметь значение null в поле shorter_alternative. После того как вы сделали запрос shorttest_path, проверьте возвращенный набор данных - если в какой-либо строке задано поле shorter_alternative, измените его.
источник
Проблема уже была описана в предыдущем ответе. Это проблема «основанных на вершинах» алгоритмов кратчайшего пути, которые заботятся только об источнике и цели.
В трекере ошибок есть тикет и возможное решение для изменения реализации алгоритма: https://github.com/pgRouting/pgrouting/issues/34 (было бы неплохо, если бы кто-то мог попробовать это и отправить запрос на извлечение; - )
Другая возможность заключается в разделении «параллельных дорожных связей», как упоминалось ранее. Или вы можете использовать алгоритм Shooting Star, который проходит от края до края, чтобы он «знал» об обеих дорожных связях.
Или вы можете попробовать заказать дорожную сеть по стоимости, а затем выбрать только различные комбинации источника и цели:
Это предполагает, что вы ищете наименее дорогой маршрут. В противном случае вам нужно
ORDER BY ... DESC
.Вы должны попробовать, если это влияет на производительность.
источник
Я на самом деле создал патч для pgRouting, который решает проблему: https://github.com/pgRouting/pgrouting/issues/78
источник