有没有找到网络中最长的最短路径的最佳算法?


13

我有大量的线性网络,我想找到每个网络沿网络彼此距离最远的两端(在下图中,它是D到K)。解决此问题的强力解决方案是为每对起点计算沿网络的最短路径,但是我有数百个网络,其中有数千个端点,因此计算每个可能的路径都非常繁重。

有没有一种在不使用蛮力的情况下进行计算的最佳方法?我可以根据一些聪明的规则排除一些要点吗?

如何有效地找到红色道路?

编辑:为了澄清我的问题,我添加了@Alex Tereshenkov提到的最长路径的图示。黑色路径是最长路径算法(最长路径,不重复任何顶点)的结果。以我为例,假设您从任何字母进入网络,并且需要尽可能快地驶向另一个字母。哪两个字母最难加入? 在此处输入图片说明


疯狂的油漆技能!
亚当

Answers:


6

我认为您可能正在寻找网络的图形直径。关于stackexchange的几个问题都提到了该主题,例如:

大多数算法建议先计算“所有对最短路径”,然后选择最长的路径,但是我发现了Koushik Narayanan的博客文章,其中提出了一种可能更理想的替代方法(我没有检查),遍历每个顶点并找到最远的一对:

我们可以从顶点V1计算出路径,以使其成为V1和其中一个顶点之间的最短路径,并且比任何其他顶点之间的最短路径长。有关算法,请参见这篇文章。然后,我们可以遍历每个顶点并找到以每个顶点为根的最长路径。一旦有了所有最长的最短路径的列表,我们就可以找到具有最大值的那个并返回它。


谢谢,图的直径恰好是我要寻找的,在我的情况下,伪diamter启发式方法起作用。我刚刚在那里学习了新单词!
radouxju

7

根据维基百科页面最长路径问题,此问题

...是NP难解的,这意味着 除非P = NP,否则它无法在多项式时间内求解任意图。还已知更强的硬度结果,表明难以估计。但是,它具有用于有向无环图的线性时间解,在解决调度问题的关键路径方面具有重要的应用。

如果您使用(或可以将图形表示为DAG),那么networkxPython包将允许您对其进行计算。寻找功能dag_longest_path

除非我丢失了某些内容,否则您将需要计算图节点之间的长度并对它们进行排序,但不幸的是,它们只能在线性时间内工作,因此没有有效的算法。


答案的thnks,由于信息已经为+1。但是,我正在寻找网络中最长的最短路径(在我的示例中,不绕弯B或H)。因此,即使暗示“强力”可能是唯一的解决方案,您的解决方案也不是我所要的。
radouxju

@radouxju,啊,我明白了。好吧,让我们看看基因是否会注意到这一点,他在图形方面有很多经验,也许他有一些聪明的主意。
Alex Tereshenkov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.