Как использовать `randomize_property` с графом связанных свойств в библиотеке графов boost? - PullRequest
4 голосов
/ 19 апреля 2011

В документации: http://www.boost.org/doc/libs/1_46_1/libs/graph/doc/random.html#randomize_property

Есть только прототип функции, я не могу найти рабочий пример.Я пробовал несколько вещей, но он просто не может скомпилировать.Вот простой исходный код:

#include <ctime>
#include <iostream>
#include <boost/graph/random.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/random/linear_congruential.hpp>
#include <boost/graph/erdos_renyi_generator.hpp>
#include <boost/graph/graphviz.hpp>
using namespace std;
using namespace boost;

struct EdgeProperty {
  int cost;
}; 

typedef adjacency_list<
        setS, // disallow parallel edge
        vecS, 
        undirectedS,
        no_property,
        EdgeProperty
> Graph;

typedef erdos_renyi_iterator<minstd_rand, Graph> ERGen;

int main(int argc, const char *argv[])
{
  minstd_rand gen(time(0));
  assert(argc >= 3);
  int n = atoi(argv[1]);
  double p = atof(argv[2]);
  Graph g(ERGen(gen, n, p), ERGen(), n);

  // randomize_property< [unknown class] >(g, gen);

  return 0;
}

Обновление: работает код @phooji.Я добавил конструктор по умолчанию для EdgeProperty, и мой код тоже компилируется:

struct EdgeProperty {
  EdgeProperty(int x = 0) : cost(x) { }
  int cost;
}; 

Исходная ошибка компиляции выложена в виде здесь , что я не могу понять.Надеюсь, кто-нибудь скажет мне, как это работает.

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

Это компилируется для меня:

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

struct myedge {
  myedge(int x) : testme(x) {
  }
  int testme;
};

typedef boost::adjacency_list<boost::setS, // disallow parallel edge
  boost::vecS,
  boost::undirectedS,
  boost::no_property,
  myedge
  > mygraph;

int main(int argc, char**argv) {
  mygraph g;

  // auto pmap = boost::get(&myedge::testme, g);
  boost::minstd_rand gen(0);
  boost::randomize_property<boost::edge_bundle_t>(g, gen);
  return EXIT_SUCCESS; // :)
}

Надеюсь, это поможет - у меня нет времени, чтобы на самом деле проверить это, поэтому извиняюсь, если вы не за этим.

0 голосов
/ 05 апреля 2013

Вы можете использовать следующий обходной путь до тех пор, пока он не будет должным образом отсортирован по бусту:

boost::detail::randomize_property<int EdgeProperty::*> 
      (g, gen, &EdgeProperty::cost, boost::edge_bundle_t);
0 голосов
/ 19 апреля 2011

Существует по крайней мере одна проблема, которую я вижу, это недопустимое определение свойства ребра. Для определения свойств графа следует использовать тип property<>. Существует несколько предопределенных типов свойств, таких как индекс, вес, цвет и т. Д. Для определения стоимости ребра используется тип свойства edge_weight_t. Следовательно, определение типа графа должно быть следующим:

typedef adjacency_list<
      setS, // disallow parallel edge
      vecS,
      undirectedS,
      no_property,
      property<edge_weight_t, int>
> Graph; 

Для доступа к типу свойства используется property_map<>: property_map<Graph, edge_weight_t>::type.

Редактировать Моя ошибка, связанная со связанными свойствами, все еще трудно предоставить правильный тип для параметра шаблона randomize_property<Property>, которым должно быть свойство kind . Если вы определите график, как в моем примере, использование будет randomize_property<edge_weight_t>(g, gen);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...