Thuật toán nào tính toán hướng từ điểm A đến điểm B trên bản đồ?


543

Làm thế nào để các nhà cung cấp bản đồ (như Google hoặc Yahoo! Maps) đề xuất hướng dẫn?

Ý tôi là, họ có thể có dữ liệu trong thế giới thực ở một số dạng, chắc chắn bao gồm khoảng cách nhưng cũng có thể là những thứ như tốc độ lái xe, sự hiện diện của vỉa hè, lịch trình xe lửa, v.v. Nhưng giả sử dữ liệu ở định dạng đơn giản hơn, giả sử biểu đồ có hướng rất lớn với trọng lượng cạnh phản ánh khoảng cách. Tôi muốn có thể nhanh chóng tính toán các hướng từ điểm này sang điểm khác. Đôi khi những điểm này sẽ ở gần nhau (trong một thành phố) trong khi đôi khi chúng sẽ cách xa nhau (xuyên quốc gia).

Các thuật toán đồ thị như thuật toán của Dijkstra sẽ không hoạt động vì đồ thị rất lớn. May mắn thay, các thuật toán heuristic như A * có thể sẽ hoạt động. Tuy nhiên, dữ liệu của chúng tôi rất có cấu trúc, và có lẽ một số cách tiếp cận theo tầng có thể hoạt động? (Ví dụ: lưu trữ các hướng được tính toán trước giữa các điểm "khóa" nhất định cách xa nhau, cũng như một số hướng cục bộ. Sau đó, các hướng cho hai điểm ở xa sẽ liên kết các hướng cục bộ đến một điểm chính, hướng toàn cầu đến một điểm quan trọng khác và sau đó cục bộ chỉ đường một lần nữa.)

Những thuật toán thực sự được sử dụng trong thực tế?

Tái bút Câu hỏi này được thúc đẩy bằng cách tìm ra những điều kỳ quặc trong các hướng ánh xạ trực tuyến. Trái ngược với bất đẳng thức tam giác, đôi khi Google Maps cho rằng XZ mất nhiều thời gian hơn và xa hơn so với sử dụng điểm trung gian như trong XYZ . Nhưng có lẽ hướng đi bộ của họ tối ưu hóa cho một tham số khác, quá?

PPS. Đây là một vi phạm khác về bất đẳng thức tam giác gợi ý (với tôi) rằng họ sử dụng một số cách tiếp cận theo cấp bậc: XZ so với XYZ . Cái trước dường như sử dụng Boulevard de Sebastopol nổi bật mặc dù nó hơi xa cách.

Chỉnh sửa : Cả hai ví dụ này dường như không còn hoạt động nữa, nhưng cả hai đã làm tại thời điểm của bài viết gốc.


3
BTW, Thuật toán A * "là một khái quát của thuật toán Dijkstra giúp cắt giảm kích thước của sơ đồ con phải được khám phá, nếu có thêm thông tin cung cấp giới hạn thấp hơn về" khoảng cách "đến mục tiêu"
Mitch Wheat

Re A *: vâng, thực sự. May mắn thay, trong trường hợp của chúng tôi, "thông tin bổ sung" này có sẵn chẳng hạn bằng cách sử dụng khoảng cách đường thẳng. Khi tôi nói "Dijkstra" ở trên, ý tôi là vanilla Dijkstra.
A. Rex

Hướng đi bộ? Không biết về bất cứ nơi nào khác, nhưng quanh đây (Hampshire, Vương quốc Anh), G lớn không có dữ liệu về người đi bộ - nó dẫn tôi dọc theo các con đường xung quanh khu vực dành cho người đi bộ, v.v. Điều duy nhất tốt nhất là thay đổi ước tính thời gian dành cho tuyến đường :)
jTresidder

Tôi không đặc biệt quan tâm nếu các hướng là dành cho lái xe hoặc đi bộ. Tôi chỉ muốn biết làm thế nào họ làm việc! Lý do tôi có các liên kết đi bộ là vì tôi đang tính toán một cách để đi bộ xung quanh Paris và xem tất cả 66 đài phun nước Wallace. (Điểm cuối của những bản đồ đó phải là đài phun nước Wallace.)
A. Rex

