Чому pgRouting не повертає найкращий шлях?


9

Нехай наступна частина графіка:

введіть тут опис зображення Коли я використовую функцію найкоротший_ шлях між точками А і В, я отримав синій шлях. Чому це відбувається?


У поясненні я помилився, червоний синій не червоний, вибачте!
Хосе Алехандро

Відповіді:


7

Ось як поводиться shorttest_path (алгоритм Дейкстри) в pgRouting. Якщо є два ребра з однаковим джерелом та ціллю, використовується випадковий (якщо бути точним: перший, який виходить із бази даних). Я не знаю жодних виправлень для цього, але є деякі шляхи вирішення.

Якщо можливо, слід розділити один з цих країв на два. Я цього не перевіряв, але це має виправити таку поведінку.

Інше рішення для випадку, коли ви не можете змінити свій набір даних. Додайте поле "короткі_альтернативні" до таблиці. Зразок запиту, змініть його під свої потреби. Я сподіваюся, що це пояснює ідею:

UPDATE roads t1
SET shorter_alternative = t2.id
FROM roads t2
WHERE 
((t2.source = t1.source AND t2.target = t1.target) OR
(t2.source = t1.target AND t2.target = t1.source)) AND
(t2.length < t1.length)

Тепер, край '0.098' буде містити id краю '0,011'. Усі інші ребра будуть мати нульові значення у коротшому_альтернативному полі. Після того, як ви зробили запит shorttest_path, перевірте повернутий набір даних - якщо для будь-яких рядків встановлено коротше_альтернативне поле, змініть його.


2

Проблема вже була описана в попередній відповіді. Це проблема алгоритмів найкоротших маршрутів на основі вершин, які дбають лише про джерело та ціль.

У трекері випусків є квиток і можливе рішення змінити алгоритм реалізації: https://github.com/pgRouting/pgrouting/isissue/34 (Було б добре, якби хтось міг спробувати це і надіслати запит на виклик; - )

Інша можливість - це роздвоєння "паралельних дорожніх ліній", як згадувалося раніше. Або ви можете скористатися алгоритмом Shooting Star, який здійснює маршрутизацію від краю до краю, щоб він «знав» про обидва дорожні зв’язки.

Або ви можете спробувати замовити дорожню мережу за вартістю, а потім вибрати лише різні комбінації джерела та цілі:

SELECT * FROM shortest_path(
  'SELECT DISTINCT ON (source, target)
      gid as id,
      source::integer,
      target::integer,
      cost::double precision
    FROM ways ORDER BY source, target, cost',
  true,false
);

Це передбачає, що ви шукаєте найменш дорогий маршрут. Інакше потрібно ORDER BY ... DESC.

Вам потрібно спробувати, чи це впливає на продуктивність.


Вчора я будую функцію trsp і, схоже, не має цієї проблеми. У будь-якому випадку, дякую за пояснення !!!.
Хосе Алехандро

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.