簡體   English   中英

實現Dijkstra之后,在2個節點之間的圖中的所有路徑

[英]All paths in a graph between 2 nodes after implementing Dijkstra

我正在一個巨大的光網絡項目中工作,該網絡將網絡表示為可能存在循環的無向圖。 在某一點上,我想找到圖中表示任意光學連接的兩個節點之間的所有最小跳躍路徑。 我成功地對所有邊緣實施權重為1的Djikstra,以找到最小的跳躍路徑而不是最小的權重,並修改了松弛步驟以保存節點的所有父代而不是一個(添加了代碼,當距離相等時保存而不是更小)。 因此,現在在下面的示例網絡中,我已經從節點0轉到節點4:節點1具有父級0,節點2具有父級0,節點3具有父級1,2,節點4具有父級3。每個節點組合都是一個對象單元在二維數組中,每個單元格的許多屬性之一是其父級列表(即,在單元格0,3中搜索父級時,從0到3時父級為3)

0 ---- 1
|      |
2 ---- 3 --- 4

現在我被卡住了。 我想以某種方式保存從圖中所有源到所有目的地的所有最小躍點路徑,以便為任何可能的任意連接提供最小躍點路徑。 您能推薦一個解決方案嗎? 我已經為它工作了好幾天,而且我真的被卡住了。 先感謝您。

您的主要問題將是存儲。

假設您有10000個節點。 然后,對於每個節點N(i),您要存儲指向所有可能目的地的下一個最小躍點。 這意味着圖中的每個節點都有9999個節點,也就是說,您需要存儲3 * N ^ 2個節點值。

那時,從節點N(i)到節點N(j)將意味着:

k = i
while k is not j:
    h = 0
    while h < length(N(k).NextHops)
        if N(k).NextHops(h).Destination is j:
           k = N(k).NextHops(h).NextNode
           break
        else:
           h = h+1
    # if h == length of NextHops, "No Route To Host"

您可以使用Dijkstra初始化NextHops(一旦找到最短路徑,則不終止它):從第一個節點開始,探索整個圖,該圖存儲在每個節點中與第一個節點的距離,而前一個節點提供該距離。 最后,元組{Dest:i; 費用: 下一個: ? }將為所有節點初始化。 如果該圖已連接,則每個節點將有N-1個條目,因此可以在數組的位置i處使用2元組{Cost,Next}。

對於連接圖,路由查找算法變為

def findpath(i, j):
    k = i
    p = []
    c = 0
    while k is not j:
        p += i
        c += N[k].NextHops[j].Cost
        k =  N[k].NextHops[j].Next

    return { 'path': p, 'cost': c }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM