gpt4 book ai didi

python - 无向图的 Networkx has_edge 只计算一次

转载 作者:太空宇宙 更新时间:2023-11-04 11:20:11 24 4
gpt4 key购买 nike

我有下图:

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())

enter image description here

我试图找到恰好相隔两个连接的所有节点,并根据权重对它们进行操作。

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())

当它应该是 3 时它输出 2 的边(B 和 F 通过 G、E 和 H 连接)

最佳答案

是的,如果G是无向的,那么G.has_edge(a,b)G.has_edge(b,a)都是True如果边存在并且False如果边缘没有。

鉴于您的代码设置方式,您将查看每对节点两次并执行相同的计算两次。

再添加一个条件如何:if G.has_edge(a,b) and a<b: (如果你在可能有 self 优势的情况下这样做,你可能会考虑 a<=b )。

然后两次中的一次它将忽略计算。只要节点定义了比较操作,它就会起作用。所以'A'<1行不通,但是 'A'<'B'返回 True .

我应该给出的一个警告是,只有当您保证在两个方向上都能看到每条边时,这才有效,也就是说,如果两个节点都出现在您的列表中 tgt_nodes .如果只出现“更大”的节点,则不算。因此,您可能需要为此改进您的测试。

关于python - 无向图的 Networkx has_edge 只计算一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56157627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com