在区间图中找到两个节点之间最有效的路径

时间:2015-02-04 23:46:32

标签: algorithm graph dynamic-programming graph-theory networkx

我有区间数据:

A = (0,50)
B = (20,500)
C = (80,420)
....

并意识到这个数据与the interval graph

有关联的图表

enter image description here

我想找到从A到G的最有效路径(假设我知道所有正顶点权重,wa,wb,wc ......)。我需要从A开始并转到G,因此必须在这些点之间绑定最小生成树。我们的应用中的一个限制因素是从A开始到G结束的间隔必须完全覆盖(无间隙)。我正在查看networkX's minspanning tree method,并且不明白如何指定A和G必须是起点和终点。

我想到的其他一些问题是:

  1. 由于这个问题是NP难的,如果节点数量很高,我是否应该费心寻找最小生成树?有多少节点会太多?

  2. 请注意,间隔F具有唯一的区域。换句话说,为了完全覆盖区间A-G,一个HAS要经过F.因此,我的最小生成树可能只应该连接A-F,而不是A-G。有没有一种标准的方法,给定一个更大的图,找到其间隔不包含唯一补丁的所有子图?换句话说,由于所有路径都必须通过F才能到达G,因此A-F是感兴趣的最小跨越路径,而不是A-G。如何在不经过手动检查的情况下以这种方式减少图形?

  3. Becasue我必须从A-G出发,我永远不会倒退或采取循环路径。例如,我永远不会去A-B-A。跨树是否包含这个?这是否使我的图表定向?考虑点C:从C可以转到D,E或F,但永远不会回到A(对于我们的用例)。这对于图的方向性意味着什么?

  4. 对不起新手Q,对大部分内容都不熟悉。

2 个答案:

答案 0 :(得分:2)

如果必须以有效的方式从A到G,则不需要寻找最小生成树算法。一个简单的最短路径算法就足够了。您只需调整图形以将权重放在边缘而不是节点。但这只是将节点的权重设置为传入边缘的问题。

此外,最短路径和最小生成树问题都不是NP难题。对于所有这些问题,存在已知的多项式算法。在特殊情况下,最短路径可以通过Dijkstra's algorithm来解决(如果您的图形没有负边缘,这似乎是真的),最小生成树可以通过Prim'sKruskal's algorithm来解决

最后,根据定义,任何树都没有循环。

答案 1 :(得分:2)

如另一个答案所述,Dijkstra的算法就是解决方案。没有提到的是如何在networkx中实现该解决方案。这里是。这很简单:

import networkx as nx
my_graph = nx.Graph()
my_graph.add_edges_from([('A','B'),('B','C'),('A','C'),('C','D'),('A','D'),('C','E'),('D','E'),('D','F'),('F','G')]) 
#graph is now defined.

shortestpath = nx.dijkstra_path(my_graph, 'A', 'G') #optional weight argument here.
shortestpath
> ['A', 'D', 'F', 'G']

通常,有关如何在networkx中执行最短路径算法(以及其中有许多变体)的更多文档是here

请注意,如果您在节点上有权重并且想要最小化路径中节点的总和,那么您要做的是在边上放置权重,以便(uv的权重)是(w[u]+w[v])/2

然后使用可选参数运行nx.dijkstra_path告诉networkx在哪里找到边的权重。整个路径的权重将等于中间权重的总和,加上端节点的值的一半。然后,您可以更正结束节点权重。