Lấy mẫu hiệu quả đường dẫn - ngắn nhất và ngẫu nhiên một cách ngẫu nhiên


14

Hãy để là một đồ thị, và để cho và là hai đỉnh của . Chúng ta có thể có hiệu quả lấy mẫu một ngắn nhất - con đường thống nhất và độc lập một cách ngẫu nhiên từ tập tất cả các con đường ngắn nhất giữa và ? Để đơn giản, chúng ta có thể giả sử là đơn giản, không bị ảnh hưởng và không có trọng số.GstGststG

Thậm chí trong nhiều đồ thị hạn chế, số lượng đường đi ngắn nhất giữa và có thể theo cấp số nhân trong kích thước của . Do đó, chúng ta sẽ tự nhiên như tránh thực sự tính toán tất cả các ngắn nhất - đường dẫn. Tôi không biết về trường hợp chung, nhưng dường như chúng ta có thể đạt được điều này cho một số lớp biểu đồ đặc biệt.stGst

Cảm giác này giống như một cái gì đó mà ai đó phải xem xét trước đây. Có bất kỳ nghiên cứu hiện có về điều này, hoặc trên thực tế là đơn giản để thực hiện ngay cả đối với các biểu đồ chung?


Câu hỏi hay Juho. Trong khi xem xét một câu trả lời, bạn hiểu chính xác điều gì bằng cách "lấy mẫu một con đường thứ nhất một cách ngẫu nhiên"? Nếu nó đủ để s và t được chọn ngẫu nhiên, câu hỏi là không quan trọng vì vậy tôi đoán rằng bạn có nghĩa là tất cả các nút trong đường dẫn ngắn nhất xuất hiện với tần suất (ví dụ: xác suất) theo phân phối đồng đều. Hoặc có bất kỳ định nghĩa khác? Đặc biệt, đối với các biểu đồ lưỡng cực, câu hỏi của bạn có vẻ rất dễ dàng phải không?
Carlos Linares López

1
@ CarlosLinaresLópez Hãy xem xét biểu đồ kim cương và nói nằm ở bên phải của "cạnh dọc" và nằm ở bên trái. Bây giờ có 2 con đường ngắn nhất giữa và . Thuật toán sẽ trả về với xác suất bằng nhau hoặc là một trong hai đường dẫn này. Vì vậy, và không được "chọn ngẫu nhiên", nhưng chúng được đưa ra làm đầu vào. Điều đó làm cho nó rõ ràng? Theo nghĩa này, tôi không chắc vấn đề có thực sự dễ dàng đối với các biểu đồ lưỡng cực hay không. ststst
Juho

1
@ CarlosLinaresLópez Nói cách khác, chúng ta được đưa ra một đồ thị và hai đỉnh . Đặt là tập hợp tất cả các đường đi ngắn nhất giữa và . Sản lượng một phần tử của thống nhất một cách ngẫu nhiên. Gs,tV(G)SstS
Juho

Câu trả lời:


6

Tôi không chắc chắn 100% câu trả lời này là đúng, nhưng đây là:

Tôi nghĩ rằng bạn có thể giảm điều này thành ngẫu nhiên bất kỳ con đường nào, từ , trong một DAG với một nguồn duy nhất và một bồn rửa đơn.st

Cho đồ thị G

  1. Thực hiện một digraph trống mới, .H
  2. Thứ nhất: chạy phần BFS of-con đường ngắn nhất Dijkstra, bắt đầu từ , đánh dấu tất cả các nút với khoảng cách ngắn nhất-từ- họ s .ss
  3. Đặt là khoảng cách tối thiểu từ s - v ; mà chúng ta biết từ bước BFS của thuật toán đường đi ngắn nhất của Dijkstra.d(s,v)sv
  4. Sau đó thực hiện bước tiếp theo của thuật toán đường đi ngắn nhất của Dijkstra, lấy đường dẫn ngắn nhất, lưu trữ nó trong (bằng cách đi ngược từ t đến s ).pts
  5. Bây giờ bắt đầu vòng lặp sau; mở rộng trong các ý kiến, và dưới đây:
    • q0={t}
    • Trong khi q0
      • q1=
      • Với uq0
        • Vì vậy, chúng tôi muốn tìm tất cả các nút tiếp theo có thể cho đường dẫn ngắn nhất này từ tu
        • Đối với tất cả sao cho d ( s , v ) < d ( s , u )edge(u,v)Gd(s,v)<d(s,u)
          • là một nút láng giềng, với ít d ( s , ) (nó sẽ được 1 ít)vd(s,)1
          • Do đó, là subpath có thể trong một con đường ngắn nhất.tuv
          • Đặt vH,di-edge(u,v)H
          • Bây giờ chúng ta cần kiểm tra lượt hàng xóm ít hơn của .v
          • Đặt vq1
      • Đặt thành q 1 : q0q1
        • q0q1

