在构建基于代理的模型时,我遇到了booost图库的以下问题 . 我有一个代表代理商和潜在交易的有向图,定义如下:

struct agent{
  int idhh;
  double askprice;
  double maxbid;
  bool is_seller;
  bool is_buyer;
};

typedef adjacency_list< listS, // Store out-edges of each vertex in a std::list
                       listS, // Store vertex set in a std::list
                       directedS,
                       // vertex properties
                       agent,
                       // edge properties
                       no_property
                       >
                       taGraph;

typedef graph_traits<taGraph>::vertices_size_type v_size_type;
typedef graph_traits<taGraph>::edges_size_type e_size_type;
typedef graph_traits<taGraph>::vertex_descriptor vertex_t;
typedef graph_traits<taGraph>::vertex_iterator vertex_iter;
typedef graph_traits<taGraph>::edge_descriptor edge_t;
typedef graph_traits<taGraph>::out_edge_iterator out_edge_iter;
typedef graph_traits<taGraph>::in_edge_iterator in_edge_iter;

对于此部分问题,可以忽略顶点属性 . 现在,对于给定的节点v,我想找到两件事之一:

  • 如果节点v不是接收器但具有边缘和边缘,我想找到一个涉及节点v的循环 .

  • 如果节点v是网络中的源(即没有传入边缘),我想找到另一个作为接收器的节点的路径(即没有传出边缘),并记录该路径 .

请注意,在这两种情况下,找到一条路径绝对足够,而不是全部 . (事实上,我们进行了详尽的搜索,但事实证明这对我们来说是不可行的 . )我认为我们使用深度优先搜索(dfs)而不是广度优先搜索,因为它可能会提供更长的路径,这是可取的在我们的情况下 . 我还发现解决方案在于为dfs提供访问者 . 对于第一个问题,它应检查每个examine_edge()是否边指向开始顶点v,在第二种情况下,边是否指向具有out-degree零度的节点 . 如果满足条件,则会抛出异常,以便不搜索完整的图形 .

我已经浏览了boost网站上为dfs和dfs访问者提供的示例 . 我花了最后一夜了解它是如何工作的 . 但是如何实现这个具体案例仍然以某种方式完全逃脱了我 .

因此,具体问题是,因为我没有成功地正确构建访问者:访问者需要看起来像什么?