Tiền thưởng cho câu hỏi này là để khuyến khích các câu trả lời ngày càng tốt hơn, đặc biệt là từ những người làm việc tại một trong những nhà cung cấp chính. Nhận xét về cấu trúc dữ liệu, thuật toán, bao nhiêu tiền được tính toán, v.v., đều được đánh giá cao.
A. Rex

Câu trả lời:


526

Nói như một người đã dành 18 tháng làm việc tại một công ty lập bản đồ, bao gồm làm việc với thuật toán định tuyến ... vâng, Dijkstra không hoạt động, với một vài sửa đổi:

  • Thay vì thực hiện Dijkstra một lần từ nguồn đến định mệnh, bạn bắt đầu ở mỗi đầu và mở rộng cả hai bên cho đến khi chúng gặp nhau ở giữa. Điều này giúp loại bỏ khoảng một nửa công việc (2 * pi * (r / 2) ^ 2 so với pi * r ^ 2).
  • Để tránh khám phá các con hẻm của mỗi thành phố giữa nguồn và đích của bạn, bạn có thể có một vài lớp dữ liệu bản đồ: Lớp 'đường cao tốc' chỉ chứa đường cao tốc, lớp 'thứ cấp' chỉ chứa đường phụ, v.v. Sau đó, bạn chỉ khám phá các phần nhỏ hơn của các lớp chi tiết hơn, mở rộng khi cần thiết. Rõ ràng mô tả này để lại rất nhiều chi tiết, nhưng bạn có ý tưởng.

Với các sửa đổi dọc theo các dòng đó, bạn có thể thực hiện định tuyến xuyên quốc gia theo khung thời gian rất hợp lý.


29
Một người đã làm việc này trong thế giới thực, tuyệt vời! Bạn có biết bao nhiêu khả năng để tính toán trước, như trong bài viết về Google được đề cập trong một bình luận khác không?
A. Rex

10
Chúng tôi đã không thực hiện bất kỳ tiền xử lý nào về bản chất đó, nhưng nó chắc chắn có vẻ như là một tối ưu hóa thú vị.
Nick Johnson

29
"nó chỉ được đảm bảo để tạo ra một giải pháp, không nhất thiết là giải pháp hiệu quả nhất" Điều này là không đúng sự thật; miễn là heuristic được sử dụng là chấp nhận được, thuật toán A * tạo ra đường dẫn chi phí thấp nhất. Được chấp nhận có nghĩa là chi phí không bao giờ được ước tính quá mức, nhưng nó có thể được đánh giá thấp (nhưng ước tính kém sẽ làm chậm thuật toán). Sử dụng dữ liệu từ tiền xử lý có khả năng hỗ trợ trong việc tạo ra một heuristic dễ chấp nhận hơn và do đó làm cho A * hoạt động nhanh hơn.
a1kmm

6
Trên thực tế, xem xét thêm, bạn hoàn toàn đúng. Bạn có thể nâng cao một thuật toán hiện có để sử dụng điều này bằng cách thêm Khoảng cách Vòng tròn Lớn giữa nút mục tiêu và đích đến chi phí của cạnh được đánh giá. Tôi thực sự không chắc liệu thuật toán của chúng tôi có làm được điều đó không - nhưng đó là một sự tối ưu hóa rất hợp lý.
Nick Johnson

11
A *, trong trường hợp xấu nhất (một heuristic nói rằng tất cả các đường dẫn đều tương đương), hoàn toàn bằng với Djikstra.
Tordek

111

Câu hỏi này đã là một lĩnh vực nghiên cứu tích cực trong những năm qua. Ý tưởng chính là thực hiện tiền xử lý trên biểu đồ một lần , để tăng tốc tất cả các truy vấn sau . Với hành trình thông tin bổ sung này có thể được tính toán rất nhanh. Tuy nhiên, Thuật toán của Dijkstra là cơ sở cho tất cả các tối ưu hóa.

