Tôi có cơ sở dữ liệu về trạm dừng xe buýt/tàu hỏa/... và thời gian đến/khởi hành vào mỗi ngày, v.v. Tôi đang tìm một cách để thực hiện tìm kiếm chuyến đi nhanh nhất (ngắn nhất/rẻ nhất/ít chuyển tiếp nhất) giữa hai địa điểm. Tôi muốn có các vị trí tùy ý trong tương lai, sử dụng dữ liệu OpenStreetMap để đi bộ giữa các điểm dừng và từ điểm dừng đến điểm bắt đầu/kết thúc, tuy nhiên hiện tại tôi chỉ muốn tìm đường đi giữa hai điểm dừng trong cơ sở dữ liệu.Thuật toán định tuyến (định tuyến, lập kế hoạch chuyến đi, ...) trên đồ thị có giới hạn thời gian
Vấn đề là tôi không thể tìm thấy nhiều thông tin về chủ đề này, ví dụ this Wikipedia page có rất nhiều văn bản hoàn toàn không có thông tin hữu ích trong đó.
Tôi đã tìm thấy định dạng GTFS, được sử dụng trong Google Transit. Mặc dù thành phố của tôi không cung cấp nguồn cấp dữ liệu công khai (thậm chí không phải là dữ liệu riêng tư), tôi đã có tất cả thông tin quan trọng mà GTFS chứa và thực hiện chuyển đổi sẽ là tầm thường.
Có một số phần mềm dựa trên GTFS, như là OpenTripPlanner cũng có thể thực hiện định tuyến cho người đi bộ/xe hơi/xe đạp sử dụng OpenStreetMap.
Tuy nhiên, mã định tuyến không được tài liệu kỹ lưỡng (ít nhất là từ tôi đã tìm thấy) và tôi không cần toàn bộ.
Tất cả những gì tôi đang tìm là một số tổng quan tốt về các thuật toán tôi có thể sử dụng, hiệu suất của chúng, có thể một số mã giả.
Vì vậy, câu hỏi là, được cung cấp danh sách các điểm dừng, tuyến đường và thời gian đến/đi/đi, làm cách nào tôi có thể dễ dàng tìm đường nhanh nhất từ điểm dừng A đến điểm dừng B?
Đúng, bạn sẽ không nhanh hơn thuật toán Dijkstra mfor này trừ khi có những ràng buộc mà bạn đang giữ lại cho phép tối ưu hóa thêm. Đối với các số liệu khác với thời gian, bạn sẽ cần phải xây dựng một 'trọng lượng' là sự kết hợp giữa thời gian, chi phí và rắc rối. Bạn cũng có thể phải để nó cho người dùng để xác định chính xác những gì trọng lượng và tính toán lại khi đang bay, hoặc có một vài tình huống định trước (100% thời gian, 100% rẻ, 50/50/0, 40/40/20, và tương tự) và giữ phiên bản được lưu trong bộ nhớ cache của bảng tra cứu Dijkstra. – corsiKa
Trừ khi tôi bỏ sót điều gì đó, điều này sẽ không hoạt động. Dijkstra là tuyệt vời cho một đồ thị "tĩnh" chỉ với tên miền không gian, nhưng điều này có tên miền thời gian. Ví dụ, nếu bạn đến một nút bằng xe buýt mất 1 phút, các cạnh trên đó sẽ khác với nếu bạn mất 5 phút. Bạn có thể bỏ lỡ một chiếc xe buýt để trọng lượng trở nên lớn hơn bởi vì bạn phải chờ đợi. Ngoài ra, một số cạnh có thể biến mất nếu bạn đã đến một nút theo một cách nhất định (bỏ lỡ xe buýt cuối cùng trong ngày) nhưng ở đó nếu bạn đến đó theo một cách khác. AFAIK, Dijkstra không cho phép điều này, nhưng hãy sửa tôi nếu tôi sai. – lacop
@albwq: Thuật toán của Dijkstra không xử lý việc 'chờ' trong các đỉnh cho xe buýt tiếp theo, bạn chính xác về điều đó. Tuy nhiên, nó hợp lệ cho hai tiêu chí khác mà bạn yêu cầu: chi phí và số lần chuyển đổi. [xem phần cuối cùng của tôi về thậm chí tối ưu hóa số lượng chuyển tiếp]. – amit