10000
个顶点和约5000000
条边,我将它们作为边列表读入Python。在我的工作中,我试图为每一条边构建一个函数,该函数依赖于每条边上相邻顶点之间的距离。假设我们有两个相连的顶点v1、v2表示一条边,对于v1,有n1个连接的邻居,对于v2,也有n2个连接的邻居。为了构建我的函数,我需要获取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(通过将路径长度固定为 3)需要大约 13 分钟,并且还需要另外 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
是(直接)相连的,它们之间的距离是多少?如何获得零距离? - wwiiVx==Vy
。 - Joelare_connected
函数(尽管它是最好的),但我还没有找到替代方案。 - Noah16