Arachnid đã mô tả việc sử dụng tìm kiếm hai chiều và cắt tỉa cạnh dựa trên thông tin phân cấp. Các kỹ thuật tăng tốc này hoạt động khá tốt, nhưng các thuật toán gần đây nhất vượt trội hơn các kỹ thuật này bằng mọi cách. Với các thuật toán hiện tại, các đường dẫn ngắn nhất có thể được tính toán trong thời gian ít hơn đáng kể so với một phần nghìn giây trên mạng lưới đường lục địa. Việc triển khai nhanh thuật toán chưa sửa đổi của Dijkstra cần khoảng 10 giây .

Bài viết Kỹ thuật thuật toán lập kế hoạch tuyến nhanh cung cấp một cái nhìn tổng quan về tiến trình nghiên cứu trong lĩnh vực đó. Xem tài liệu tham khảo của bài báo đó để biết thêm thông tin.

Các thuật toán được biết đến nhanh nhất không sử dụng thông tin về trạng thái phân cấp của đường trong dữ liệu, tức là nếu đó là đường cao tốc hoặc đường địa phương. Thay vào đó, họ tính toán trong bước tiền xử lý một hệ thống phân cấp riêng được tối ưu hóa để tăng tốc độ lập kế hoạch tuyến đường. Tiền mã hóa này sau đó có thể được sử dụng để cắt xén tìm kiếm: Xa khỏi điểm bắt đầu và đích chậm không cần phải xem xét trong Thuật toán của Dijkstra. Những lợi ích là hiệu suất rất tốt và đảm bảo tính chính xác cho kết quả.

Các thuật toán lập kế hoạch tuyến đường được tối ưu hóa đầu tiên chỉ xử lý các mạng đường tĩnh, có nghĩa là một cạnh trong biểu đồ có giá trị chi phí cố định. Điều này không đúng trong thực tế, vì chúng tôi muốn đưa thông tin động như kẹt xe hoặc hạn chế phụ thuộc vào xe. Các thuật toán mới nhất cũng có thể xử lý các vấn đề như vậy, nhưng vẫn còn những vấn đề cần giải quyết và nghiên cứu đang diễn ra.

Nếu bạn cần khoảng cách đường đi ngắn nhất để tính toán giải pháp cho TSP , thì có lẽ bạn quan tâm đến ma trận chứa tất cả khoảng cách giữa các nguồn và đích của bạn. Đối với điều này, bạn có thể xem xét tính toán nhiều đường đi ngắn nhất bằng cách sử dụng phân cấp đường cao tốc . Lưu ý rằng điều này đã được cải thiện bởi các phương pháp mới hơn trong 2 năm qua.


1
Khai sáng, thực sự. Các cách tiếp cận mới hơn mà bạn đang đề cập là gì?
Tomas Pajonk

1
Đặc biệt là phân cấp Contraction. Bạn có thể tìm hiểu thêm về nó ở đây: algo2.iti.kit.edu/routeplanning.php . Ngoài ra còn có một cuộc trò chuyện về công nghệ google về nó: youtube.com/watch?v=-0ErpE8tQbw
SebastianK

19

Chỉ cần giải quyết các vi phạm bất bình đẳng tam giác, hy vọng yếu tố bổ sung mà họ tối ưu hóa là lẽ thường. Bạn không nhất thiết muốn con đường ngắn nhất hoặc nhanh nhất, vì nó có thể dẫn đến sự hỗn loạn phá hủy . Nếu bạn muốn chỉ đường của mình thích các tuyến đường chính thân thiện với xe tải và có thể đối phó với việc mọi tài xế theo dõi sat-nav được gửi xuống, bạn hãy nhanh chóng loại bỏ bất đẳng thức tam giác [1].

Nếu Y là một khu dân cư hẹp giữa X và Z, có lẽ bạn chỉ muốn sử dụng phím tắt qua Y nếu người dùng yêu cầu XYZ rõ ràng. Nếu họ yêu cầu XZ, họ nên bám vào những con đường lớn ngay cả khi nó xa hơn một chút và mất nhiều thời gian hơn. Nó tương tự như nghịch lý của Braess - nếu mọi người cố gắng đi con đường ngắn nhất, nhanh nhất, tắc nghẽn có nghĩa là đó không phải là con đường nhanh nhất cho bất kỳ ai nữa. Từ đây chúng ta đi lạc từ lý thuyết đồ thị thành lý thuyết trò chơi.

