2013-05-07 22 views
1

我想使用增強圖函數r_c_shortest_paths使用由我定義的圖形。使用r_c_shortest路徑與自定義圖形(升壓)

這裏的圖和一些定義(在文件graphs2.h):

#ifndef GRAPHS2_H 
#define GRAPHS2_H 

#include <boost/graph/adjacency_list.hpp> 

namespace Gol { 

    class UrbanVertexInfo 
    { 
    public: 
    UrbanVertexInfo() {} 
    UrbanVertexInfo(std::string n, std::string id) 
    : name(n), vid(id) {} 
    ~UrbanVertexInfo() {} 

    std::string name; 
    std::string vid; 

    }; 

    class UrbanEdgeInfo 
    { 
    public: 

    UrbanEdgeInfo(); 

    UrbanEdgeInfo(std::string n, double l, double c) 
     : name(n), length(l), cost(c) {} 

    ~UrbanEdgeInfo() {} 

    std::string name; 
    double length; 
    double cost; 

    }; 

    typedef boost::property<boost::graph_name_t, std::string, // name of the graph 
       boost::property<boost::graph_id_t, std::string> // id 
       > GraphInfo;     // property of the graph 

    typedef boost::adjacency_list <boost::setS, boost::vecS, boost::bidirectionalS, UrbanVertexInfo, UrbanEdgeInfo, GraphInfo > UrbanGraph; 

    // ResourceContainer model 
    struct res_cont { 

     res_cont(double c, double l): cost(c), len(l) {}; 

     res_cont& operator= (const res_cont& other) { 

      if(this == &other) 
       return *this; 
      this->~res_cont(); 
      new(this) res_cont(other); 
      return *this; 
     } 

     double cost; 
     double len; 
    }; 

    bool operator== (const res_cont& one, const res_cont& two) { 

     return (one.cost == two.cost && one.len == two.len); 
    } 

    bool operator< (const res_cont& one, const res_cont& two) { 

     if (one.len > two.len) 
      return false; 
     if (one.len == two.len) 
      return (one.cost < two.cost); 
     return true; 
    } 

    // ResourceExtensionFunction model 
    class ext_func { 
    public: 
     inline bool operator() (const UrbanGraph& g, res_cont& new_cont, const res_cont& old_cont, 
          boost::graph_traits<UrbanGraph>::edge_descriptor ed) const { 
      new_cont.cost = old_cont.cost + get(&UrbanEdgeInfo::cost, g, ed); 
      new_cont.len = old_cont.len + get(&UrbanEdgeInfo::length, g, ed); 
      return true; 
    } 
}; 

    // DominanceFunction model 
    class dom_func { 
    public: 
     inline bool operator() (const res_cont& one, const res_cont& two) const { 
      return (one.cost <= two.cost && one.len <= two.len); 
     } 
}; 
} 
#endif /* GRAPHS2_H */ 

這是我的主,在那裏我打電話r_c_shortest_paths()一個簡單的圖表:

#include <iostream> 

#include <boost/graph/graph_traits.hpp> 
#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/r_c_shortest_paths.hpp> 

#include "graphs2.h" 

using namespace boost; 

int main(int argc, char** argv) { 

    std::cout << "hello boost" << std::endl; 

    typedef std::pair <int, int> Edge; 
    typedef graph_traits<Gol::UrbanGraph>::vertex_descriptor vertex_descriptor; 
    typedef graph_traits<Gol::UrbanGraph>::edge_descriptor edge_descriptor; 

    Gol::UrbanGraph g; 

    Gol::UrbanVertexInfo sorgente("sorg", "s", 0.0, 0.0); 
    Gol::UrbanVertexInfo primo("primo", "A", 1.0, 1.0); 
    Gol::UrbanVertexInfo secondo("secondo", "B", 2.0, 2.0); 
    Gol::UrbanVertexInfo terzo("terzo", "C", 3.0, 3.0); 
    Gol::UrbanVertexInfo quarto("quarto", "D", 4.0, 4.0); 
    Gol::UrbanVertexInfo arrivo("arrivo", "t", 5.0, 5.0); 
    vertex_descriptor s = add_vertex(sorgente, g); 
    vertex_descriptor A = add_vertex(primo, g); 
    vertex_descriptor B = add_vertex(secondo, g); 
    vertex_descriptor C = add_vertex(terzo, g); 
    vertex_descriptor D = add_vertex(quarto, g); 
    vertex_descriptor t = add_vertex(arrivo, g); 

    Gol::UrbanEdgeInfo ed1("da s a A", 3.0, 0.0); 
    Gol::UrbanEdgeInfo ed2("da s a B", 5.0, 4.0); 
    Gol::UrbanEdgeInfo ed3("da A a B", 4.0, 0.0); 
    Gol::UrbanEdgeInfo ed4("da A a C", 6.0, 1.0); 
    Gol::UrbanEdgeInfo ed5("da B a D", 1.0, 3.0); 
    Gol::UrbanEdgeInfo ed6("da C a B", 3.0, 0.0); 
    Gol::UrbanEdgeInfo ed7("da C a t", 2.0, 2.2); 
    Gol::UrbanEdgeInfo ed8("da D a C", 3.0, 5.0); 
    Gol::UrbanEdgeInfo ed9("da D a t", 6.0, 0.0); 
    edge_descriptor ed; 
    bool ins; 
    tie(ed, ins) = add_edge(s, A, ed1, g); 
    tie(ed, ins) = add_edge(s, B, ed2, g); 
    tie(ed, ins) = add_edge(A, B, ed3, g); 
    tie(ed, ins) = add_edge(A, C, ed4, g); 
    tie(ed, ins) = add_edge(B, D, ed5, g); 
    tie(ed, ins) = add_edge(C, B, ed6, g); 
    tie(ed, ins) = add_edge(C, t, ed7, g); 
    tie(ed, ins) = add_edge(D, C, ed8, g); 
    tie(ed, ins) = add_edge(D, t, ed9, g); 

    std::vector <std::vector <graph_traits<Gol::UrbanGraph>::edge_descriptor> > opt_solutions; 
    std::vector <Gol::res_cont> pareto_opt; 

    r_c_shortest_paths (
     g, 
     get(&Gol::UrbanVertexInfo::name, g), 
     get(&Gol::UrbanEdgeInfo::name, g), 
     s, 
     t, 
     opt_solutions, 
     pareto_opt, 
     Gol::res_cont(0, 0), 
     Gol::ext_func(), 
     Gol::dom_func(), 
     std::allocator <r_c_shortest_paths_label <Gol::UrbanGraph, Gol::res_cont> >(), 
     default_r_c_shortest_paths_visitor()); 

    return 0; 
} 

