私はNetworkXの使用の初心者であり、どのノードが互いに距離xを持っているかを検出する方法を見つけようとしています。私はこのアルゴリズムを使用してすべてのペアを取得することから始めました
path=nx.all_pairs_dijkstra_path(G)
しかし、forループを使用してノード間の距離を検出する方法がまだわかりません。
助けていただければ幸いです。ありがとうございました
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!)
ご不明な点がございましたらお知らせください。