pgRouting이 최적의 경로를 반환하지 않는 이유는 무엇입니까?


9

그래프의 다음 부분을 보자.

여기에 이미지 설명을 입력하십시오 점 A와 B 사이에 shortest_path 함수를 사용하면 파란색 경로가 나타납니다. 왜 이런 일이 발생합니까?


설명에서, 나는 실수를했다, 빨간색이 아닌 빨간색, 죄송합니다!
— José Alejandro

답변:


7

이것이 바로 pgRouting에서 shortest_path (Dijkstra의 알고리즘)의 작동 방식입니다. 소스와 대상이 동일한 두 개의 모서리가있는 경우 임의의 것 (정확히 말하면 데이터베이스에서 나온 것)이 사용됩니다. 나는 그에 대한 해결책을 모르지만 몇 가지 해결 방법이 있습니다.

가능하면 해당 가장자리 중 하나를 두 개로 나눠야합니다. 나는 그것을 테스트하지는 않았지만 그 행동을 고쳐야합니다.

데이터 세트를 수정할 수없는 경우를위한 다른 솔루션입니다. 테이블에 'shorter_alternative'필드를 추가하십시오. 샘플 쿼리는 필요에 따라 수정하십시오. 아이디어가 설명되기를 바랍니다.

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'에는 모서리 '0.011'의 id가 포함됩니다. shorter_alternative 필드에서 다른 모든 모서리는 null입니다. shortest_path 조회를 작성한 후 리턴 된 데이터 세트를 점검하십시오. shorter_alternative 필드 세트가있는 행이 있으면 변경하십시오.


2

문제는 이미 이전 답변에서 설명되었습니다. "vertex-based"최단 경로 알고리즘의 문제로, 소스와 대상 만 신경 쓰는 것입니다.

이슈 트래커에서 티켓 및 알고리즘 구현 변경 가능한 솔루션이 있습니다 : https://github.com/pgRouting/pgrouting/issues/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 함수를 빌드 하고이 문제가없는 것처럼 보입니다. 어쨌든, 설명 감사합니다 !!!.
— José Alejandro

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.