Tìm k đường dẫn ngắn nhất với Thuật toán của Eppstein


16

Tôi đang cố gắng để tìm ra cách con đường Graph theo Eppstein của thuật toán trong này giấy công trình và làm thế nào tôi có thể tái tạo lại đường đi ngắn nhất từ đến với tương ứng xây dựng đống .P(G)kstH(G)

Cho đến nay:

out(v) chứa tất cả các cạnh để lại một đỉnh trong một đồ thị không phải là một phần của con đường ngắn nhất trong . Chúng được sắp xếp theo đống bởi "lãng phí thời gian" được gọi là khi sử dụng cạnh này thay vì cạnh trên một con đường ngắn nhất. Bằng cách áp dụng Dijkstra tôi tìm thấy những con đường ngắn nhất đến mọi đỉnh từ .vGGδ(e)t

Tôi có thể tính toán điều này bằng cách lấy chiều dài của cạnh + (giá trị của đỉnh đầu (nơi cạnh được chỉ hướng) - giá trị của đỉnh đuôi (nơi bắt đầu có hướng). Nếu đây là thì không phải là con đường ngắn nhất, nếu là thì nó nằm trên con đường ngắn nhất.>0=0

Bây giờ tôi xây dựng 2-Heap bằng cách ghép các tập hợp các cạnh theo cho bất kỳ , trong đó root chỉ có một con (= cây con).Hout(v)out(v)δ(e)vVoutroot(v)

Để xây dựng tôi chèn vào bắt đầu ở đỉnh thiết bị đầu cuối . Mỗi khi một đỉnh được chạm bằng cách nào đó trong khi chèn nó được đánh dấu .HT(v)outroot(v)HT(nextT(v))t

Bây giờ tôi có thể xây dựng bằng cách chèn phần còn lại của vào . Mỗi đỉnh trong chứa con từ và từ hoặc từ đầu tiên và từ thứ hai và là một đống 3.HG(v)Hout(w)HT(v)HG(v)2HT(v)1Hout(w)02

Với tôi có thể xây dựng một DAG có tên chứa một đỉnh cho mỗi đỉnh đánh dấu từ và cho mỗi đỉnh không gốc từ .HG(v)D(G)HT(v)Hout(v)

Các gốc của trong được gọi là và chúng được kết nối với các đỉnh mà chúng thuộc theo theo "ánh xạ".HG(v)D(G)h(v)out(v)

Càng xa càng tốt.

Bài báo nói rằng tôi có thể xây dựng bằng cách chèn một gốc và kết nối nó với bằng một cạnh bẩm sinh với . Các đỉnh của giống nhau trong nhưng chúng không có trọng số. Các cạnh có chiều dài. Sau đó, với mỗi cạnh được định hướng các cạnh tương ứng trong được tạo và có trọng số bởi . Chúng được gọi là Heap Edges. Sau đó, với mỗi đỉnh , đại diện cho một cạnh không nằm trong một con đường ngắn nhất nối một cặp đỉnh và , "các cạnh chéo" được tạo từP(G)r=r(s)h(s)δ(h(s))D(G)P(G)(u,v)D(G)P(G)δ(v)δ(u)vP(G)uwv đến trong có độ dài . Mỗi đỉnh trong chỉ có mức độ tối đa là tối đa.h(w)P(G)δ(h(w))P(G)4

P(G) đường dẫn 's bắt đầu từ có nghĩa vụ phải là một one-to-one chiều dài tương ứng giữa - -paths trong .rstG

Cuối cùng, một đống mới được đặt hàng 4-Heap được xây dựng. Mỗi đỉnh tương ứng với một đường dẫn trong bắt nguồn từ . Cha mẹ của bất kỳ đỉnh có một cạnh ít hơn. Trọng lượng của một đỉnh là chiều dài của đường tương ứng.H(G)P(G)r

Để tìm đường dẫn ngắn nhất, tôi sử dụng BFS đến và "dịch" kết quả tìm kiếm thành các đường dẫn bằng cách sử dụng .kP(G)H(G)

Thật không may, tôi không hiểu làm thế nào tôi có thể "đọc" và sau đó "dịch" nó qua để nhận đường dẫn ngắn nhất.P(G)H(G)k


6
Bạn đã kiểm tra các triển khai khác nhau tại ics.uci.edu/~eppstein/pub/p-kpath.html ?
Radu GRIGore

Câu trả lời:


25

Đã đủ lâu kể từ khi tôi viết điều đó, đến bây giờ cách giải thích của tôi về những gì trong đó có lẽ không có nhiều thông tin hơn bất kỳ độc giả nào khác. Tuy nhiên:

Tôi tin rằng mô tả mà bạn đang tìm kiếm là đoạn cuối cùng của bằng chứng Bổ đề 5. Về cơ bản, một số cạnh trong P (G) ("cạnh chéo") tương ứng với các cạnh trong G (nghĩa là các cạnh đó phân kỳ từ cây đường đi ngắn nhất). Đường dẫn trong G được hình thành bằng cách đi theo cây đường đi ngắn nhất tới đỉnh bắt đầu của sidetrack đầu tiên, theo chính cạnh sidetrack, theo cây đường đi ngắn nhất một lần nữa đến đỉnh bắt đầu của sidetrack tiếp theo, v.v.


1
Là một lưu ý phụ, thuật toán này dường như đã được vượt trội gần đây. Các chi tiết có thể được tìm thấy ở đây
Carlos Linares López

David, tôi thực sự cần một triển khai thuật toán của bạn, tốt nhất trong Java. Bạn có thể chỉ cho tôi nơi tôi có thể tìm thấy một?
Tina J

1
Các triển khai mà tôi biết được liên kết từ dưới cùng của ics.uci.edu/~eppstein/pub/p-kpath.html - nhưng tôi đã không kiểm tra các trang bên ngoài gần đây để có thể có một số liên kết chết.
David Eppstein

Cảm ơn. Nhưng quan trọng hơn, bạn có mã giả hoàn chỉnh của thuật toán của mình ở đâu đó không?
Tina J

@DavidEppstein Một cái gì đó tương tự như của Dijkstra tại Wikipedia: en.wikipedia.org/wiki/K_shortest_path_routing
Tina J

4

Mã giả cho thuật toán của Eppstein (và phiên bản lười biếng của tác giả) được đưa ra trong: VM Jiménez, A. Marzal, Một phiên bản lười biếng của thuật toán đường đi ngắn nhất của Eppstein, trong: Hội thảo quốc tế lần thứ 2 về Thuật toán thử nghiệm và hiệu quả (WEA '03), trong: Ghi chú bài giảng Khoa học máy tính, tập. 2647, Springer, 2003, trang 179 Ảo190. https://pdfs.semanticscholar.org/3a31/5a14a2fc773d2d800186121905016de31705.pdf

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.