相关网络实施

时间:2013-02-22 20:36:28

标签: algorithm boost graph graph-algorithm minimum-spanning-tree

我一直在研究我的图形/网络问题,我想我终于知道自己想做什么了。现在我正在进入实现,我在决定使用哪些库时遇到问题。图表本身非常简单,每个节点都用一个字符串标记,每个节点都是两个节点(变量)之间的概率/相关系数,并且是无向的。我想在图表上执行的操作是:

  • 插入新节点/边缘(快速)
  • 找到所有对最短(1 /概率)路径,并记住路径中的节点 - 可能是Johnson的算法
  • 为k个特定顶点构造最小权重Steiner树
    • 使用Johnson的算法构建最短路径
    • 迭代路径p中的当前节点,找到到k中剩余节点的最短路径
  • 查看图表的平均程度
  • 评估节点的中介性
  • 获取聚类系数
  • 查找图表的模块性

对于其中许多,我想将结果与Erdos-Renyi模型进行比较,并将其作为零假设进行测试。此外,能够通过马尔可夫场使用统计力学定义将是有帮助的,因为那时我可以计算两个不相同的节点之间的相关性,并询问有关熵等的图形问题。所以一个好的映射在某种马尔可夫领域的图书馆也很有用。

目前问题的症结在于我正在努力寻找一个可以使用的C ++库。我已经看过R,但是我想要的东西会更强大,更快。我正在考虑的三个图书馆是:

  • LEMON
    • 易于使用和安装
    • 直截了当的文件
    • 有我想要的一些功能
    • 通过阅读文本文件动态创建图表,并确保没有重复的节点,这是我无法弄清楚的噩梦
  • 提升图表库
    • 对象的难以处理的,神秘的定义以及如何使用它们
    • 文档与代码的作用不一致,必然
    • 是否有我想要的许多算法,以及从文本文件创建图表的简单方法
  • MultiThreaded Graph Library
    • 并行已经合并
    • 比BGL更容易阅读
    • 功能不多
    • 仍然是奥术

在未来的路上,我设想生活在分布式网络上的图形,具有分布式存储(hadoop或其他东西)。我怀疑整个图形不适合内存,因此我将不得不提出一个缓存场景来查看图形的各个部分。

人们会为我描述的问题建议哪些图书馆?使用BGL并编写自己的函数会更好吗?那么多线程版本呢?是否有任何图书馆更适合我想做的工作,尤其是我想要计算的数量?

Original Post

谢谢!

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的文档与实现一样钝,所以我没有任何现代的例子可以继续。

0 个答案:

没有答案