我想在考虑Edge权重的同时使用Networkx计算图形中两个节点之间的最小边缘切割。我尝试了minimum_edge_cut和minimum_st_edge_cut两个函数,但它们给出了相同的结果,因为它们只考虑了边数。我创建了一个简单的图来解决问题(我尝试在节点0和4之间找到最小边缘切割),如下所示:
G = nx.Graph()
G.add_nodes_from([0,1,2,3,4])
G.add_edges_from([(0,1),(0,2),(1,3),(3,4),(2,3)], weight = 1)
G[3][4]['weight']=3
G[0][1]['weight']=2
G[2][3]['weight']=2
print minimum_st_edge_cut(G, 0, 4)
print nx.minimum_edge_cut(G,0,4)
node_pos=nx.spring_layout(G)
nx.draw_networkx(G,node_pos,with_labels = True)
edge_labels = dict (( (i,j),G[i][j]['weight']) for (i,j) in G.edges())
nx.draw_networkx_edge_labels(G, node_pos, edge_labels=edge_labels)
plt.show()
两个函数的输出均为
[(3, 4)]
,其总边权重为3.如果考虑权重,则输出边应为[(0,2),(1,3)]
,总边权重为2. / p>
我不确定Networkx是否提供此类功能,但如果没有,则通过最简单的方法计算它将解决问题。
答案 0 :(得分:0)
似乎可以使用使用最小割最大流定理的minimum_cut来完成,并且可以指定边缘的容量以考虑重量。它返回切割权重以及2组节点(由切割创建的每个分区的集合)。然后找到通过切割的边缘可以通过2个嵌套循环完成,其中存储2组节点之间的边缘。以下是我用于实现问题中给出的示例的解决方案的代码部分:
cut_weight, partitions = nx.minimum_cut(G, 0, 4, capacity='weight')
edge_cut_list = []
for p1_node in partitions[0]:
for p2_node in partitions[1]:
if G.has_edge(p1_node,p2_node):
edge_cut_list.append((p1_node,p2_node))
其中(通过打印输出):
cut_weight = 2
partitions[0] = set([0, 1])
partitions[1] = set([2, 3, 4])
edge_cut_list = [(0, 2), (1, 3)]
预期的输出是什么。