Tôi đang giải quyết vấn đề tối ưu hóa tìm kiếm đồ thị. Tôi cần tìm k đường đi ngắn nhất theo chu kỳ tốt nhất thông qua biểu đồ có trọng số theo hướng.
Tôi biết có một số thuật toán k-best chính xác và gần đúng, nhưng hầu hết các nghiên cứu gần đây dường như được định hướng theo các biểu đồ rất lớn, được kết nối rất thưa thớt (ví dụ: định tuyến và chỉ đường), và biểu đồ của tôi cũng không.
Phân biệt các khía cạnh của vấn đề của tôi:
Biểu đồ bao gồm khoảng 160 đỉnh.
Biểu đồ được kết nối gần như hoàn toàn (hai chiều, vì vậy ~ 160 ^ 2 ~ = 25k cạnh)
k sẽ khá nhỏ (có thể dưới 10)
Độ dài đường dẫn tối đa có thể sẽ bị giới hạn và cũng rất nhỏ (ví dụ: 3-5 cạnh)
Tôi đã nói 'acyclic' ở trên, nhưng chỉ để nhắc lại - các giải pháp không được bao gồm các chu kỳ. Đây không phải là vấn đề đối với đường đi ngắn nhất 1 lần, nhưng nó trở thành vấn đề đối với đường dẫn tốt nhất - ví dụ: hãy xem xét tuyến đường - đường đi ngắn thứ 2 từ A đến B có thể giống với đường 1 tốt nhất, với một chuyến đi nhanh chóng xung quanh một khối ở đâu đó. Đó có thể là tối ưu về mặt toán học, nhưng không phải là một giải pháp rất hữu ích. ;-)
Chúng tôi có thể cần phải cân lại các cạnh khi đang di chuyển cho mỗi phép tính. Chi phí cạnh bao gồm tổng trọng số của một số yếu tố và các yêu cầu cuối cùng (bất cứ khi nào chúng tôi nhận được) có thể cho phép người dùng chỉ định mức độ ưu tiên của riêng họ đối với các yếu tố trọng số đó, thay đổi trọng số cạnh. Đây là một biểu đồ tương đối nhỏ (chúng ta sẽ có thể biểu thị nó trong vài trăm KB), vì vậy có thể hợp lý để sao chép biểu đồ trong bộ nhớ, áp dụng trọng số lại và sau đó thực hiện tìm kiếm trên biểu đồ nhân bản. Nhưng nếu có một phương pháp hiệu quả hơn để thực hiện tìm kiếm trong khi tính toán trọng lượng một cách nhanh chóng, tôi quan tâm.
Tôi đang xem xét các thuật toán được mô tả trong Santos (thuật toán đường đi ngắn nhất K), Eppstein 1997 (Tìm đường đi k ngắn nhất) và các thuật toán khác. Thuật toán của Yen được quan tâm, chủ yếu là do triển khai Java hiện có . Tôi không sợ đọc các tài liệu nghiên cứu, nhưng tôi nghĩ rằng nó đáng để bỏ qua các chi tiết về vấn đề của tôi và yêu cầu con trỏ để tiết kiệm thời gian đọc.
Và nếu bạn có con trỏ để triển khai Java, thậm chí tốt hơn.