Lấy đường dẫn ngắn nhất của đồ thị động


24

Hiện tôi đang nghiên cứu những con đường ngắn nhất trong đồ thị có hướng. Có nhiều thuật toán hiệu quả để tìm ra con đường ngắn nhất trong mạng, như dijkstra hoặc bellman-ford's. Nhưng nếu đồ thị là động? Bằng cách nói động tôi có nghĩa là chúng ta có thể chèn hoặc loại bỏ các đỉnh trong quá trình thực hiện chương trình. Tôi đang cố gắng tìm một thuật toán hiệu quả để cập nhật các đường dẫn ngắn nhất từ ​​một đỉnh sang mọi đỉnh , sau khi chèn một cạnh , mà không cần phải chạy lại thuật toán đường đi ngắn nhất trong biểu đồ mới. Tôi có thể làm cái này như thế nào? Cảm ơn trước.vđue

  • Lưu ý: những thay đổi có thể được thực hiện sau lần lặp đầu tiên của thuật toán
  • Lưu ý [2]: hai nút được đưa ra, là nguồn và đích. Tôi cần tìm con đường ngắn nhất giữa các nút này. Khi biểu đồ được cập nhật, tôi chỉ phải cập nhật , đây là con đường ngắn nhất giữa và .t π ( s , t ) s tstπ(s,t)st
  • Lưu ý [3]: Tôi chỉ quan tâm đến trường hợp chèn cạnh.

Một định nghĩa chính thức : Cho đồ thị . Xác định một hoạt động cập nhật như 1) một chèn của một cạnh để hoặc 2) aa xoá một cạnh từ . Mục tiêu là tìm kiếm hiệu quả chi phí của tất cả các cặp đường dẫn ngắn nhất sau một hoạt động cập nhật. Theo hiệu quả, chúng tôi có nghĩa là ít nhất là tốt hơn so với việc thực hiện thuật toán All-Pair-Shortest-Path, chẳng hạn như thuật toán Bellman-Ford, sau mỗi hoạt động cập nhật.G=(V,E)E e EeEeE


Chỉnh sửa: Dưới đây có một phiên bản đơn giản hóa của vấn đề:

Một đồ thị có trọng số được đưa ra, bao gồm các cạnh đơn hướng và hai đỉnh quan trọng và . Một tập hợp các cạnh hai chiều của ứng viên cũng được đưa ra. Tôi phải xây dựng một cạnh để giảm thiểu khoảng cách từ đến .s t CG(V,E)stCs t(u,v)Cst


Câu hỏi làm rõ hơn: Các điểm cuối của đường dẫn của bạn luôn cố định không? Bạn chỉ quan tâm đến trường hợp chèn cạnh, hoặc trong các thay đổi tùy ý trong biểu đồ? Tôi sẽ nghĩ rằng có nghiên cứu trả lời câu hỏi của bạn, nhưng thật không may, tôi không thực sự biết nơi để tìm. Một tìm kiếm nhanh của Google cho thấy các slide này có vẻ rất hữu ích và bài báo này: "các đường dẫn ngắn nhất trên biểu đồ động" (hy vọng liên kết hoạt động). (u,v)
usul

Câu trả lời:


14

Vấn đề như bạn có thể nhận thấy là một vấn đề khá khó khăn. Kiểm tra web sẽ dẫn đến một số trường hợp phức tạp mà có lẽ bạn sẽ không cần. Đây là một giải pháp - theo yêu cầu (nghĩa là bạn không cần tính toán lại mọi thứ từ đầu).

đối với trường hợp thêm cạnh - sau đó sử dụng ma trận khoảng cách đã xây dựng của bạn - hãy làm như sau:(u,v)

Với mỗi cặp nút và kiểm tra xem - điều này có thể được thực hiện trong vì bạn đang so sánh mọi cặp nút.y d ( ( x , u ) ) + c ( ( u , v ) ) + d ( ( v , y ) ) < d ( ( x , y ) ) O ( n 2 )xyd((x,u))+c((u,v))+d((v,y))<d((x,y))O(n2)

Đối với trường hợp xóa cạnh: Với ma trận khoảng cách đã được xây dựng, thì bạn có thể có cho mỗi nút một cây đường dẫn ngắn nhất bắt nguồn từ . Nếu cạnh bị xóa không nằm trong cây đó, thì các đường dẫn ngắn nhất từ đến nhau không bị ảnh hưởng - (chúng vẫn giữ nguyên).u đ uuueu

Nếu nằm trong cây đường dẫn ngắn nhất của , thì với mỗi nút sao cho đường dẫn ngắn nhất bao gồm , các đường dẫn sẽ thay đổi. Do đó, tính đường đi ngắn nhất từ đến . Bây giờ, lặp lại trước đó cho mỗi nút - đây không phải là giải pháp tốt nhất. Trong thực tế, trong trường hợp xấu nhất của nó, nó tương đương với việc làm mọi thứ từ đầu, nhưng trung bình có thể tốt hơn. u v π ( u , v ) e u veuvπ(u,v)euv

