Các bạn lập trình viên thân mến,
Chúng tôi đang phát triển phần mềm mô phỏng lưu lượng xe cộ. Một phần của quá trình gọi là "chuyển nhượng" liên quan đến việc chỉ định phương tiện cho các tuyến đường của họ và phải sử dụng một số loại thuật toán tìm đường đi ngắn nhất.
Theo truyền thống, mọi người làm điều này với Dijkstra, và một số tài liệu khoa học nhất định dường như chỉ ra rằng A * và các lựa chọn thay thế khác không mang lại bất kỳ cải thiện đáng kể nào, có lẽ là do bản chất của biểu đồ.
Do đó, chúng tôi cũng đang sử dụng Dijkstra. Một vấn đề nhỏ nảy sinh ở chỗ, nếu bạn coi các liên kết giao thông (đoạn đường giữa các giao lộ) là các cạnh và nút giao là nút, bạn không thể có được biểu đồ đơn hướng cổ điển: khi tiếp cận giao lộ, nơi bạn có thể rẽ thường xuyên bạn đến từ đâu, trong khi trong một biểu đồ truyền thống, bạn có thể lấy bất kỳ cạnh nào từ một nút.
Chúng tôi đã giải quyết vấn đề này khá dễ dàng bằng cách biểu diễn một cặp giao cắt liên kết (gọi nó là "lath") như một nút. Vì bạn cần phải đi qua một liên kết để đến bất kỳ "lath" tiếp theo hoặc điểm lựa chọn nào, nên một cạnh sẽ được xác định là đường ngang này và bạn có được một biểu đồ điển hình.
Các kết quả sau đó được lưu trữ trong một bảng đơn giản, N x N, trong đó N là số lượng "máy tiện".
Đây là nhược điểm (không thể tránh khỏi?). Nếu một mạng điển hình cho mô phỏng của chúng tôi có thể có 2000 giao lộ, thì nó sẽ có khoảng 6000 liên kết, tức là N = 3V. Rõ ràng, nếu được tính theo các giao điểm (V), giờ đây chúng ta đã lên đến O (log (3V) * (3V + E)).
Bạn có thể lập luận rằng 3 (hoặc 9) là một yếu tố không đổi, nhưng từ quan điểm thực tế, nó làm mọi thứ chậm lại một chút và tăng không gian lưu trữ lên 3V x 3V.
Có ai có ý tưởng làm thế nào chúng ta có thể cơ cấu lại điều này để cải thiện hiệu suất? Không nhất thiết là bất kỳ thuật toán thay thế nào, có lẽ định hình lại cấu trúc dữ liệu để phù hợp với biểu đồ theo một cách khác?