使用r_c_shortest路径和自定义图形(boost)

时间:2013-05-07 14:06:11

标签: c++ boost boost-graph

我想使用我定义的图表来使用提升图函数r_c_shortest_paths

这里是图表和一些定义(在文件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)]'

我真的无法理解错误。有人可以解释一下如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您传递给r_c_shortest_paths的第二个和第三个参数必须是Integer类型,而不是您正在执行的String