问题标签 [boost-graph]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2798 浏览

c++ - 在 boost::graph 中对 EdgeList 进行排序

我想对 boost::graph 的边缘列表进行排序,定义如下:

添加顶点和边后,如何对边列表进行排序。首先获得最高权重的优势?

我知道可以使用

对于向量,但它不适用于 std::list。

0 投票
2 回答
1861 浏览

c++ - Boost Subgraph 和 Bundled 属性

我正在使用捆绑属性和 adjacency_list 并想使用 subgraph 类。

property<edge_index_t,int,Edge>部分是必需的,因为子图需要edge_index_t比较两条边。

现在我的问题是如何使用子图中的捆绑属性添加边缘?在没有property<edge_index_t,int,Edge>我添加边的普通图中,如下所示:

但这不适用于 Subgraph。

希望有人知道这个问题的解决方案。

谢谢

0 投票
1 回答
829 浏览

c++ - Boost::graph Dijkstra : 最初填充队列

我正在使用boost::graph它的 Dijkstra 实现。

我想计算从一组顶点到另一组顶点的最短路径。我不想计算这些集合之间的所有可能路径。

这个想法如下:我在一座建筑物中,各个街道都有入口。所以我可以在任何一条街道上开始我的旅程。但我只对最短的一个感兴趣。

如果我使用自己的 Dijkstra 算法实现,我会执行以下操作:

  • 对于每个起始节点,距离映射为 0
  • 将起始节点添加到优先级队列中。

虽然使用 将距离图设置为 0 很容易boost::dijkstra_shortest_paths_no_init,但我无法弄清楚如何将节点添加到优先级队列中。我查看了源代码,这似乎几乎是不可能的。所以我正在考虑定义我自己的组合函子,如果我到达一个起始节点,它将返回 0 距离,但它看起来相当难看。

我可以创建一个虚拟节点,并将虚拟节点的边添加到起始节点。但是,这会触发一些我想避免的并发访问问题。

我是否错过了 boost 库中的一个可能性,或者有人知道一个聪明的解决方法。我也在考虑修补 boost 以允许对优先级队列进行自定义初始化。

0 投票
4 回答
322 浏览

c - 当函数想要传递 FILE * 时,避免使用临时文件

我目前使用 C++ 使用 boost::graph 进行一些与图相关的计算。boost::graph 可以将其图形输出为点文件,我使用 std::stringstream 来捕获输出点文件。因此点文件的内容驻留在内存中。

我想使用点文件来可视化图形(尽可能快)。因此,我想生成点文件,生成 svg 文件并将其打印到某个画布上。我想避免为此使用临时文件,因为图形应该很小并且内存仍然可用。

然而,graphviz libgraph 只有这个功能extern Agraph_t *agread(FILE *);,我能想象到使这个工作的唯一方法是在文件句柄中破解,struct __FILE这实际上是不可移植的。

您如何让库将您的内存内容作为 Unix/linux 中的文件读取?

我刚刚发现 GraphViz 的 libcgraph 允许在此处输入重载版本,但到目前为止,文档并没有将我指向一些有用的地方。

0 投票
1 回答
2296 浏览

c++ - 如何使用 boostlib 计算邻接列表的介数?

我正在尝试编写一个简单的程序来使用 boostlib 中的brandes_betweenness_centrality 计算中间值。我被困在获得输出(CentralityMap)。我一直在阅读文档,但我不知道如何将它们放在一起。

这是我的简单代码:

据我了解,我需要定义将写入结果的中心图。它与读/写属性映射有关,但我不知道如何定义一个。

最终我需要输出介数。

0 投票
2 回答
1097 浏览

c++ - 与 vecS 不同的 VertexList 的 adjacency_list

我有两个包含一些字段的结构:struct MyNodeData 和 struct MyEdgeData。当我使用 VertexList 作为 vecS 创建图形时,访问顶点的描述符等没有问题。例如:

