Библиотека Boost Graph C++/степенной закон

У меня есть вектор вершины с координатами id, x и y, я хочу создать график степенного закона для своих вершин. График библиотеки Boost предоставляет степенной закон plod_iterator(), но как я могу сгенерировать его с помощью своих вершин. кто-нибудь может помочь?


person zaza    schedule 08.04.2014    source источник


Ответы (1)


В документации Boost указано, что это генераторы.

«Этот шаблон класса реализует генератор безмасштабных графиков с использованием алгоритма Power Law Out Degree (PLOD)» (http://www.boost.org/doc/libs/1_55_0/libs/graph/doc)./plod_generator.html)

Немного сбивает с толку то, что он говорит iterator.

Вместо этого я бы создал вектор структур с вашими данными, а затем сгенерировал степенной график с тем же количеством узлов.

Изменено из документации по повышению:

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

struct VertData{
  size_t id;
  size_t x;
  size_t y;
};

typedef boost::adjacency_list<> Graph;
typedef boost::plod_iterator<boost::minstd_rand, Graph> SFGen;

int main()
{

  vector<VertData> vertData;
  //... Initialize with data ...


  boost::minstd_rand gen;
  // Create graph with 100 nodes 
  Graph g(SFGen(gen, 100, 2.5, 1000), SFGen(), 100);


  typedef property_map<Graph, vertex_index_t >::type VertexIndexMap;
  VertexIndexMap iMap = get(vertex_index,g);
  // ... get some vertex v
  size_t vertexIndex = iMap[v];
  //...
  vertexData.at(vertexIndex).x = 4;//or what ever



  return 0;
}

Здесь это будет набор графа без масштаба со 100 узлами с использованием степенной степени 2,5.

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

typedef property_map<Graph, vertex_index_t >::type VertexIndexMap;
VertexIndexMap iMap = get(vertex_index,g);
size_t vertexIndex = iMap[v];
...
vertexData.at(vertexIndex).x = 4;//or what ever

Возможно, это не самый лучший способ, но он позволил мне выполнить свою работу.

person pbible    schedule 08.04.2014