Итак, я пытался создать код, чтобы найти кратчайший путь к подпути с использованием Networkx, в основном мой код состоит в том, что для создания графиков требуется трехмерный массив, а затем сохранить их в списке, чтобы я мог использовать этот список для поиска the shortest path
и the shortest path length
с использованием networkx.
После этого, основываясь на информации в списках, я хочу найти кратчайшую длину пути подпути внутри графа, если len
пути меньше, чем 3, то кратчайший путь находится между одним и тем же узлом-источником и целевым узлом (поэтому длина будет равна нулю), и если len
больше этого значения, то он должен найти shortest path length
между вторым узлом в пути и предпоследним узлом (что-то вроде «центра» пути) мой код ниже
import networkx as nx
import numpy as np
arr= np.array([[[ 0., 191., 16., 17., 15., 18., 18.],
[ 0., 0., 0., 0., 0., 0., 0.],
[ 0., 141., 0., 0., 0., 18., 0.],
[ 0., 138., 0., 0., 0., 0., 19.],
[ 0., 80., 0., 0., 0., 0., 15.],
[ 0., 130., 11., 0., 0., 0., 19.],
[ 0., 135., 0., 12., 16., 12., 0.]],
[[ 0., 156., 17., 13., 19., 10., 11.],
[ 0., 0., 0., 0., 0., 0., 0.],
[ 0., 21., 0., 0., 0., 6., 0.],
[ 0., 147., 0., 0., 0., 0., 4.],
[ 0., 143., 0., 0., 0., 0., 6.],
[ 0., 69., 4., 0., 0., 0., 7.],
[ 0., 87., 0., 1., 5., 9., 0.]],
[[ 0., 161., 18., 16., 13., 13., 17.],
[ 0., 0., 0., 0., 0., 0., 0.],
[ 0., 138., 0., 0., 0., 21., 0.],
[ 0., 64., 0., 0., 0., 0., 29.],
[ 0., 23., 0., 0., 0., 0., 29.],
[ 0., 2., 24., 0., 0., 0., 27.],
[ 0., 61., 0., 24., 29., 26., 0.]],
[[ 0., 163., 12., 13., 17., 19., 13.],
[ 0., 0., 0., 0., 0., 0., 0.],
[ 0., 142., 0., 0., 0., 35., 0.],
[ 0., 122., 0., 0., 0., 0., 31.],
[ 0., 72., 0., 0., 0., 0., 36.],
[ 0., 50., 39., 0., 0., 0., 31.],
[ 0., 4., 0., 38., 39., 35., 0.]],
[[ 0., 180., 17., 19., 13., 18., 15.],
[ 0., 0., 0., 0., 0., 0., 0.],
[ 0., 44., 0., 0., 0., 46., 0.],
[ 0., 27., 0., 0., 0., 0., 47.],
[ 0., 81., 0., 0., 0., 0., 45.],
[ 0., 116., 48., 0., 0., 0., 45.],
[ 0., 16., 0., 42., 49., 49., 0.]]])
graphs= []
paths = []
pathlenght = []
aux = []
for i in arr :
graphs.append(nx.from_numpy_array(i, create_using = nx.DiGraph)) #List of graphs created by the 3D array
for j in graphs:
paths.append(nx.shortest_path(j, 0, 1, weight = 'weight')) #Shortest paths of every graph
pathlenght.append(nx.shortest_path_length(j, 0, 1, weight = 'weight')) #Shortest path length of every graphs
for i in graphs:
for j in paths:
if len(j) <= 3:
aux.append(nx.shortest_path_length(i, j[0], j[0], weight = 'weight'))
else:
aux.append(nx.shortest_path_length(i, j[1], j[-2], weight = 'weight'))
print(paths) # [[0, 4, 1], [0, 5, 2, 1], [0, 5, 1], [0, 6, 1], [0, 6, 1]]
print(pathlenght) # [95.0, 35.0, 15.0, 17.0, 31.0]
print(aux) #[ 0. 11. 0. 0. 0. 0. 4. 0. 0. 0. 0. 24. 0. 0. 0. 0. 39. 0. 0. 0. 0. 48. 0. 0. 0.] shape = (25,)
Пути и длина пути в порядке, но в дополнительном list Я ожидал, что результат будет
#aux = [0, 4.0, 0, 0, 0]
Я знаю, что проблема с двойным for-loop
, так как есть 5 графиков и 5 путей, список aux имеет 25 элементов, но я жду Не используйте путь в соответствии с его графиком (путь 1 с графиком 1, путь 2 с графиком 2 и т. д. и т. д.), поэтому вывод aux
будет таким же, как указано выше. Я вроде как использую for-loop
Так что я надеялся, что вы мне поможете, или если есть другой способ сделать то, что я пытаюсь достичь, любая помощь будет оценена, спасибо!