當我編譯,我得到這個錯誤:

/usr/include/boost/graph/r_c_shortest_paths.hpp:501: instantiated from 'void boost::r_c_shortest_paths(const Graph&, const VertexIndexMap&, const EdgeIndexMap&, typename boost::graph_traits<G>::vertex_descriptor, typename boost::graph_traits<G>::vertex_descriptor, std::vector<std::vector<typename boost::graph_traits<G>::edge_descriptor, std::allocator<typename boost::graph_traits<G>::edge_descriptor> >, std::allocator<std::vector<typename boost::graph_traits<G>::edge_descriptor, std::allocator<typename boost::graph_traits<G>::edge_descriptor> > > >&, std::vector<ValueT, std::allocator<_Tp2> >&, const Resource_Container&, const Resource_Extension_Function&, const Dominance_Function&, Label_Allocator, Visitor) [with Graph = Gol::UrbanGraph, VertexIndexMap = boost::vec_adj_list_vertex_property_map<boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>, boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::string&, std::string Gol::UrbanVertexInfo::*>, EdgeIndexMap = boost::adj_list_edge_property_map<boost::bidirectional_tag, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::string&, long unsigned int, Gol::UrbanEdgeInfo, std::string Gol::UrbanEdgeInfo::*>, Resource_Container = Gol::res_cont, Resource_Extension_Function = Gol::ext_func, Dominance_Function = Gol::dom_func, Label_Allocator = std::allocator<boost::r_c_shortest_paths_label<boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>, Gol::res_cont> >, Visitor = boost::default_r_c_shortest_paths_visitor]' 
main.cpp:115: instantiated from here 
/usr/include/boost/graph/r_c_shortest_paths.hpp:217: error: no match for 'operator[]' in 'vec_vertex_labels[((const boost::vec_adj_list_vertex_property_map<boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>, boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::string&, std::string Gol::UrbanVertexInfo::*>*)vertex_index_map)->boost::vec_adj_list_vertex_property_map<Graph, GraphPtr, ValueType, Reference, Tag>::operator[] [with Graph = boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>, GraphPtr = boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>*, ValueType = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Reference = std::string&, Tag = std::string Gol::UrbanVertexInfo::*](s)]' 
/usr/include/boost/graph/r_c_shortest_paths.hpp:501: instantiated from 'void boost::r_c_shortest_paths(const Graph&, const VertexIndexMap&, const EdgeIndexMap&, typename boost::graph_traits<G>::vertex_descriptor, typename boost::graph_traits<G>::vertex_descriptor, std::vector<std::vector<typename boost::graph_traits<G>::edge_descriptor, std::allocator<typename boost::graph_traits<G>::edge_descriptor> >, std::allocator<std::vector<typename boost::graph_traits<G>::edge_descriptor, std::allocator<typename boost::graph_traits<G>::edge_descriptor> > > >&, std::vector<ValueT, std::allocator<_Tp2> >&, const Resource_Container&, const Resource_Extension_Function&, const Dominance_Function&, Label_Allocator, Visitor) [with Graph = Gol::UrbanGraph, VertexIndexMap = boost::vec_adj_list_vertex_property_map<boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>, boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::string&, std::string Gol::UrbanVertexInfo::*>, EdgeIndexMap = boost::adj_list_edge_property_map<boost::bidirectional_tag, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::string&, long unsigned int, Gol::UrbanEdgeInfo, std::string Gol::UrbanEdgeInfo::*>, Resource_Container = Gol::res_cont, Resource_Extension_Function = Gol::ext_func, Dominance_Function = Gol::dom_func, Label_Allocator = std::allocator<boost::r_c_shortest_paths_label<boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>, Gol::res_cont> >, Visitor = boost::default_r_c_shortest_paths_visitor]' 
main.cpp:115: instantiated from here 
/usr/include/boost/graph/r_c_shortest_paths.hpp:408: error: no match for 'operator[]' in 'vec_vertex_labels[((const boost::vec_adj_list_vertex_property_map<boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>, boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::string&, std::string Gol::UrbanVertexInfo::*>*)vertex_index_map)->boost::vec_adj_list_vertex_property_map<Graph, GraphPtr, ValueType, Reference, Tag>::operator[] [with Graph = boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>, GraphPtr = boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, Gol::UrbanVertexInfo, Gol::UrbanEdgeInfo, boost::property<boost::graph_name_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::property<boost::graph_id_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::no_property> >, boost::listS>*, ValueType = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Reference = std::string&, Tag = std::string Gol::UrbanVertexInfo::*](t)]' 

我真的不明白錯誤。有人能解釋我如何解決這個問題嗎?

回答

0

您傳遞給r_c_shortest_paths的第二個和第三個參數必須是Integer類型而不是String,因爲您正在操作