簡體   English   中英

創建一個networkx加權圖並找到權重最小的2個節點之間的路徑

[英]Create a networkx weighted graph and find the path between 2 nodes with the smallest weight

我有一個涉及圖論的問題。 為了解決這個問題,我想使用networkx創建一個加權圖。 目前,我有一個字典,其中每個鍵是一個節點,每個值是關聯的權重(介於10到200 000之間)。

weights = {node: weight}

我相信我不需要通過網絡標准化權重。 此刻,我通過添加邊來創建非加權圖:

def create_graph(data):
    edges = create_edges(data)

    # Create the graph
    G = nx.Graph()

    # Add edges
    G.add_edges_from(edges)

    return G

通過閱讀,我可以為邊緣添加權重。 但是,我希望將權重應用於特定節點而不是邊緣。 我怎樣才能做到這一點?

想法:我通過添加加權的節點來創建圖形,然后在節點之間添加邊。

def create_graph(data, weights):
    nodes = create_nodes(data)
    edges = create_edges(data) # list of tuples

    # Create the graph
    G = nx.Graph()

    # Add edges
    for node in nodes:
        G.add_node(node, weight=weights[node])

    # Add edges
    G.add_edges_from(edges)

    return G

這種方法正確嗎?

下一步是找到權重最小的2個節點之間的路徑。 我發現了這個功能: networkx.algorithms.shortest_paths.generic.shortest_path ,我認為這樣做是正確的。 但是,它在邊緣使用權重而不是在節點上使用權重。 有人可以解釋一下此功能的作用,對節點的權重與對邊緣的權重之間的區別是什么,以及如何實現所需的功能? 謝謝 :)

這通常看起來是正確的。

您可以使用bidirectional_dijkstra 如果您知道路徑的源節點和目標節點,則速度會大大提高(請參閱底部的評論)。

要解決邊緣與節點權重問題,有兩種選擇。 首先請注意,您位於路徑上節點的總和之后。 如果我給每條邊一個權重w(u,v) = w(u) + w(v)那么沿這條權重的總和就是w(source) + w(target) + 2 sum(w(v))其中節點v是沿途發現的所有節點。 具有這些邊緣權重的最小權重將具有帶有節點權重的最小權重。

因此,您可以將每個邊的權重分配為兩個節點的總和。

for edge in G.edges():
    G.edges[edge]['weight'] = G.nodes[edge[0]]['weight'] + G.nodes[edge[1]]['weight']

但另一種方法是注意,輸入bidirectional_dijkstra的權重可以是將邊作為輸入的函數。 定義您自己的函數以給出兩個節點權重之和:

def f(edge):
    u,v = edge
    return G.nodes[u]['weight'] + G.nodes[v]['weight']

然后在通話中執行bidirectional_dijkstra(G, source, target, weight=f)

因此,我建議的選擇是為每個邊緣分配的權重等於節點權重之和,或者定義一個函數,以僅針對算法遇到的邊緣給出權重。 在效率方面,我希望找出哪種方法比編寫任何一種算法要花更多的時間。 唯一的性能問題是分配所有權重將使用更多的內存。 假設內存不是問題,請使用您認為最容易實現和維護的內存。


關於雙向dijkstra的一些評論:假設您在空間中有兩個點,它們之間的距離為R,並且您想找到它們之間的最短距離。 dijkstra算法(默認為shortest_path)將探索源點距離D內的每個點。 基本上,這就像在第一個點居中展開一個氣球,直到到達另一個。 它的體積為(4/3)pi R ^ 3。 使用bidirectional_dijkstra我們使每個氣球居中膨脹,直到它們接觸為止。 它們各自的半徑為R / 2。 因此,體積為(4/3)pi(R / 2)^ 3 +(4/3)pi(R / 2)^ 3,是原始氣球體積的四分之一,因此該算法已探索了四分之一空間。 由於網絡可以具有非常高的有效維度,因此節省的費用通常更大。

暫無
暫無

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

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