Hãy để phần tiếp theo của biểu đồ:
Khi tôi sử dụng hàm shortest_path giữa các điểm A và B, tôi có đường dẫn màu xanh. Lý do tại sao điều này xảy ra?
Hãy để phần tiếp theo của biểu đồ:
Khi tôi sử dụng hàm shortest_path giữa các điểm A và B, tôi có đường dẫn màu xanh. Lý do tại sao điều này xảy ra?
Câu trả lời:
Đó là cách shortest_path (thuật toán của Dijkstra) hoạt động trong pgRouting. Nếu có hai cạnh có cùng nguồn và đích, thì một ngẫu nhiên (chính xác là: đầu tiên, xuất phát từ cơ sở dữ liệu) được sử dụng. Tôi không biết bất kỳ sửa chữa cho điều đó, nhưng có một số cách giải quyết.
Nếu có thể, bạn nên chia một trong các cạnh đó thành hai. Tôi đã không kiểm tra nó, nhưng nó sẽ khắc phục hành vi đó.
Giải pháp khác cho trường hợp, khi bạn không thể sửa đổi tập dữ liệu của mình. Thêm trường 'short_alternative' vào bảng của bạn. Truy vấn mẫu, sửa đổi nó theo nhu cầu của bạn. Tôi hy vọng nó giải thích ý tưởng:
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)
Bây giờ, cạnh '0,098' sẽ chứa id của cạnh '0,011'. Tất cả các cạnh khác sẽ có null trong trường short_alternative. Sau khi bạn đã thực hiện truy vấn shortest_path, hãy kiểm tra tập dữ liệu được trả về - nếu bất kỳ hàng nào có trường short_alternative được đặt, hãy thay đổi nó.
Vấn đề đã được mô tả trong câu trả lời trước. Đó là một vấn đề về thuật toán đường đi ngắn nhất "dựa trên đỉnh", chỉ quan tâm đến nguồn và đích.
Có một vé trong trình theo dõi vấn đề và một giải pháp khả thi để thay đổi việc thực hiện thuật toán: https://github.com/pgRouting/pgrouting/issues 432 (Sẽ rất tuyệt nếu ai đó có thể thử điều này và gửi yêu cầu kéo; - )
Một khả năng khác là tách "liên kết đường song song" như đã đề cập trước đó. Hoặc bạn có thể sử dụng thuật toán Chụp sao, định tuyến từ mép này sang mép kia để nó "biết" về cả hai liên kết đường bộ.
Hoặc bạn có thể thử đặt hàng mạng đường bằng chi phí và sau đó chỉ chọn các kết hợp nguồn và mục tiêu riêng biệt:
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
);
Điều này giả định rằng bạn tìm kiếm tuyến đường ít tốn kém nhất. Nếu không bạn cần ORDER BY ... DESC
.
Bạn cần thử nếu điều này ảnh hưởng đến hiệu suất.
Tôi thực sự đã tạo một bản vá cho pgRouting, khắc phục sự cố: https://github.com/pgRouting/pgrouting/issues/78