我一直在研究我的图形/网络问题,我想我终于知道自己想做什么了。现在我正在进入实现,我在决定使用哪些库时遇到问题。图表本身非常简单,每个节点都用一个字符串标记,每个节点都是两个节点(变量)之间的概率/相关系数,并且是无向的。我想在图表上执行的操作是:
对于其中许多,我想将结果与Erdos-Renyi模型进行比较,并将其作为零假设进行测试。此外,能够通过马尔可夫场使用统计力学定义将是有帮助的,因为那时我可以计算两个不相同的节点之间的相关性,并询问有关熵等的图形问题。所以一个好的映射在某种马尔可夫领域的图书馆也很有用。
目前问题的症结在于我正在努力寻找一个可以使用的C ++库。我已经看过R,但是我想要的东西会更强大,更快。我正在考虑的三个图书馆是:
在未来的路上,我设想生活在分布式网络上的图形,具有分布式存储(hadoop或其他东西)。我怀疑整个图形不适合内存,因此我将不得不提出一个缓存场景来查看图形的各个部分。
人们会为我描述的问题建议哪些图书馆?使用BGL并编写自己的函数会更好吗?那么多线程版本呢?是否有任何图书馆更适合我想做的工作,尤其是我想要计算的数量?
谢谢!
EDIT1 所以我对BGL感到非常沮丧。我有一个邻接列表图,我想在图上运行我自己的约翰逊版本(或Floyd's,此时,我并不挑剔),并返回距离矩阵供我查看。除了我无法让它工作。这是我到目前为止的完整代码实现:
using namespace boost;
int main()
{
//Read in the file
std::ifstream datafile("stuff");
if (!datafile)
{
std::cerr << "No Stuff file" << std::endl;
return EXIT_FAILURE;
}
//Build the graph
typedef adjacency_list < vecS, vecS, undirectedS, property < vertex_name_t,
std::string >, property < edge_weight_t, double > > Graph;
Graph g;
//Build the two properties we want, string and double
//Note, you have to nest properties for more
typedef property_map< Graph, vertex_index_t >::type vertex_index_map_t;
vertex_index_map_t vertex_index_map = get(vertex_index, g);
typedef property_map < Graph, vertex_name_t >::type name_map_t;
name_map_t name_map = get(vertex_name, g);
typedef property_map < Graph, edge_weight_t >::type probability_map_t;
probability_map_t probability = get(edge_weight, g);
//Map of of the vertices by string
typedef graph_traits < Graph >::vertex_descriptor Vertex;
typedef std::map < std::string, Vertex > NameVertexMap;
NameVertexMap AllNodes;
//Load the file into the graph
for (std::string line; std::getline(datafile, line);)
{
char_delimiters_separator < char >sep(false, "", ";");
tokenizer <> line_toks(line, sep);
tokenizer <>::iterator i = line_toks.begin();
std::string conditionA = *i++;
NameVertexMap::iterator pos;
bool inserted;
Vertex u, v;
boost::tie(pos, inserted) = AllNodes.insert(std::make_pair(conditionA, Vertex()));
if (inserted)
{
u = add_vertex(g);
name_map[u] = conditionA;
pos->second = u;
}
else
{
u = pos->second;
}
std::string correlation = *i++;
std::istringstream incorrelation(correlation);
double correlate;
incorrelation >> correlate;
boost::tie(pos, inserted) = AllNodes.insert(std::make_pair(*i, Vertex()));
if (inserted) {
v = add_vertex(g);
name_map[v] = *i;
pos->second = v;
}
else
{
v = pos->second;
}
graph_traits < Graph >::edge_descriptor e;
boost::tie(e, inserted) = add_edge(u, v, g);
if (inserted)
probability[e] = 1.0/correlate;
}
typedef boost::graph_traits<Graph>::edge_iterator edge_iter;
std::pair<edge_iter, edge_iter> edgePair;
Vertex u, v;
for(edgePair = edges(g); edgePair.first != edgePair.second; ++edgePair.first)
{
u = source(*edgePair.first, g);
v = target(*edgePair.first, g);
std::cout << "( " << vertex_index_map[u] << ":" << name_map[u] << ", ";
std::cout << probability[*edgePair.first] << ", ";
std::cout << vertex_index_map[v] << ":" << name_map[v] << " )" << std::endl;
}
}
输入文件的格式为NodeA;相关性; NodeB。我上面粘贴的代码有效,但是当我尝试包含johnson_all_pairs_shortest_paths功能时,我遇到了严重的麻烦。真的我想要的不仅是DistanceMatrix D(我似乎无法正确构造,我希望它是双D [V] [V]的双方阵,V = num_vertices(g),但它让我回来了我没有正确调用该函数),但也是沿着该路径获取的节点列表,类似于wiki文章对Floyd's Algorithm路径重建的内容。我是否应该尝试为这个问题推出自己的算法,因为我无法弄清楚功能是否存在(更不用说如何进行函数调用)? BGL的文档与实现一样钝,所以我没有任何现代的例子可以继续。