[1] Trên thực tế, mọi hy vọng rằng khoảng cách được tạo ra sẽ là hàm khoảng cách theo nghĩa toán học sẽ chết khi bạn cho phép đường một chiều và mất yêu cầu đối xứng. Mất bất bình đẳng tam giác cũng chỉ là xát muối vào vết thương.


14

Đây là thuật toán định tuyến nhanh nhất thế giới được so sánh và chứng minh tính chính xác:

http://algo2.iti.uka.de/schultes/hwy/schultes_diss.pdf

Đây là một cuộc thảo luận về công nghệ google về chủ đề này:

http://www.youtube.com/watch?v=-0ErpE8tQbw

Đây là một triển khai của thuật toán phân cấp đường cao tốc như được thảo luận bởi các học giả (hiện chỉ có ở berlin, tôi đang viết giao diện và một phiên bản di động cũng đang được phát triển):

http://tom.mapsforge.org/


9

Tôi chưa từng làm việc trên Google hoặc Microsoft hoặc Yahoo Maps, vì vậy tôi không thể cho bạn biết cách họ làm việc.

Tuy nhiên, tôi đã thiết kế một hệ thống tối ưu hóa chuỗi cung ứng tùy chỉnh cho một công ty năng lượng bao gồm một ứng dụng lập lịch và định tuyến cho đội xe tải của họ. Tuy nhiên, tiêu chí của chúng tôi về định tuyến là đặc thù kinh doanh hơn nhiều so với việc xây dựng hoặc giao thông chậm hoặc đóng làn đường.

Chúng tôi đã sử dụng một kỹ thuật gọi là ACO (tối ưu hóa thuộc địa Ant) để lên lịch và định tuyến xe tải. Kỹ thuật này là một kỹ thuật AI được áp dụng cho vấn đề nhân viên bán hàng du lịch để giải quyết các vấn đề định tuyến. Thủ thuật với ACO là xây dựng một tính toán lỗi dựa trên các sự kiện đã biết về định tuyến để mô hình giải quyết đồ thị biết khi nào nên thoát (khi nào thì lỗi đủ nhỏ).

Bạn có thể google ACO hoặc TSP để tìm hiểu thêm về kỹ thuật này. Tuy nhiên, tôi chưa sử dụng bất kỳ công cụ AI nguồn mở nào cho việc này, vì vậy không thể đề xuất một công cụ nào (mặc dù tôi nghe nói SWARM khá toàn diện).


4
định tuyến! = muỗng cà phê. trong tsp bạn biết tất cả các khoảng cách và bạn tối ưu hóa thứ tự dừng - đây không phải là điểm để chỉ điểm.
Karussell

8

Các thuật toán đồ thị như thuật toán của Dijkstra sẽ không hoạt động vì đồ thị rất lớn.

Đối số này không nhất thiết phải giữ vì Dijkstra thường không nhìn vào biểu đồ hoàn chỉnh mà chỉ là một tập hợp con rất nhỏ (biểu đồ được liên kết với nhau càng tốt, tập hợp con này càng nhỏ).

Dijkstra thực sự có thể thực hiện khá tốt cho các đồ thị hoạt động tốt. Mặt khác, với tham số cẩn thận A * sẽ luôn hoạt động tốt như vậy, hoặc tốt hơn. Bạn đã thử làm thế nào nó sẽ thực hiện trên dữ liệu của bạn?

Điều đó nói rằng, tôi cũng rất muốn nghe về kinh nghiệm của những người khác. Tất nhiên, các ví dụ nổi bật như tìm kiếm của Google Map đặc biệt thú vị. Tôi có thể tưởng tượng một cái gì đó giống như một người hàng xóm gần nhất theo đạo heuristic.


2
Giả sử bạn đang cố gắng tìm hướng từ điểm A đến B, khoảng cách tối ưu là d. Thuật toán của Dijkstra, ít nhất, sẽ kiểm tra tất cả các điểm ở khoảng cách xa nhất từ ​​A. Nếu A là San Francisco và B là Boston, điều này có nghĩa là nó kiểm tra hầu hết Hoa Kỳ. N'est-ce pas?
A. Rex

