在C ++项目中,我们正在尝试一个重要的Boost Graph流量相关的功能,以便为两个节点之间的最短路径启动Dijkstra的几个模拟。
该图有18 000个顶点和40 000个边。 加载图表需要大约200毫秒,而Dijkstra运行50毫秒。
但是时间开始成为一个问题,所以我们希望降低这些时间。我们正在考虑几个选项:
使用Dijkstra算法的启发式算法:
预处理图形,如聚类操作,减少加载的节点和顶点的数量,从而减少加载时间:
所以问题分为两部分:
实施图表聚类的最佳/最简单方法是什么? (如果它正在使用boost库,那么对我们来说实现起来会更容易)。有了引用,可以使用的代码示例?
在这种情况下使用的最佳Dijsktra算法是什么?
如果您有关于这两个问题的任何信息,我们将不胜感激。
谢谢。
答案 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倍。