Về cơ bản, tôi đang thu thập tất cả các nút có thể có thể được sử dụng trong-con đường ngắn nhất, và đặt chúng trong .H

Thêm về cách thức này hoạt động:

Thuật toán đường đi ngắn nhất của Dijkstra hoạt động bằng cách chạy BFS đầu tiên và đánh dấu tất cả các nút bằng các đường dẫn ngắn nhất của chúng từ s - v . Bước tiếp theo là quay trở lại từ t - s và theo dõi các nút lân cận ít nhất trở lại.vGsvts

Vấn đề là, ở đây bạn có thể chọn bất kỳ nút nào lân cận ít nhất. Những gì tôi làm ở đây là thu thập tất cả các nút lân cận ít nhất mỗi bước, có nghĩa là tôi chiếm tất cả các đường dẫn ngắn nhất.

Bây giờ bạn nhanh chóng nghĩ, nhưng này, tại sao lại liệt kê chúng theo cấp số nhân, nhưng cách của tôi thì không?

Câu trả lời là, vì tôi sử dụng một bộ để tránh thêm các nút giống nhau hai lần, tôi tránh tính toán lại cho mỗi đường dẫn có thể.

Bây giờ chúng ta có một DAG mà chúng ta có thể đi qua theo bất kỳ cách nào từ và có được đường đi ngược lại ngắn nhất từ s - t . Biểu đồ nên có t là nguồn duy nhất và s là phần chìm duy nhất.tsstts


Nếu những điều trên là chính xác, thì tôi nghĩ chúng ta có thể tiến thêm một bước này và giải quyết vấn đề như sau.

Cung cấp cho mỗi nút trong DAG một trọng số nút; trọng số nút sẽ là số lượng đường dẫn từ nút đó đến . Hãy để chúng tôi gọi đây là w ( v ) .sw(v)

Bạn có thể tính toán những nhanh chóng, xem thuật toán mà thấy số lượng đường đơn giản từ s đến t trong G .

Khi chúng ta có trọng số nút, chúng ta có thể chọn một đường dẫn bằng cách:

  • Bố trí DAG dưới dạng cấu trúc mức (để trực quan hóa)
  • Ở mỗi cấp, chọn một thứ tự tùy ý giữa các nút tức là. một khái niệm "trái sang phải".
  • Di chuyển xuống DAG: ở mỗi bước , i [ 1 , | p | ] (trong đó || có nghĩa là kích thước của, trong trường hợp này, độ dài của đường dẫn ngắn nhất): ii[1,|p|]||
    • Đặt là nút hiện tại (bắt đầu từ t )uit
    • Cộng tất cả trọng lượng của con cái , và sử dụng một RNG, chọn một nút con, v i , thống nhất giữa những đứa trẻ gia quyền.uivi
    • Đặt và chuyển sang bước tiếp theoui+1=vi

Cấu trúc cấp độ và khái niệm từ trái sang phải là một phần trong nỗ lực ban đầu của tôi chỉ đơn giản là tạo và chọn một con đường theo cách đó, nhưng tôi đã không tìm ra điều đó, vì vậy bạn có thể yên tâm bỏ qua chúng. r[0,w(t))
Realz slaw

1
Câu trả lời này có vẻ tuyệt vời! Tôi thích những ý tưởng! Tôi đã cố gắng viết nó ra theo một cách hơi khác (trong câu trả lời của tôi), như một bài kiểm tra về sự hiểu biết của tôi. Trong mọi trường hợp, tôi chỉ muốn chia sẻ sự đánh giá cao của tôi cho câu trả lời đáng yêu này!
DW

5

Đây là một giải pháp dựa trên những ý tưởng trong câu trả lời của Realz Slaw. Về cơ bản, nó là một giải trình lại các ý tưởng của anh ta có thể rõ ràng hơn hoặc dễ theo dõi hơn. Kế hoạch là chúng tôi sẽ tiến hành theo hai bước:

  1. Đầu tiên, chúng tôi sẽ xây dựng một đồ thị với các tài sản sau đây: bất kỳ đường đi từ s đến t trong S là một con đường ngắn nhất từ s đến t trong G , và mỗi con đường đi ngắn nhất từ s đến t trong G cũng có mặt trong S . Do đó, S chứa chính xác các đường dẫn ngắn nhất trong G : tất cả các đường dẫn ngắn nhất và không có gì nữa. Khi nó xảy ra, S sẽ là một DAG.SstSstGstGSSGS

  2. Tiếp theo, chúng tôi sẽ lấy mẫu thống nhất một cách ngẫu nhiên từ tất cả các đường dẫn từ đến t trong S .stS