2
Vâng, đúng vậy. Điều tôi muốn nhận được là A * có thể được sử dụng thay thế và nó luôn tìm thấy một giải pháp tối ưu (mặc dù nó sử dụng phương pháp phỏng đoán)!
Konrad Rudolph

Phải, tất nhiên. Sau khi tôi viết bài gốc, tôi nghĩ về từ "heuristic" mà tôi đã sử dụng. Ở đây có một chút không chính xác, bởi vì nó tìm thấy một giải pháp tối ưu.
A. Rex

2
Vâng, vấn đề là A * sử dụng để phân tích (như trái ngược với một) để xác định các bước tiếp theo. Quyết định này thực sự có thể là tối ưu. Nhưng nó chỉ ảnh hưởng đến thời gian chạy chứ không phải kết quả, vì nó chỉ xác định mức độ tốt hơn Dijstra mà nó đoán.
Konrad Rudolph

8

Trạng thái hiện tại của nghệ thuật về thời gian truy vấn cho các mạng đường tĩnh là thuật toán ghi nhãn Hub được đề xuất bởi Abraham et al. http://link.springer.com/ch CHƯƠNG / 10.1007/978-3-642-20662-7_20 . Một cuộc khảo sát bằng văn bản và xuất sắc về lĩnh vực này gần đây đã được xuất bản dưới dạng báo cáo kỹ thuật của Microsoft http://research.microsoft.com/pub/207102/MSR-TR-2014-4.pdf .

Phiên bản ngắn là ...

Thuật toán ghi nhãn Hub cung cấp các truy vấn nhanh nhất cho các mạng đường tĩnh nhưng yêu cầu một lượng lớn ram để chạy (18 GiB).

Định tuyến nút chuyển tiếp chậm hơn một chút, mặc dù vậy, nó chỉ cần khoảng 2 GiB bộ nhớ và có thời gian tiền xử lý nhanh hơn.

Phân cấp hợp đồng cung cấp một sự đánh đổi tốt giữa thời gian tiền xử lý nhanh, yêu cầu không gian thấp (0,4 GiB) và thời gian truy vấn nhanh.

Không một thuật toán nào hoàn toàn thống trị ...

Cuộc nói chuyện về công nghệ Google này của Peter Sanders có thể được quan tâm

https://www.youtube.com/watch?v=-0ErpE8tQbw

Ngoài ra cuộc nói chuyện này của Andrew Goldberg

https://www.youtube.com/watch?v=WPrkc78XLhw

Một triển khai mã nguồn mở của các hệ thống phân cấp co có sẵn từ trang web của nhóm nghiên cứu Peter Sanders tại KIT. http://algo2.iti.kit.edu/english/routeplanning.php

Ngoài ra, một bài đăng blog có thể truy cập dễ dàng được viết bởi Microsoft trên đó sử dụng thuật toán CRP ... http://bloss.bing.com/maps/2012/01/05/bing-maps-new-routing-engine/


7

Tôi hơi ngạc nhiên khi không thấy thuật toán của Floyd Warshall được đề cập ở đây. Thuật toán này hoạt động rất giống với Dijkstra. Nó cũng có một tính năng rất hay đó là cho phép bạn tính toán miễn là bạn muốn tiếp tục cho phép nhiều đỉnh trung gian hơn. Vì vậy, nó sẽ tự nhiên tìm thấy các tuyến đường sử dụng giữa các tiểu bang hoặc đường cao tốc khá nhanh.


6

Thực tế, tôi đã làm điều này khá nhiều lần, thực tế, đã thử một vài phương pháp khác nhau. Tùy thuộc vào kích thước (địa lý) của bản đồ, bạn có thể muốn xem xét sử dụng chức năng haversine như một heuristic.

Giải pháp tốt nhất tôi đã thực hiện là sử dụng A * với khoảng cách đường thẳng là hàm heuristic. Nhưng sau đó, bạn cần một số loại tọa độ cho mỗi điểm (giao điểm hoặc đỉnh) trên bản đồ. Bạn cũng có thể thử các trọng số khác nhau cho hàm heuristic, nghĩa là

