【发布时间】:2019-09-05 12:29:04
【问题描述】:
我之前问过一个类似的问题,但我认为还不清楚。我有一个10000 顶点和5000000 边的无向和未加权图,我将它们作为边列表读入python。
在我的工作中,我试图从每条边构建一个函数,该函数取决于每条边上相邻顶点之间的距离。假设我们有两个连接的顶点 v1,v2 表示一条边,对于 v1 有 n1 个连接的邻居,也有 n2 个连接到 v2 的邻居。为了构建我的函数,我需要获取 n1 和 n2 邻居之间的距离。对于图中的所有边,函数如下所示:
e_1*d_1 +e_1*d_2 +...+e_1*d_n+...e_m*d_1+...e_m*d_n
其中 n 是每条边上两个顶点的邻居数,d_n 是顶点之间的距离,m 是图中的边数,e_m 是该图中的最后一条边。
通常,如果我们想获得最短路径长度,我们会考虑像 Dijkstra 算法或 Bfs 这样的图遍历,尤其是我的图未加权。我使用了许多已经编写在包中的函数,例如 networkx 和 igraph,但是这些函数效率不高,并且在我的图表上花费了大量时间。例如函数 shortest_paths_dijkstra() 需要大约 6.9 小时才能获得距离,因为我需要多次调用它。此外,函数all_pairs_shortest_path _length 需要大约 13 分钟(通过将称为截止的路径长度固定为 3)和另外 16 分钟来调用图中每对邻居的距离!
正如问题中所写,我们需要获取 v1、v2 的邻居之间的距离,因此最大距离为 3,因为 v1、v2 是连接的。我觉得有一个更聪明的解决方案来降低时间复杂度,方法是使用路径的可能距离(在我的情况下)是0, 1, 2, 3,因为所以我不需要遍历整个图之间的每条路径源头和目标!只是我正在寻找一种聪明的方法来获取邻居之间的距离(不是任意两个随机顶点)!
我写了这段代码,但它需要很长时间,大约 54 分钟,所以效率也不高!
neighbor1 = {}
neighbor2 = {}
distance = {}
for i in list(edges.values()):
list_of_distances = []
neighbor1 = tuple(graph.vs[graph.neighbors(i[0], mode="all")]["name"])
neighbor2 = tuple(graph.vs[graph.neighbors(i[1], mode="all")]["name"])
for n2 in neighbor2:
for n1 in neighbor1:
if n1 == n2:
list_of_distances.append(0)
elif (n1 != n2) and not graph.are_connected(n1,n2):
if ( graph.are_connected(i[0],n2) ) or ( graph.are_connected(n1,i[1]) ):
list_of_distances.append(2)
elif ( not graph.are_connected(i[0],n2) ) or ( not graph.are_connected(n1,i[1]) ):
list_of_distances.append(3)
else:
list_of_distances.append(1)
distance[tuple(i)] = list_of_distances
我想知道是否有另一种不需要大量内存和时间来获得这些距离的方法,或者是否可以修改一个像 Bfs 或 Dijkstra 这样的图形遍历方法,所以没有必要每次迭代都搜索整个图,并在本地做一些事情(如果可以说的话)。感谢您的帮助
【问题讨论】:
-
定义你要的函数:参数,返回值。
-
如果
Vx和Vy(直接)连接它们之间的距离是多少?您如何获得零距离? -
@wwii
Vx==Vy. -
@wwii 表示图中边的任意两个顶点之间的距离固定为 1,因为它们是连接的。事实上,我不计算这些顶点之间的距离,而是我需要得到它们的邻居之间的距离,所以如果两个顶点都有一个共同的邻居,那么距离就是 0
-
你的功能有点不清楚,e_1之类的值是多少?也许添加你用来计算它的代码会有所帮助
标签: python algorithm networkx igraph shortest-path