Nếu bạn muốn có kết quả tốt hơn thế này, thì hãy xem:

  1. Demetrescu, Camil và Giuseppe F. Italiano. "Một cách tiếp cận mới để năng động tất cả các cặp đường dẫn ngắn nhất." Tạp chí của ACM (JACM) 51.6 (2004): 968-992. (có thể tìm thấy miễn phí từ Google)

  2. hoặc có một cái nhìn vào cuộc khảo sát bằng văn bản độc đáo này


17

Vấn đề bạn đang yêu cầu là một vấn đề thuật toán nổi tiếng. Nó thực sự vẫn còn mở, vấn đề này chính xác là khó như thế nào. Ngoài ra, bạn nên biết rằng có những hiện thân khác nhau của vấn đề này. Ngược lại những gì bạn đang yêu cầu, thường chỉ có khoảng cách được trả về, trong khi bạn đang yêu cầu những con đường ngắn nhất thực tế. Lưu ý rằng những đường dẫn này có thể đã rất dài. Các thuật toán đồ thị động chỉ phân biệt giữa xóa cạnh (thuật toán dg giảm dần), chỉ chèn cạnh (thuật toán dg gia tăng) và chèn và xóa cạnh (thuật toán dg hoàn toàn động). Do đó bạn quan tâm đến các thuật toán gia tăng .

O(n2(logn+log2(1+m/n))O(1)O(nlogn)các cạnh, sau đó bạn chỉ có thể tính toán lại từ đầu với Dijkstra và Fibonacci-heaps và có cùng thời gian chạy như trong thuật toán của Thorup. Vì vậy, nếu đồ thị của bạn không dày đặc, tôi khuyên bạn nên sử dụng Dijkstra.

Tôi không nhận thức được bất kỳ thuật toán gia tăng tốt hơn . Nhưng bạn nên thực hiện tìm kiếm trên web nếu có kết quả mới hơn cho vấn đề chuyên biệt này.


(s,t)

@RondogiannisAristophanes trong thực tế những gì đã được đề xuất cho đến nay là bằng cách nào đó là tốt nhất. Hãy xem bài báo này tuyên bố rằng: "các vấn đề về đường đi ngắn nhất của nguồn đơn tăng dần và giảm dần, đối với các đồ thị có hướng hoặc không có trọng số, theo nghĩa mạnh, ít nhất là khó như các đường ngắn nhất của tất cả các cặp tĩnh vấn đề." (thành thật mà nói, tôi chỉ đọc phần giới thiệu) - tham khảo: "Về các vấn đề đường đi ngắn nhất năng động", Roditty & Zwick - nhưng bạn vui lòng cho chúng tôi biết vấn đề chính xác bạn gặp phải là gì? kịch bản cụ thể nào? bạn đã tặng gì cho đến nay? - có lẽ chúng tôi có thể giúp bạn tốt hơn.
AJed

@RondogiannisAristophanes hiệu suất càng tốt, càng khó thực hiện (trong hầu hết các trường hợp) và đôi khi trong các ứng dụng thực tế, bạn không cần cải thiện nhiều về hiệu suất.
AJed

@AJed Tôi đã chỉnh sửa bài đăng của mình để bao gồm một mô tả đơn giản về vấn đề.
Rontogianni Aristofanis

5

Tôi tin rằng thuật toán AD * có thể giúp bạn.

http://www.cs.cmu.edu/~ggordon/likhachev-etal.anytime-dstar.pdf

Khi nhận được thông tin cập nhật về biểu đồ cơ bản, thuật toán sẽ sửa chữa dần dần giải pháp trước đó. Kết quả là một cách tiếp cận kết hợp lợi ích của các nhà hoạch định bất cứ lúc nào và tăng dần để cung cấp các giải pháp hiệu quả cho các vấn đề tìm kiếm phức tạp, năng động

Điểm nổi bật của AD *: Đó là "bất cứ lúc nào", có nghĩa là nó có thể cung cấp cho bạn "giải pháp tối ưu phụ" rất nhanh, mặc dù nó có thể không phải là tốt nhất. Cho đủ thời gian mặc dù, nó sẽ trả về giải pháp tối ưu. Ngoài ra, bạn có thể hạn chế giải pháp tối ưu phụ không tệ hơn giải pháp tối ưu theo một số hằng số do người dùng xác định. Điều này cung cấp cho bạn khả năng sử dụng điều này trong kịch bản lập kế hoạch thời gian thực, nơi có một giải pháp ổn (trong đó "ổn" về mặt lý thuyết) tốt hơn là không có giải pháp nào cả.

http://www.cs.cmu.edu/~maxim/software.html

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.