web-dev-qa-db-ja.com

Networkx:ノード間の距離を取得します

私はNetworkXの使用の初心者であり、どのノードが互いに距離xを持っているかを検出する方法を見つけようとしています。私はこのアルゴリズムを使用してすべてのペアを取得することから始めました

path=nx.all_pairs_dijkstra_path(G)

しかし、forループを使用してノード間の距離を検出する方法がまだわかりません。

助けていただければ幸いです。ありがとうございました

9
michaelI

NetworkXには、加重グラフと非加重グラフの最短パス(またはパスの長さのみ)を自動的に計算するメソッドがあります。ユースケースに適した方法を使用していることを確認してください。

networkx.all_pairs_shortest_path -unweightedグラフ内のすべてのノード間の最短パスを計算します

networkx.all_pairs_shortest_path_length -unweightedグラフ内のすべてのノード間の最短パスの長さを計算します

networkx.all_pairs_dijkstra_path -weightedグラフ内のすべてのノード間の最短パスを計算します

networkx.all_pairs_dijkstra_path_length -weightedグラフ内のすべてのノード間の最短パスの長さを計算します

これらのメソッドはすべて、グラフ上で実行されると、それぞれの最短パスまたは最短パスの長さのいずれかを値として持つノードのディクショナリマトリックス(「ディクショナリのディクショナリ」)を計算します。これを例で示します。

>>> import networkx as nx
>>> G = nx.Graph()
>>> G.add_nodes_from(["A", "B", "C", "D", "E"])
>>> G.add_edges_from([("A", "B"), ("B", "C"), ("C", "D"), ("D", "E")])
>>> sp = nx.all_pairs_shortest_path(G)
>>> sp["A"]["E"]
['A', 'B', 'C', 'D', 'E']
>>> spl = nx.all_pairs_shortest_path_length(G)
>>> spl["A"]["E"]
4

ご覧のとおり、5つのノードでグラフを生成し、すべてのノードをEdgeで次のノードにリンクしました。最短経路の行列をspに、最短経路の長さの行列をsplに格納しました。 2つのノード間の最短パスを知る必要がある場合。ノード"A"とノード"E"、私はマトリックスのようにspにアクセスするか、辞書の辞書にアクセスします:sp["A"]["E"]。次に、2つのノード間の最短パス全体を返します。最短パス長の方法も同様に機能しますが、指定された2つのノード間のエッジの数のみが返されます。

次のコードスニペットは、辞書マトリックスの意味を明確にする可能性があります。ノード"A"sp内のすべてのエントリを要求すると、他のすべてのノードのエントリを含む別の辞書が返されます。

>>> sp["A"]
{'B': ['A', 'B'], 'A': ['A'], 'E': ['A', 'B', 'C', 'D', 'E'], 'C': ['A', 'B', 'C
'], 'D': ['A', 'B', 'C', 'D']}

forループを使用してすべてのノード間の距離を確認する場合は、マトリックスの最初のディクショナリのキーを繰り返し、次にそのディクショナリ内のディクショナリを繰り返すことができます。思ったより簡単です:

>>> for node1 in spl:
...   for node2 in spl[node1]:
...     print("Length between", node1, "and", node2, "is", spl[node1][node2])
...
Length between B and B is 0
Length between B and A is 1
Length between B and E is 3
Length between B and C is 1
Length between B and D is 2
Length between A and B is 1
... (and so on!)

ご不明な点がございましたらお知らせください。

9
GeckStar