2012-07-30 41 views
6

Tôi gặp khó khăn trong việc tìm hiểu cách sử dụng thuật toán Dijkstra của Boost. Tôi đã đi qua ví dụ và tài liệu của họ, nhưng tôi vẫn không thể hiểu làm thế nào để sử dụng nó.Hướng dẫn Thuật toán Dijkstra của Boost

[Tài liệu của Boost: http://www.boost.org/doc/libs/1_50_0/libs/graph/doc/dijkstra_shortest_paths.html] [Ví dụ về Dijkstra: http://www.boost.org/ doc/libs/1_36_0/libs/graph/example/dijkstra-example.cpp]

Có thể ai đó vui lòng cung cấp giải thích từng bước với các ví dụ mã để cho biết cách sử dụng thuật toán Dijkstra của Boost? Tôi đang sử dụng adjacency_list của Boost cho biểu đồ của tôi, giống như trong liên kết mẫu ở trên. (Adjacency_list: http://www.boost.org/doc/libs/1_50_0/libs/graph/doc/adjacency_list.html)

+1

bài viết một số ví dụ về những gì bạn đã thử mà không phải lo lắng ked. – Wug

+0

"..ví dụ và tài liệu hướng dẫn" - Bạn đang sử dụng ví dụ và tài liệu nào? – hatchet

+0

@hatchet: Tôi cho rằng đó là http://www.boost.org/doc/libs/1_38_0/libs/graph/example/dijkstra-example.cpp –

Trả lời

10

Về các câu hỏi trong các ý kiến:

  1. Theo nhận xét trong mã nguồn của ví dụ VC++ có một số vấn đề với các named parameter mechanism used. Vì vậy, tôi muốn giả định rằng cả hai chi nhánh về cơ bản cùng suy nghĩ với phiên bản VC++ chỉ là tiết hơn (tôi đã không đi sâu vào nó đủ lâu để chắc chắn 100%).
  2. A property_map ánh xạ các đỉnh/cạnh tới dữ liệu bổ sung được liên kết với đỉnh/cạnh cụ thể. Ví dụ. các weightmap trong ví dụ liên kết trọng lượng (chi phí đi lại) với mỗi cạnh.
  3. Các predecessor_map được sử dụng để ghi lại các đường dẫn cho tất cả các đỉnh (đối với mỗi đỉnh người tiền nhiệm trên đường dẫn từ gốc được ghi lại). Đối với lý do tại sao nó là cần thiết: Vâng thông tin đó là một cái gì đó thường hy vọng để có được ra khỏi thuật toán.

  4. Các tham số được liệt kê rõ ràng trong description. Lưu ý hai phiên bản, một phiên bản có tham số được đặt tên và một tham số không có (phiên bản sau được sử dụng trong VC++).

bây giờ cho một bước nào bước các mã ví dụ được đưa ra trong the documentation (lưu ý rằng tôi không bao giờ thực sự sử dụng Boost.Graph, vì vậy đây là không bảo đảm về tính chính xác, tôi cũng chỉ bao gồm các bộ phận liên quan và bỏ qua #if cho VC++):

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])); 

Như tôi đã đề cập trong các ý kiến ​​cá nhân tôi tìm lemon trực quan hơn để sử dụng sau đó Boost.Graph, như vậy có lẽ bạn có thể muốn cung cấp cho rằng một cái nhìn thay vì

+0

Cảm ơn bạn rất nhiều! Điều đó làm sáng tỏ nhiều sự nhầm lẫn của tôi. – Qman

+0

@ user1563613: nếu bạn tìm thấy câu trả lời hữu ích, cách nói thông thường cảm ơn bạn sẽ chấp nhận và/hoặc upvoting nó – Grizzly

Các vấn đề liên quan