Ваш график не задан. Это основная причина проблемы.
При запуске первой части кода:
import networkx as nx
from pylab import *
g=nx.Graph()
g.add_edge('a','b', weight=3)
g.add_edge('a','c', weight=2)
g.add_edge('b','c', weight=7)
w=nx.get_edge_attributes(g, 'weight')
Вы делаете w
в Словаре, каждый из которых ключей является одним из краев. Но порядок узлов внутри ребра не имеет значения. Итак, давайте посмотрим на w
:
w
> {('a', 'b'): 3, ('a', 'c'): 2, ('c', 'b'): 7}
Примечание --- вы определили вес края для ('b', 'c')
. Но в w
он хранится с ключом ('c','b')
.
Итак, когда вы определяете w[('c','b')]
, вы переписываете это. Этого не произошло для других ребер, потому что networkx случайным образом случалось возвращать их в том порядке, в котором вы ожидали.
Я думаю, вы пытаетесь определить w
так, чтобы у вас был вес одинаковым независимо от порядка ребер, которые вы проверяете.
Это, вероятно, лучше использовать встроенную NetworkX команду, чтобы получить вес и не использовать w
вообще:
g.get_edge_data('a','b')['weight']
Но если вы действительно хотите, чтобы ваш w
, один из способов сделать это будет делать петлю через ключей w
в
for edge in w:
w[([edge[1],edge[0])] = w[edge]
или вы можете определить функцию
def f(edge,w):
if edge in w:
return w[edge]
else:
return w[(edge[1],edge[0])
Немного больше объяснений о том, что происходит:
Вы не можете предположить, что networkx вернет вам края неориентированного графа с тем же порядком, что и им. Это неориентированный граф, поэтому все, что предполагает некоторое неявное направление к краям, будет запущено.
В основном это потому, что networkx хранит узлы в структуре словаря. Из-за этого вы не можете предположить, что он возвращает узлы в любом порядке. Поэтому, в частности, в вашем случае, когда networkx ищет свои ребра, он проходит через узлы в некотором порядке. В этом случае он достигает 'c'
, прежде чем он доберется до 'b'
. Поэтому он получает преимущество с c
. Когда он достигает b
, он знает, что у него уже есть этот край, поэтому он его не выпускает.
Я не могу воспроизвести вашу ошибку, но вместо этого я получаю '{('b', 'c'): 7, ('b', 'a'): 3, ('c', 'a') : 2, ('c', 'b'): 7} 'поэтому только последнее назначение сохраняется – EdChum
Я отправил ответ. Я не знаю, почему так происходит, но я получил ту же ошибку, что и вы. И я немного поиграл и заметил это поведение. – ProgrammingIsAwsome
Причина в том, что для неориентированных графов, когда networkx возвращает ребра, вы должны считать, что порядок узлов в каждом ребре произволен, так же, как при просмотре ключей dict, вы должны предположить, что они находятся в произвольном порядке. Точный способ появления этой проблемы будет зависеть от реализации. Мой ответ ниже дает объяснение. – Joel