但我通常需要从我的图中添加/删除边和顶点。所以我想使用 setS 或 listS 作为 VertexList,而不是 vecS,因为使用 vecS,当我们删除其中一个索引时,索引会失效!问题是,如果我将 VertexList 定义为 setS 或 listS,我将无法像以前那样浏览顶点/边列表并访问那里的描述符!

简而言之,我的问题是:由于使用 listS 或 setS 作为顶点容器的 adjacency_list 不会自动提供此 vertex_id 属性,如何将其添加到上面的代码中?

0 投票
1 回答
2049 浏览

c++ - Boost Graph Library:捆绑属性和跨边迭代

只是想了解一下 Boost Graph Library,我有几个问题。我正在编写一些代码,它是围绕 BGL 图的包装类。这个想法是我可以随心所欲地操纵图形,然后调用包装器方法以 GEXF (XML) 格式输出图形。

我的代码是这样的:

以下是我的问题:

  1. 使用捆绑属性时,可以访问 vertex_index,但无法访问 edge_index。如何访问边缘索引?

  2. 在上面的代码中,我想保持 GEXF 类的通用性,但是当我尝试声明Graph::edge_iterator e, e_end;上面的代码有效时遇到了问题,但它使用的是具体类型。我应该如何一般地声明 edge_iterator?

0 投票
1 回答
536 浏览

c++ - 升压图的外部属性表现得很奇怪?

我正在使用 Boost::Graph 迈出第一步,并遇到了一些(对我而言)意想不到的行为。

我想要的是拥有一系列edge_weight属性(数量仅在运行时知道),并使用满足某些约束的所有权重中的最小值。首先,typedef声明:

我将图形初始化如下:

INT_MAX一遍又一遍地输出。似乎 (external)weightMaps[j]都相同并且等于 internal property fastestLinkWeight。但为什么?如何确保使用单独的地图?

0 投票
2 回答
3072 浏览

c++ - 使用 Boost Graph Library 进行路径查找(在网格中)

我正在将我的 Google AI Challenge 机器人从 Python 重写为 C++,我想使用 boost 的图形库来处理路径查找,而不是像以前在 Python 中那样滚动我自己的图形和搜索代码。

该地图是一个简单的方形网格,围绕着边缘。

我以前没有使用过 boost 或 C++(我确实非常了解 C),而且我发现 boost graph 文档真的很难理解,所以我需要一点帮助。

我遇到问题的特定文档:

这是工作 python 代码的片段:

然后我shortest_path(self.graph, loc, dest)稍后会使用(使用曼哈顿启发式的*搜索)来获取包含到其他地方的最短路径的列表。在 C++ 中,我想要类似的东西(具有最短路径的向量)。这是我到目前为止的代码(我只需要帮助让它在没有任何障碍的基本网格上工作,剩下的我可以做):

0 投票
1 回答
2723 浏览

performance - Boost Graph Library:大图的边插入速度慢

我正在尝试使用实现“智能剪刀”进行交互式图像分割。因此,我必须从每个顶点代表一个像素的图像创建一个有向图。然后每个顶点通过两条边连接到它的每个邻居:一条出边和一条入边。这是因为边缘 (a,b) 的成本可能与 (b,a) 的成本不同。我正在使用大小为 512*512 像素的图像,因此我需要创建一个具有 262144 个顶点和 2091012 个边的图形。目前,我正在使用下图:

我正在使用一个额外的类Graph(对不起,没有灵感的命名)来处理图形:

};

Creating a new graph with 262144 vertices is pretty fast but the insertion of the edges tooks up to 10 seconds which is way too slow for the desired application. Right now, I'm inserting the edges the following way:

Is there anything I can do do improve the speed of the programm? I'm using Microsoft Visual C++ 2010 Express in release mode with optimization (as recommended by Boost). I thought I could use a listS container for the vertices or edges but the vertices are no problem and if I use listS for the edges, it gets even slower.