Бесконечная длина пути графа для networkx

#python #numpy #networkx

#python #numpy #networkx

Вопрос:

Я создаю график из матрицы adj, вот мой код, я пытаюсь сначала создать график, затем добавить вес к этому графику, как показано здесь

 for element in elements:
        senMatrix[int(element.matrix_row)-1,int(element.matrix_column)-1]=1

    G=nx.from_numpy_matrix(senMatrix)

    for element in elements:
        G[int(element.matrix_row)-1][int(element.matrix_column)-1]['weight']=int(element.value)
    print str(G.nodes())
    print str(G.edges())

    avgClusterNumber=nx.average_clustering(G,weight='weight')
    clusterList=nx.clustering(G,weight='weight')
    graphDiameter=nx.diameter(G)
  

Первые две функции выполняются без проблем, однако последняя функция diameter выдает проблему с бесконечной длиной пути, что заставляет меня думать, что нет ребер, узлов или чего-то еще.

Ошибка, видимая здесь

 networkx.exception.NetworkXError: Graph not connected: infinite path length
  

Когда я распечатываю их, я получаю это

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105]
[(0, 1), (0, 3), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 11), (0, 12), (0, 13), (0, 14), (0, 17), (0, 18), (0, 19), (0, 20), (0, 23), (0, 25), (0, 26), (0, 27), (0, 28), (0, 32), (0, 33), (0, 35), (0, 36), (0, 37), (0, 38), (0, 39), (0, 43), (0, 46), (0, 47), (0, 48), (0, 50), (0, 52), (0, 55), (0, 56), (0, 57), (0, 59), (0, 60), (0, 61), (0, 63), (0, 65), (0, 66), (0, 69), (0, 70), (0, 71), (0, 72), (0, 77), (0, 79), (0, 80), (0, 82), (0, 85), (0, 86), (0, 88), (0, 90), (0, 92), (0, 96), (0, 97), (0, 98), (0, 99), (0, 100), (0, 101), (0, 104), (0, 105), (1, 2), (1, 3), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (1, 11), (1, 12), (1, 13), (1, 14), (1, 15), (1, 16), (1, 17), (1, 18), (1, 19), (1, 20), (1, 21), (1, 22), (1, 23), (1, 24), (1, 25), (1, 26), (1, 27), (1, 28), (1, 29), (1, 30), (1, 31), (1, 33), (1, 34), (1, 35), (1, 36), (1, 37), (1, 38), (1, 39), (1, 40), (1, 41), (1, 42), (1, 44), (1, 46), (1, 47), (1, 49), (1, 51), (1, 52), (1, 53), (1, 54), (1, 55), (1, 56), (1, 57), (1, 58), (1, 59), (1, 60), (1, 61), (1, 62), (1, 63), (1, 64), (1, 65), (1, 66), (1, 67), (1, 68), (1, 69), (1, 70), (1, 71), (1, 72), (1, 74), (1, 75), (1, 76), (1, 77), (1, 78), (1, 79), (1, 80), (1, 81), (1, 83), (1, 85), (1, 86), (1, 87), (1, 88), (1, 90), (1, 91), (1, 95), (1, 96), (1, 97), (1, 98), (1, 99), (1, 101), (1, 102), (1, 103), (1, 104), (1, 105), (2, 66), (2, 6), (2, 7), (2, 40), (2, 78), (2, 79), (2, 18), (2, 83), (2, 87), (2, 56), (2, 25), (2, 27), (2, 92), (2, 31), (3, 6), (3, 7), (3, 8), (3, 9), (3, 11), (3, 12), (3, 15), (3, 16), (3, 21), (3, 22), (3, 25), (3, 26), (3, 27), (3, 28), (3, 29), (3, 30), (3, 32), (3, 40), (3, 41), (3, 42), (3, 47), (3, 51), (3, 52), (3, 53), (3, 55), (3, 59), (3, 60), (3, 62), (3, 63), (3, 66), (3, 67), (3, 68), (3, 69), (3, 70),..
  

который выводит узлы, а затем ребра, очевидно, я ограничил его, чтобы показать идею.

Итак, я полагаю, мой вопрос в том, что я не уверен, почему это проблема. Кто-нибудь знает, как это исправить?
Я, очевидно, не думаю об этом в правильном свете.

Комментарии:

1. Показать полное сообщение об ошибке. Есть номер строки с проблемой. Отметьте эту строку в своем коде.

Ответ №1:

попробуйте

 nx.is_connected(G)
  

если он возвращает False, то вы можете разделить график на компоненты и найти диаметр для каждого компонента, используя

 connected_components(G)
  

Комментарии:

1. Теоретически можно было бы вычислить «эффективный диаметр», т. е. относящийся к 90-му процентилю кратчайших путей: repository.cmu.edu/cgi /…