Ранее я задавал похожий вопрос, но, как мне кажется, он был неясен.У меня есть неориентированный и невзвешенный граф из 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 - это последнее ребро в этом графе.
Обычно, если мы хотим получить кратчайшую длину пути, мы думаем о обходе графа, как алгоритм Дейкстры или 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, так что нет необходимости искать весь граф каждую итерацию и просто делать что-то локальное (если это можно сказать).Спасибо за любую помощь