У меня есть следующий график:
full_graph = nx.Graph()
tgt_nodes = ['B','F']
full_graph.add_edge('A','B')
full_graph.add_edge('B','C')
full_graph.add_edge('B','D')
full_graph.add_edge('B','E')
full_graph.add_edge('E','F')
#display and save as img
p = nx.drawing.nx_pydot.to_pydot(full_graph)
p.layout = 'spring'
#p.write_png(outputDir+ version+ '//' + 'cluster_no' + str(clusterNo) + '.png')
display.Image(p.create_png())
Я пытаюсь найти все узлы, которые находятся точно на расстоянии двух соединений, и делаювещи с ними в зависимости от веса.
out_graph = nx.Graph()
for curr_node in tgt_nodes:
#find all paths for curr_node that are <=2
pot_paths = nx.single_source_dijkstra_path_length(full_graph, curr_node,2)
print(pot_paths)
#iterate over all potential paths. If length ==2 either increment weight or add with weight = 1
for pot_node, dist in pot_paths.items():
if dist == 2:
print(pot_node)
if out_graph.has_edge(curr_node, pot_node):
# we added this one before, just increase the weight by one. NEED TO LIMIT SO THAT THIS DOESN't TRIGGER ON INVERSES
out_graph[curr_node][pot_node]['weight'] += 1
print('incremented edge for '+ curr_node)
else:
# new edge. add with weight=1
out_graph.add_edge(curr_node, pot_node, weight=1)
print('added edge for '+ pot_node)
Это должно срабатывать только один раз - при сравнении B> F следует добавить ребро.Когда дело доходит до F> B, я не хочу, чтобы оно увеличивалось, потому что оно точно обратное.Вот мои результаты:
>> {'B': 0, 'A': 1, 'C': 1, 'D': 1, 'F': 2, 'E': 1}
>> F
>> added edge for F
>> {'F': 0, 'B': 2, 'E': 1}
>> B
>> incremented edge for F
out_graph.edges(data = True)
>> EdgeDataView([('F', 'B', {'weight': 2})])
Как я могу изменить так (F, B) и (B, F) для одного и того же промежуточного узла, который считается один, а не два?
Спасибо!
РЕДАКТИРОВАТЬ
Собственно, вот пример, который не работает:
full_graph = nx.Graph()
tgt_nodes = ['B','F']
full_graph.add_edge('A','B')
full_graph.add_edge('B','C')
full_graph.add_edge('B','D')
full_graph.add_edge('B','E')
full_graph.add_edge('E','F')
full_graph.add_edge('G','F')
full_graph.add_edge('B','G')
full_graph.add_edge('F','H')
full_graph.add_edge('B','H')
#display and save as img
p = nx.drawing.nx_pydot.to_pydot(full_graph)
p.layout = 'spring'
#p.write_png(outputDir+ version+ '//' + 'cluster_no' + str(clusterNo) + '.png')
display.Image(p.create_png())
Он выводит ребро 2, когда это должнобыть 3 (B & F соединены через G, E и H)