Проблема с my для l oop, поиск кратчайшего пути к подпути с использованием networkx - PullRequest
0 голосов
/ 20 апреля 2020

Итак, я пытался создать код, чтобы найти кратчайший путь к подпути с использованием 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 Так что я надеялся, что вы мне поможете, или если есть другой способ сделать то, что я пытаюсь достичь, любая помощь будет оценена, спасибо!

1 Ответ

1 голос
/ 20 апреля 2020

Вы можете выполнять итерацию по соответствующим парам (график, путь), используя функцию zip .

Пример:

for g, path in zip(graphs, paths):
    if len(path) <= 3:
        aux.append(nx.shortest_path_length(g, path[0], path[0], weight = 'weight'))
    else:
         aux.append(nx.shortest_path_length(g, path[1], path[-2], weight = 'weight'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...