2016-10-17 11 views
5

के बीच की दूरी प्राप्त करें मैं नेटवर्कएक्स का उपयोग करने में एक नौसिखिया हूं और मैं यह पता लगाने का एक तरीका ढूंढने की कोशिश कर रहा हूं कि कौन से नोड्स एक दूसरे से दूरी एक्स है। मैं इस कलन विधि का उपयोग सभी जोड़ों कोनेटवर्कक्स: नोड्स

path=nx.all_pairs_dijkstra_path(G) 

पाने के लिए द्वारा शुरू कर दिया है लेकिन मैं अभी भी कैसे पाश के लिए एक का उपयोग कर नोड्स के बीच की दूरी का पता लगाने के पर अनिश्चित हूँ।

मैं किसी भी मदद की सराहना करता हूं। धन्यवाद

+0

आप किस दूरी के बारे में बात कर रहे हैं? दो नोड्स के बीच किनारों की न्यूनतम संख्या? – GeckStar

+0

उदाहरण के लिए मेरे पास सीधा पथ ग्राफ है जिसमें 5 नोड्स [ए, बी, सी, डी, ई] किनारों (ए, बी) (बी, सी) (सी, डी) (डी, ई) के साथ हैं और मैं चाहूंगा एक नोड और डी नोड के बीच की दूरी को जानने के लिए। बेशक मैं इसे एक बड़े कार्यक्रम में उपयोग करूंगा लेकिन मैं उस दृष्टिकोण को जानना चाहता हूं जिसका मुझे उपयोग करना चाहिए। धन्यवाद – michaelI

उत्तर

4

नेटवर्कएक्स में भारित और असीमित ग्राफ के लिए स्वचालित रूप से सबसे कम पथ (या केवल पथ की लंबाई) की गणना करने के तरीके हैं। सुनिश्चित करें कि आप अपने उपयोग के मामले के लिए सही विधि का उपयोग करें।

networkx.all_pairs_shortest_path - एक अनिर्धारित ग्राफ

networkx.all_pairs_shortest_path_length में सभी नोड्स के बीच कम से कम पथ की गणना करता है - एक अनिर्धारित ग्राफ

networkx.all_pairs_dijkstra_path में सभी नोड्स के बीच कम से कम पथ की लंबाई की गणना करता है - कम से कम की गणना करता है में सभी नोड्स के बीच पथ भारित ग्राफ

networkx.all_pairs_dijkstra_path_length - एक भारित ग्राफ में सभी नोड्स के बीच कम से कम पथ की लंबाई की गणना करता है

इन तरीकों में से हर एक, जब एक ग्राफ पर निष्पादित, एक शब्दकोश के साथ नोड्स के मैट्रिक्स (एक "शब्दकोशों के शब्दकोश") की गणना करेगा या तो मूल्य के रूप में सबसे कम पथ का संबंधित सबसे छोटा रास्ता या लंबाई। मैं एक उदाहरण के साथ इस का प्रदर्शन करेंगे:

>>> 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 

आप देख सकते हैं, मैं पाँच नोड्स के साथ एक ग्राफ उत्पन्न होते हैं और एक बढ़त के साथ अगले एक करने के लिए प्रत्येक नोड जुड़े। मैंने sp में सबसे कम पथों का मैट्रिक्स संग्रहीत किया और spl में सबसे छोटी पथ लंबाई का एक मैट्रिक्स संग्रहीत किया। जब मुझे दो नोड्स के बीच सबसे छोटा रास्ता पता होना चाहिए, उदा। नोड "A" और नोड "E", मैं बस मैट्रिक्स, या शब्दकोशों का शब्दकोश शब्दकोश: sp["A"]["E"] की तरह sp तक पहुंचता हूं। फिर यह दो नोड्स के बीच पूरा सबसे छोटा रास्ता वापस कर देगा। सबसे छोटी पथ लंबाई के लिए विधि एक समान फैशन में काम करती है, लेकिन यह केवल दो दिए गए नोड्स के बीच किनारों की संख्या लौटाएगी।

अगला कोड स्निपेट इसे एक शब्दकोश मैट्रिक्स के साथ मेरा मतलब स्पष्ट कर सकता है।

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

आप for छोरों का उपयोग करके सभी नोड्स के बीच की दूरी की जाँच करना चाहते हैं, तो आप सिर्फ अधिक पुनरावृति सकता है: मैं नोड "A" के लिए sp में सभी प्रविष्टियों का अनुरोध करते हैं, यह हर दूसरे नोड के लिए प्रविष्टियों के साथ एक और शब्दकोश रिटर्न मैट्रिक्स के पहले शब्दकोश की कुंजी और फिर उस शब्दकोश के अंदर शब्दकोशों के ऊपर। यह लगता है कि यह आसान है:

>>> 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!) 

यदि आपके कोई प्रश्न हैं तो कृपया मुझे बताएं।

संबंधित मुद्दे