- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有下图:
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())
当它应该是 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/
为了获得我的瓷砖,我这样做: style(styleUri = Style.MAPBOX_STREETS) { +vectorSource(id = "parcel-source") {
我是一名优秀的程序员,十分优秀!