Chỉ muốn chia sẻ cách tiếp cận cuối cùng của tôi về vấn đề này. Đây là một phần của một dự án đại học, vì vậy nó có thể không hoàn toàn phù hợp để sử dụng trong thế giới thực. Nó phải chạy khá nhanh trên thiết bị Windows Mobile.
Tôi đã sử dụng 4 bảng (SQLite). Một bảng giữ danh sách các xe buýt, cái thứ hai giữ một danh sách các trạm. Một bảng khác giữ kết hợp - những gì xe buýt dừng lại tại một trạm cụ thể và nơi nào nó đi từ trạm này và mất bao lâu (phút). Tất cả các kết hợp phải được lưu trữ. Và bảng cuối cùng là một bảng thời gian đơn giản.Đối với mỗi trạm, nó liệt kê mọi xe buýt dừng ở đó và thời gian (tôi đã lưu trữ thời gian dưới dạng giá trị số nguyên - 14:34 là 1434, để làm cho nó nhanh hơn để so sánh).
Tôi đã sử dụng thuật toán tìm kiếm theo chiều rộng hai chiều. Các trạm lân cận (có thể truy cập trực tiếp) được truy xuất cho trạm bắt đầu và trạm đích. Có một con đường từ nhà ga A đến ga X nếu hai "đồ thị" trùng nhau trên một trạm. Ví dụ, từ nhà ga A, bạn có thể đến các trạm B, C, D, E (bằng cách sử dụng các xe buýt cụ thể). Và từ trạm đích X bạn có thể trực tiếp đến N, C, Z. Hai đồ thị này trùng nhau trên trạm C. Vì vậy, đường dẫn A -> C -> X tồn tại. Nếu không có đường dẫn nào được tìm thấy trong lần lặp đầu tiên này, thì thuật toán tiếp tục và lan truyền lại các đồ thị (BFS).
Thời gian không được tính đến trong bước đầu tiên - điều này làm cho nó đủ nhanh. Bạn chỉ nhận được một danh sách các đường dẫn có thể có với một danh sách các xe buýt mà bạn phải sử dụng để thực hiện các đường dẫn này. Thời gian được đánh giá ở bước cuối cùng, bạn đi qua danh sách các đường dẫn có thể và kiểm tra xem xe buýt có đi trong thời gian cụ thể không (tăng thời gian dừng).
Trên một thành phố nhỏ, với 250 trạm và hơn 100 xe buýt/đường sắt, phương pháp này hoạt động tối đa 3 thay đổi (nơi bạn phải thay đổi xe buýt trên hành trình). Chỉ mất vài giây để tính toán. Nhưng tôi phải tải toàn bộ cơ sở dữ liệu vào bộ nhớ (từ điển) để tăng tốc độ truy vấn, quá lâu.
Tôi không nghĩ rằng điều này sẽ làm việc cho một mạng lớn mặc dù. Nhưng nó hoạt động cho một phương tiện giao thông công cộng của một thành phố cỡ vừa và nhỏ.
Nguồn
2011-06-01 13:15:39
[OSRM] (http://project-osrm.org/) là một công cụ định tuyến nguồn mở cho các đường đi ngắn nhất có trụ sở tại C++. Bạn có thể thấy nó hữu ích. –