f(n) = k*h(n) + g(n)

Trong đó k là một số hằng lớn hơn 0.


4

Có lẽ tương tự như câu trả lời trên các tuyến đường được tính toán trước giữa các vị trí chính và bản đồ phân lớp, nhưng tôi hiểu là trong các trò chơi, để tăng tốc A *, bạn có một bản đồ rất thô để điều hướng vĩ mô và bản đồ chi tiết mịn cho điều hướng đến ranh giới của các hướng vĩ mô. Vì vậy, bạn có 2 đường dẫn nhỏ để tính toán và do đó, không gian tìm kiếm của bạn nhỏ hơn nhiều so với việc chỉ thực hiện một đường dẫn đến đích. Và nếu bạn đang kinh doanh để làm việc này rất nhiều, bạn sẽ có rất nhiều dữ liệu đó được tính toán trước nên ít nhất một phần của tìm kiếm là tìm kiếm dữ liệu được tính toán trước, thay vì tìm kiếm đường dẫn.


3

Đây là suy đoán thuần túy từ phía tôi, nhưng tôi cho rằng họ có thể sử dụng cấu trúc dữ liệu bản đồ ảnh hưởng chồng lên bản đồ được chỉ dẫn để thu hẹp miền tìm kiếm. Điều này sẽ cho phép thuật toán tìm kiếm hướng đường dẫn đến các tuyến đường chính khi chuyến đi mong muốn dài.

Cho rằng đây là một ứng dụng của Google, cũng hợp lý khi cho rằng rất nhiều phép thuật được thực hiện thông qua bộ nhớ đệm mở rộng. :) Tôi sẽ không ngạc nhiên nếu lưu vào bộ nhớ cache 5% yêu cầu tuyến phổ biến nhất trên Google Map được phép cho một khối lớn (20%? 50%?) Yêu cầu được trả lời bằng cách tra cứu đơn giản.


Bạn có tài liệu tham khảo tốt cho "cấu trúc dữ liệu bản đồ ảnh hưởng" không? Cảm ơn!
A. Rex

3

Tôi đã có thêm một số suy nghĩ về điều này:

1) Hãy nhớ rằng bản đồ đại diện cho một tổ chức vật lý. Lưu trữ vĩ độ / kinh độ của mọi ngã tư. Bạn không cần phải kiểm tra nhiều hơn những điểm nằm ở hướng mục tiêu của bạn. Chỉ khi bạn thấy mình bị chặn, bạn cần phải vượt qua điều này. Nếu bạn lưu trữ một lớp phủ các kết nối ưu việt, bạn có thể giới hạn nó nhiều hơn - thông thường bạn sẽ không bao giờ đi qua một trong những kết nối đó đi từ điểm đến cuối cùng của bạn.

2) Chia thế giới thành một nhóm các khu vực được xác định bởi kết nối hạn chế, xác định tất cả các điểm kết nối giữa các khu vực. Tìm khu vực mà nguồn và mục tiêu của bạn đang ở, cho tuyến đường khu vực bắt đầu và kết thúc từ vị trí của bạn đến từng điểm kết nối, cho các khu vực giữa bản đồ đơn giản giữa các điểm kết nối. (Tôi nghi ngờ rất nhiều thứ sau đã được tính toán trước.)

Lưu ý rằng các khu vực có thể nhỏ hơn một khu vực đô thị. Bất kỳ thành phố nào có đặc điểm địa hình phân chia nó (giả sử, một dòng sông) sẽ là nhiều khu vực.


3

Tôi đã rất tò mò về các heuristic được sử dụng, khi một thời gian trước chúng tôi có các tuyến đường từ cùng một vị trí bắt đầu gần Santa Rosa, đến hai khu cắm trại khác nhau trong Công viên Quốc gia Yosemite. Những điểm đến khác nhau sản xuất các tuyến đường hoàn toàn khác nhau (thông qua I-580 hoặc CA-12) mặc dù thực tế rằng cả hai đường hội tụ cho 100 dặm cuối cùng (cùng CA-120) trước khi phân kỳ một lần nữa bằng một vài dặm ở cuối. Điều này khá lặp lại. Hai tuyến đường đã lên đến 50 dặm ngoài với giá khoảng 100 dặm, nhưng khoảng cách / lần là khá chặt chẽ với nhau như bạn mong đợi.

