2012-07-30 16 views
6

मुझे बूस्ट के डिजस्ट्रा के एल्गोरिदम का उपयोग करने के तरीके को समझने में कठिनाई हो रही है। मैं उनके उदाहरण और दस्तावेज़ीकरण पर चला गया हूं, लेकिन मैं अभी भी समझ नहीं पा रहा हूं कि इसका उपयोग कैसे किया जाए।बूस्ट के डिजस्ट्रा के एल्गोरिदम ट्यूटोरियल

[बूस्ट का प्रलेखन: http://www.boost.org/doc/libs/1_50_0/libs/graph/doc/dijkstra_shortest_paths.html] [डिजस्ट्रा का उदाहरण: http://www.boost.org/ डॉक्टर/libs/1_36_0/libs/graph/example/dijkstra-example.cpp]

क्या कोई कृपया बूस्ट के डिजस्ट्रा के एल्गोरिदम का उपयोग करने के तरीके को दिखाने के लिए कोड उदाहरणों के साथ चरण-दर-चरण स्पष्टीकरण प्रदान कर सकता है? मैं अपने ग्राफ के लिए बूस्ट की adjacency_list का उपयोग कर रहा हूं, जैसा उपरोक्त उदाहरण लिंक में है। (Adjacency_list: http://www.boost.org/doc/libs/1_50_0/libs/graph/doc/adjacency_list.html)

+1

पोस्ट सामग्री के कुछ उदाहरण आपने कोशिश की है कि खराब नहीं है ked। – Wug

+0

".. उनके उदाहरण और दस्तावेज़ीकरण" - आप किसके उदाहरण और दस्तावेज़ीकरण का उपयोग कर रहे हैं? – hatchet

+0

@hatchet: मुझे लगता है कि यह http://www.boost.org/doc/libs/1_38_0/libs/graph/example/dijkstra-example.cpp –

उत्तर

10

टिप्पणी में सवाल के बारे में:

  1. उदाहरण कुलपति ++ के sourcecode में टिप्पणी के अनुसार named parameter mechanism used के साथ कुछ समस्या है। इसलिए मुझे लगता है कि दोनों शाखाएं मूल रूप से वीसी ++ संस्करण के साथ एक ही सोचती हैं जो कि अधिक वर्बोज़ होती है (हालांकि इसमें 100% सुनिश्चित होने के लिए पर्याप्त समय तक इसमें डुबकी नहीं थी)।
  2. property_map विशेष वर्टेक्स/किनारे से जुड़े अतिरिक्त डेटा के लिए नक्शा शिखर/किनारों। जैसे उदाहरण में weightmap प्रत्येक किनारे के साथ एक वजन (यात्रा लागत) को जोड़ता है।
  3. predecessor_map सभी शीर्षकों के लिए पथ रिकॉर्ड करने के लिए उपयोग किया जाता है (प्रत्येक चरम सीमा के लिए रूट पर पथ पर पूर्ववर्ती रिकॉर्ड किया जाता है)। इसकी आवश्यकता क्यों है: ठीक है कि जानकारी कुछ ऐसा होता है जो अक्सर एल्गोरिदम से बाहर निकलने की उम्मीद करता है।

  4. पैरामीटर स्पष्ट रूप से description में सूचीबद्ध हैं। दो संस्करणों को नोट करें, नामित पैरामीटर वाले एक और बिना किसी (बाद में वीसी ++ में उपयोग किया जा रहा है)।

the documentation में दिए गए उदाहरण कोड के कदम से कुछ हद तक एक कदम के लिए

अब (ध्यान दें कि मैं वास्तव में कभी Boost.Graph इस्तेमाल किया है, तो यह शुद्धता पर कोई गारंटी है, यह भी मैं केवल प्रासंगिक भागों शामिल है और छोड़े गए कुलपति ++ के लिए) #if:

const int num_nodes = 5; 
    //names of graph nodes 
    enum nodes { A, B, C, D, E }; 
    char name[] = "ABCDE"; 
    //edges of the graph 
    Edge edge_array[] = { Edge(A, C), Edge(B, B), Edge(B, D), Edge(B, E), 
    Edge(C, B), Edge(C, D), Edge(D, E), Edge(E, A), Edge(E, B) 
    }; 
    //weights/travelling costs for the edges 
    int weights[] = { 1, 2, 1, 2, 7, 3, 1, 1, 1 }; 
    int num_arcs = sizeof(edge_array)/sizeof(Edge); 

    //graph created from the list of edges 
    graph_t g(edge_array, edge_array + num_arcs, weights, num_nodes); 
    //create the property_map from edges to weights 
    property_map<graph_t, edge_weight_t>::type weightmap = get(edge_weight, g); 

    //create vectors to store the predecessors (p) and the distances from the root (d) 
    std::vector<vertex_descriptor> p(num_vertices(g)); 
    std::vector<int> d(num_vertices(g)); 
    //create a descriptor for the source node 
    vertex_descriptor s = vertex(A, g); 

    //evaluate dijkstra on graph g with source s, predecessor_map p and distance_map d 
    //note that predecessor_map(..).distance_map(..) is a bgl_named_params<P, T, R>, so a named parameter 
    dijkstra_shortest_paths(g, s, predecessor_map(&p[0]).distance_map(&d[0])); 

मैं टिप्पणी में उल्लेख किया है व्यक्तिगत रूप से मुझे लगता है lemon अधिक तो Boost.Graph उपयोग करने के लिए सहज ज्ञान युक्त है, तो हो सकता है आप को देने के लिए चाहते हो सकता है कि एक नज़र बजाय

+0

आपको बहुत बहुत धन्यवाद! इससे मेरा भ्रम खत्म हो गया। – Qman

+0

@ user1563613: यदि आपको धन्यवाद देने का सामान्य तरीका उपयोगी लगता है तो आप इसे स्वीकार करेंगे और/या इसे ऊपर उठाएंगे – Grizzly

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