图上的聚类(使用Boost图库)

时间:2015-06-09 09:56:21

标签: c++ c++11 graph graph-algorithm boost-graph

在C ++项目中,我们正在尝试一个重要的Boost Graph流量相关的功能,以便为两个节点之间的最短路径启动Dijkstra的几个模拟。

该图有18 000个顶点和40 000个边。 加载图表需要大约200毫秒,而Dijkstra运行50毫秒。

但是时间开始成为一个问题,所以我们希望降低这些时间。我们正在考虑几个选项:

  • 使用Dijkstra算法的启发式算法:

    • 双向Dijkstra
    • A * search
  • 预处理图形,如聚类操作,减少加载的节点和顶点的数量,从而减少加载时间:

    • 分层聚类
    • 马尔可夫群算法

所以问题分为两部分:

  • 实施图表聚类的最佳/最简单方法是什么? (如果它正在使用boost库,那么对我们来说实现起来会更容易)。有了引用,可以使用的代码示例?

  • 在这种情况下使用的最佳Dijsktra算法是什么?

如果您有关于这两个问题的任何信息,我们将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:4)

<强>聚类

在图表中聚合节点的方法有很多种。节点表示的任何距离度量都可用于聚类。除betweenness clustering等少数有限情况外,Boost没有开箱即用的群集支持。

Micans软件包为markov clustering提供了一个非常简单快捷的程序。这可以从命令行轻松调用。马尔可夫聚类(MCL)通过重复矩阵​​乘法来模拟随机游走。如果将图形更改为矩阵表示,可能并不难实现。

如果图表没有变化,则可以离线执行群集。 R是一个更好的群集环境,因为many methods已经实施,但您必须提供距离值。

您需要群集吗?

群集会帮助您进行最短路径计算吗?我的直觉(经常是错误的)让我相信聚类会导致只有局部的最优。图表子集的最佳解决方案并不能保证它对全局解决方案有用。交通问题让我想到了流量算法,例如boykov_kolmogorov_max_flow

其他建议

我不确定你的设置。如果每个进程运行1个模拟,那么加载时间可能是个问题。您可以尝试每个进程运行多个模拟,这样您的加载时间就不会经常重复。

例如,目前您有200毫秒的负载和50毫秒的Dijkstra。如果你背靠背跑两次,你有两次跑500ms。

您可以在200ms内加载图形,然后在同一个过程中背靠背运行6次模拟。这样你就有200ms的负载,然后是50ms x 6的模拟。即使没有并行处理,这也可以使您可以运行的模拟数量增加3倍。