我有区间数据:
A = (0,50)
B = (20,500)
C = (80,420)
....
并意识到这个数据与the interval graph
有关联的图表
我想找到从A到G的最有效路径(假设我知道所有正顶点权重,wa,wb,wc ......)。我需要从A开始并转到G,因此必须在这些点之间绑定最小生成树。我们的应用中的一个限制因素是从A开始到G结束的间隔必须完全覆盖(无间隙)。我正在查看networkX's minspanning tree method,并且不明白如何指定A和G必须是起点和终点。
我想到的其他一些问题是:
由于这个问题是NP难的,如果节点数量很高,我是否应该费心寻找最小生成树?有多少节点会太多?
请注意,间隔F具有唯一的区域。换句话说,为了完全覆盖区间A-G,一个HAS要经过F.因此,我的最小生成树可能只应该连接A-F,而不是A-G。有没有一种标准的方法,给定一个更大的图,找到其间隔不包含唯一补丁的所有子图?换句话说,由于所有路径都必须通过F才能到达G,因此A-F是感兴趣的最小跨越路径,而不是A-G。如何在不经过手动检查的情况下以这种方式减少图形?
Becasue我必须从A-G出发,我永远不会倒退或采取循环路径。例如,我永远不会去A-B-A。跨树是否包含这个?这是否使我的图表定向?考虑点C:从C可以转到D,E或F,但永远不会回到A(对于我们的用例)。这对于图的方向性意味着什么?
对不起新手Q,对大部分内容都不熟悉。
答案 0 :(得分:2)
如果必须以有效的方式从A到G,则不需要寻找最小生成树算法。一个简单的最短路径算法就足够了。您只需调整图形以将权重放在边缘而不是节点。但这只是将节点的权重设置为传入边缘的问题。
此外,最短路径和最小生成树问题都不是NP难题。对于所有这些问题,存在已知的多项式算法。在特殊情况下,最短路径可以通过Dijkstra's algorithm来解决(如果您的图形没有负边缘,这似乎是真的),最小生成树可以通过Prim's或Kruskal'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。
请注意,如果您在节点上有权重并且想要最小化路径中节点的总和,那么您要做的是在边上放置权重,以便(u
,v
的权重)是(w[u]+w[v])/2
。
然后使用可选参数运行nx.dijkstra_path
告诉networkx在哪里找到边的权重。整个路径的权重将等于中间权重的总和,加上端节点的值的一半。然后,您可以更正结束节点权重。