Than ôi tôi không thể tái tạo điều đó - các thuật toán phải thay đổi. Nhưng nó khiến tôi tò mò về thuật toán. Tất cả những gì tôi có thể suy đoán là có một số cách cắt tỉa có hướng rất nhạy cảm với sự khác biệt góc nhỏ giữa các điểm đến từ xa, hoặc có các phân đoạn được tính toán trước khác nhau được lựa chọn bởi điểm đến cuối cùng.


3

Phát biểu của GraphHopper , một công cụ lập kế hoạch lộ trình nguồn mở nhanh dựa trên OpenStreetMap, tôi đã đọc một chút tài liệu và thực hiện một số phương pháp. Giải pháp đơn giản nhất là Dijkstra và một cải tiến đơn giản là Dijkstra hai chiều, chỉ khám phá khoảng một nửa các nút. Với Dijkstra hai vòng, một tuyến đường đi qua toàn bộ nước Đức đã mất 1 giây (đối với chế độ xe hơi), trong C, có lẽ chỉ 0,5 giây hoặc hơn;)

Tôi đã tạo một gif hoạt hình của một tìm kiếm đường dẫn thực với Dijkstra hai chiều ở đây . Ngoài ra, có một số ý tưởng khác để làm cho Dijkstra nhanh hơn như làm A *, đó là một "Dijkstra hướng mục tiêu". Ngoài ra, tôi đã tạo một hình ảnh động cho nó.

Nhưng làm thế nào để làm điều đó (rất nhiều) nhanh hơn?

Vấn đề là đối với một tìm kiếm đường dẫn, tất cả các nút giữa các vị trí phải được khám phá và điều này thực sự tốn kém vì đã có ở Đức có hàng triệu người trong số họ. Nhưng một điểm đau nữa của Dijkstra v.v là các tìm kiếm như vậy sử dụng rất nhiều RAM.

Có các giải pháp heuristic nhưng cũng có các giải pháp chính xác tổ chức biểu đồ (mạng đường bộ) trong các lớp phân cấp, cả hai đều có ưu điểm và chủ yếu giải quyết vấn đề tốc độ và RAM. Tôi đã liệt kê một số trong số họ trong câu trả lời này .

Đối với GraphHopper, tôi quyết định sử dụng Phân cấp co thắt vì nó tương đối 'dễ thực hiện' và không mất nhiều thời gian để chuẩn bị đồ thị. Nó vẫn cho kết quả trong thời gian phản hồi rất nhanh như bạn có thể kiểm tra tại Bản đồ đồ thị trực tuyến của chúng tôi . Ví dụ: từ Nam Phi đến phía đông Trung Quốc dẫn đến quãng đường 23000km và thời gian lái xe gần 14 ngày và chỉ mất ~ 0,1 giây trên máy chủ.


Dijkstra hai chiều sử dụng Cột mốc để thực hiện tìm kiếm theo mục tiêu sẽ hiệu quả hơn so với Dijkstra hai chiều một mình. Xem www14.informatik.tu-muenchen.de/lehre/2010SS/sarntal/. Tuy nhiên, bài viết này không đủ chi tiết để tính toán hàm tiềm năng, một chút khó khăn hoặc chọn các mốc.
Paul Chernoch

2

Tôi đã làm việc về định tuyến trong một vài năm, với một loạt hoạt động gần đây được thúc đẩy bởi nhu cầu của khách hàng của tôi và tôi thấy rằng A * dễ dàng đủ nhanh; thực sự không cần phải tìm kiếm tối ưu hóa hoặc các thuật toán phức tạp hơn. Định tuyến trên một đồ thị khổng lồ không phải là một vấn đề.

