【问题标题】:Random access (or otherwise fast access) of edges in boost graph libraryboost 图形库中边的随机访问(或其他方式的快速访问)
【发布时间】:2016-12-16 17:29:41
【问题描述】:

我想运行 Monte Carlo 边交换,即随机均匀地选择图中的两条现有边,然后(如果满足某些条件)交换它们的端点。

我目前正在使用boost::random_edge 随机均匀地选择边缘。

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/erdos_renyi_generator.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/variate_generator.hpp>
#include <boost/graph/random.hpp>
#include <boost/random/linear_congruential.hpp>

int main(int argc, char* argv[]) {
  typedef boost::adjacency_list<boost::setS,boost::vecS,boost::undirectedS> Graph;
  typedef boost::erdos_renyi_iterator<boost::minstd_rand, Graph> ERGen;
  typedef boost::uniform_int<> UniformIntDistr;
  typedef boost::variate_generator<boost::mt19937&, UniformIntDistr> IntRNG;

  // make random graph
  int n = 17000;
  boost::graph_traits<Graph>::edges_size_type m = 250000;
  boost::minstd_rand gen;
  Graph g(ERGen(gen, n, m), ERGen(), n);

  // make random number generator
  boost::mt19937 rng;
  UniformIntDistr dis(0, num_edges(g)-1);
  IntRNG gen_int(rng, dis);

  // select two edges uniformly at random (a million times)
  Graph::edge_descriptor e1;
  Graph::edge_descriptor e2;
  for (int i=0; i<1000000;i++) {
    Graph::edge_descriptor e1 = boost::random_edge(g, gen_int);
    Graph::edge_descriptor e2 = boost::random_edge(g, gen_int);
  };
}

对于边缘 >250k 的图,这会变得相当慢;每次使用random_edge 大约需要 1 到 10 毫秒。在之前运行时间相同的版本中,我在edges(g).first 上使用了std::advance(与上面的gen_int 相同)。在那个版本中,std::advance 占据了大部分计算时间。

我假设如果我可以获得edges(g) 的随机访问迭代器,事情会运行得更快,类似于对顶点here 的随机访问。

不过,我也愿意接受其他方法。应该有一些方法可以做到这一点,因为在 graph-tool 的 random_rewire 函数中有一个蒙特卡洛边缘交换的实现,它的运行速度比我的代码快得多。

【问题讨论】:

  • 我发现,对于random_rewire 的许多关键字 args 的某种组合,graph-tool 命令完全符合我的要求(创建具有给定度数分类矩阵的图) ,所以我最终切换回图形工具以实现最佳性能。

标签: c++ boost graph random-access graph-tool


【解决方案1】:

不,您不能随机访问邻接列表:

以下是洗牌边缘的不同方法的基准:

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2015-05-06
    • 1970-01-01
    相关资源
    最近更新 更多