2010-10-19 11 views
11

में एक नोड से दूसरे में सभी संभावित पथ एक निर्देशित पेड़ का प्रतिनिधित्व करने के लिए python binding से igraph का उपयोग करते हैं। मैं उस ग्राफ में किसी नोड से सभी संभावित पथों को दूसरे में ढूंढना चाहता हूं। दुर्भाग्यवश, मुझे इस कार्य को करने वाले igraph में फ़ंक्शन का उपयोग करने के लिए तैयार नहीं मिला?एक निर्देशित पेड़ (igraph)

संपादित

रास्तों

की अनंत संख्या पर चिंताओं ग्राफ के बारे में मैं बात कर रहा हूँ वास्तव में एक निर्देशित अचक्रीय ग्राफ (DAG) एकल रूट के साथ है। यह घटनाओं के एक unidirectional कैस्केड का प्रतिनिधित्व करता है कि, कैस्केड के विभिन्न स्तरों पर, या तो विभाजित या एक साथ शामिल हो सकते हैं। जैसा कि मैंने कहा, यह एक unidirectional ग्राफ है। यह भी प्रदान किया जाता है कि ग्राफ में कोई चक्र नहीं है। इन दो कारणों से, पथों की अनंत सूची असंभव है।

मैं क्या करने की कोशिश कर रहा हूं?

मेरा लक्ष्य ग्राफ़ (रूट) के शीर्ष से दिए गए नोड तक के सभी संभावित पथों को ढूंढना है।

+1

इतने लंबे समय तक कि दोनों नोड्स एक और नोड तक पहुंच सकते हैं, आप लक्ष्य नोड तक पहुंचने से पहले किनारे पर बार-बार घुमाकर असीमित कई पथ बना सकते हैं। इसी कारण से, सभी संभावित पथों की गैर-समाप्ति सूची आपको बहुत अच्छा करने की संभावना नहीं है। आप वास्तव में क्या ढूंढ रहे हैं, और क्यों? –

+0

@ जेरेमी डब्ल्यू शेरमेन, मुझे यह उल्लेख करना पड़ा कि जिस ग्राफ के बारे में मैं बात कर रहा हूं वह वास्तव में एक पेड़ है। मेरी संपादनों को देखें जो स्थिति –

उत्तर

13

आप एक निर्देशित विश्वकोश ग्राफ (डीएजी) में एक नोड और दूसरे के बीच सभी पथों की तलाश में हैं।

एक पेड़ हमेशा एक डीएजी होता है, लेकिन एक डीएजी हमेशा एक पेड़ नहीं होता है। अंतर यह है कि एक पेड़ की शाखाओं में शामिल होने की अनुमति नहीं है, केवल विभाजित करें, जबकि एक डीएजी की शाखाएं एक साथ बहती हैं, जब तक कोई चक्र पेश नहीं किया जाता है।

आपका समाधान find_all_paths()"Python Patterns - Implementing Graphs." में पाया जा सकता है इसके लिए igraph के साथ उपयोग करने के लिए थोड़ा अनुकूलन की आवश्यकता है। मैं igraph स्थापित नहीं है, लेकिन mocks का उपयोग कर, यह काम करने के लिए लगता है:

def adjlist_find_paths(a, n, m, path=[]): 
    "Find paths from node index n to m using adjacency list a." 
    path = path + [n] 
    if n == m: 
    return [path] 
    paths = [] 
    for child in a[n]: 
    if child not in path: 
     child_paths = adjlist_find_paths(a, child, m, path) 
     for child_path in child_paths: 
     paths.append(child_path) 
    return paths 

def paths_from_to(graph, source, dest): 
    "Find paths in graph from vertex source to vertex dest." 
    a = graph.get_adjlist() 
    n = source.index 
    m = dest.index 
    return adjlist_find_paths(a, n, m) 

यह दस्तावेज़ से स्पष्ट नहीं है कि adjlist या शिखर सूचकांकों की सूचियों की एक सूची सूची की एक सूची शिखर खुद को वस्तुओं की है था । मैंने माना कि सूचियों में सूचीबद्ध सूची का उपयोग करके सरलीकृत करने के लिए सूचकांक शामिल हैं। नतीजतन, लौटा पथ वर्टेक्स सूचकांक के मामले में हैं। आपको इन्हें वर्टेक्स ऑब्जेक्ट्स पर मैप करना होगा यदि आपको इसके बजाय इसकी आवश्यकता है, या कोड को इसके इंडेक्स की बजाय वर्टेक्स को जोड़ने के लिए अनुकूलित करना होगा।

+5

+1 को स्पष्ट करते हैं यह बहुत अच्छा है, केवल एक चीज जो मैं बदलूंगा वह है 'adjlist_find_paths' में आसन्न सूची प्रतिनिधित्व के बजाय ग्राफ का उपयोग करना। 'a [n]' को 'graph.successors (n)' द्वारा प्रतिस्थापित किया जा सकता है जो आपको एक ही चीज़ देता है, लेकिन संभावित रूप से बड़े ग्राफ के लिए आसन्नता सूची के निर्माण से पहले से बचाता है। * (अस्वीकरण: मैं उन लोगों में से एक हूं जिन्हें इग्राफ के लिए दोषी ठहराया जाना चाहिए) * –

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