Cách tiếp cận này khái quát hóa cho một đồ thị hướng tùy ý , miễn là tất cả các cạnh có trọng số dương, vì vậy tôi sẽ giải thích thuật toán của mình theo các thuật ngữ đó. Gọi w ( u , v ) biểu thị trọng lượng trên cạnh u v . (Điều này khái quát hóa tuyên bố vấn đề bạn đã đưa ra. Nếu bạn có một đồ thị không có trọng số, chỉ cần giả sử mọi cạnh đều có trọng số 1. Nếu bạn có một đồ thị vô hướng, hãy coi mỗi cạnh không có hướng ( u , v ) là hai cạnh có hướng u vv u .)Gw(u,v)uv(u,v)uvvu


Bước 1: chiết xuất . S Chạy thuật toán đường dẫn ngắn nhất một nguồn (ví dụ: thuật toán của Dijkstra) trên , bắt đầu từ nguồn s . Với mỗi đỉnh v trong G , hãy để d ( s , v ) biểu thị khoảng cách từ s đến v .GsvGd(s,v)sv

Bây giờ hãy xác định đồ thị như sau. Nó bao gồm mọi cạnh u v sao cho (1) u v là một cạnh trong G và (2) d ( s , v ) = d ( s , u ) + w ( u , v ) .SuvuvGd(s,v)=d(s,u)+w(u,v)

Biểu đồ có một số thuộc tính thuận tiện:S

  • Mỗi con đường đi ngắn nhất từ đến t trong G tồn tại như một đường dẫn trong S : một con đường ngắn nhất s = v 0 , v 1 , v 2 , ... , v k = t trong G có tài sản đó d ( s , v i + 1 ) = d ( s , v i ) + w ( v i , v istGSs=v0,v1,v2,,vk=tG, do đó cạnh v i v i + 1 có mặt trongS.d(s,vi+1)=d(s,vi)+w(vi,vi+1)vivi+1S

  • Mỗi con đường trong từ s đến t là một con đường ngắn nhất trong G . Đặc biệt, hãy xem xét bất kỳ đường dẫn trong S từ s đến t , nói s = v 0 , v 1 , v 2 , ... , v k = t . Độ dài của nó được tính bằng tổng trọng số của các cạnh của nó, cụ thể là k i = 1 w ( v i - 1 , v i )SstGSsts=v0,v1,v2,,vk=ti=1kw(vi1,vi), nhưng theo định nghĩa của , tổng này là k i = 1 ( d ( s , v i ) - d ( s , v i - 1 ) , mà kính thiên văn cho d ( s , t ) - d ( s , s ) = d ( s , t ) . Do đó, đường dẫn này là đường dẫn ngắn nhất từ s đến t trong GSi=1k(d(s,vi)d(s,vi1)d(s,t)d(s,s)=d(s,t)stG.

  • Cuối cùng, sự vắng mặt của các cạnh có trọng số bằng 0 trong ngụ ý rằng S là một dag.GS

Bước 2: lấy mẫu một đường dẫn ngẫu nhiên. Bây giờ chúng ta có thể vứt bỏ trọng lượng trên các cạnh trong , và lấy mẫu một con đường ngẫu nhiên từ s đến t trong S .SstS

To help with this, we will do a precomputation to compute n(v) for each vertex v in S, where n(v) counts the number of distinct paths from v to t. This precomputation can be done in linear time by scanning the vertices of S in topologically sorted order, using the following recurrence relation:

n(v)=wsucc(v)n(w)

where succ(v) denotes the successors of v, i.e., succ(v)={w:vw is an edge in S}, and where we have the base case n(t)=1.

Next, we use the n() annotation to sample a random path. We first visit node s. Then, we randomly choose one of the successors of s, with successor w weighted by n(w). In other words:

choosesuccessor(v):
    n = 0
    for each w in succ(w):
        n = n + n(w)
    r = a random integer between 0 and n-1
    n = 0
    for each w in succ(w):
        n = n + n(w)
        if r < n:
            return w

v0=svi+1= choosesuccessor(vi). The resulting path is the desired path, and it will be sampled uniformly at random from all shortest paths from s to t.

Hopefully this helps you understand Realz Slaw's solution more easily. All credit to Realz Slaw for the beautiful and clean solution to this problem!


The one case this doesn't handle is the case where some edges have weight 0 or negative weight. However, the problem is potentially not well-defined in that case, as you can have infinitely many shortest paths.


Glad you took the time to fully get my answer; I wasn't sure it is correct. Now I am vindicated :D.
Realz Slaw
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.