Nhưng tốc độ phụ thuộc vào việc có toàn bộ mạng định tuyến, theo đó, ý tôi là đồ thị có hướng của các cung và nút tương ứng với các phân đoạn tuyến và nút giao, trong bộ nhớ. Chi phí thời gian chính là thời gian để tạo mạng này. Một số số liệu sơ bộ dựa trên một máy tính xách tay thông thường chạy Windows và định tuyến trên toàn bộ Tây Ban Nha: thời gian để tạo mạng: 10-15 giây; thời gian thực hiện để tính toán một lộ trình: quá ngắn để đo.

Điều quan trọng khác là có thể sử dụng lại mạng cho nhiều tính toán định tuyến như bạn muốn. Nếu thuật toán của bạn đã đánh dấu các nút theo một cách nào đó để ghi lại tuyến đường tốt nhất (tổng chi phí cho nút hiện tại và cung tốt nhất cho nó) - như trong A * - bạn phải đặt lại hoặc xóa thông tin cũ này. Thay vì đi qua hàng trăm ngàn nút, việc sử dụng hệ thống số thế hệ sẽ dễ dàng hơn. Đánh dấu mỗi nút bằng số thế hệ của dữ liệu của nó; tăng số thế hệ khi bạn tính toán một tuyến đường mới; bất kỳ nút nào có số thế hệ cũ đều cũ và thông tin của nó có thể bị bỏ qua.


1

Tôi thấy những gì với bản đồ trong OP:

Nhìn vào tuyến đường với điểm trung gian được chỉ định: Tuyến đường đi ngược một chút do đường đó không thẳng.

Nếu thuật toán của họ không quay lại, nó sẽ không thấy tuyến đường ngắn hơn.


Ý tưởng thú vị. Tôi đã thêm một vi phạm khác trong PPS của mình vào OP. Xin hãy xem và xem nếu bạn có thể thấy một lời giải thích ở đó.
A. Rex

Thu nhỏ CÁCH xuống điểm A - một lần nhấp từ tối đa. Lưu ý cách tuyến đường ba điểm đi về phía tây, nam, đông. Tôi nghĩ rằng chúng tôi đang xem xét một thuật toán không muốn quay lại trừ khi cần phải đi qua một điểm choke.
Loren Pechtel

Trong ví dụ PPS của tôi, thay đổi địa chỉ bắt đầu thành "10 Avenue de Flandre, 75019 Paris". Điều này loại bỏ các backtrack nhỏ mà bạn đang nói đến nhưng vấn đề vẫn còn đó. Tôi nghĩ vấn đề chính là nó thực sự muốn ở lại con đường chính đó ...
A. Rex

1
Tôi nghĩ rằng tôi đã tìm thấy nó trong trường hợp này: Làm những việc đó bằng xe hơi và thời gian có ý nghĩa. Có lẽ nó nhìn thấy con đường lớn nhanh hơn và con đường đi bộ không tăng tốc.
Loren Pechtel

1
PS: Vấn đề ban đầu cũng có ý nghĩa bởi tiêu chuẩn này, nó có thể không phải là quay lui gây ra nó.
Loren Pechtel

0

Một thuật toán đường dẫn ngắn nhất tất cả các cặp sẽ tính toán các đường dẫn ngắn nhất giữa tất cả các đỉnh trong biểu đồ. Điều này sẽ cho phép các đường dẫn được tính toán trước thay vì yêu cầu một đường dẫn được tính mỗi lần ai đó muốn tìm đường đi ngắn nhất giữa nguồn và đích. Thuật toán Floyd-Warshall là thuật toán đường dẫn ngắn nhất cho tất cả các cặp.


-4

Bản đồ không bao giờ xem xét toàn bộ bản đồ. Tôi đoán là: - 1. Theo vị trí của bạn, họ tải một địa điểm và các mốc trên địa điểm đó. 2. Khi bạn tìm kiếm điểm đến, đó là khi họ tải phần khác của bản đồ và tạo một biểu đồ ra khỏi hai nơi và sau đó áp dụng các thuật toán đường đi ngắn nhất.

Ngoài ra, có một kỹ thuật quan trọng Lập trình động mà tôi nghi ngờ được sử dụng để tính toán các đường dẫn ngắn nhất. Bạn có thể tham khảo điều đó là tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.