如何从networkx图中的每个节点中删除最小权重边 选项 1:迭代节点并删除最小权重边选项 2:最后去除边缘

问题描述

我有一个无向图,我正在寻找一种方法来从每个节点中删除最小权重边。我尝试了几种方法,但它们似乎都失败了。

解决方法

首先创建一个具有随机权重的完整图:

g = nx.complete_graph(5)
for (u,v,w) in g.edges(data=True):
    w['weight'] = random.randint(0,10)

选项 1:迭代节点并删除最小权重边。

for n in g.nodes():
    min_weight = (-1,-1,float("inf"))
    for e in g.edges(nbunch=n,data="weight"):
        #print(e)
        if min_weight[2] > e[2]:
            min_weight = e
    print(min_weight)
    g.remove_edge(min_weight[0],min_weight[1])

选项 2:最后去除边缘。

最后只删除边,检查边是否已经在要删除的边列表中。

edges_to_remove = set()
for n in g.nodes():
    min_weight = (-1,data="weight"):
        #print(e)
        if min_weight[2] > e[2]:
            min_weight = e
    
    if (min_weight[1],min_weight[0]) not in edges_to_remove:
        print(min_weight)
        edges_to_remove.add((min_weight[0],min_weight[1]))

for e in edges_to_remove:
    g.remove_edge(*e)

请注意,这两种解决方案会产生不同的结果:

  • 对于同一张图:

使用选项 1 移除边 (u,weight)

(0,3,3)
(1,2,0)
(2,7)
(3,1,8)
(4,3)

使用选项 2 移除边 (u,0) (4,3)

  • 第一个选项删除每个节点的最小权重边取决于顺序!,即如果最小权重边已经被删除,它将删除下一个最小权重边。将始终删除与节点数量一样多的边。
  • 第二个选项只删除每个节点的最小权重边,即如果给定节点的最小边已经被删除,则不会删除任何边
,

给定一个完整的图形

>>> G = nx.complete_graph(n=5)
>>> for (u,v) in G.edges():
...     G.edges[u,v]['weight'] = random.randint(0,10)

要获取与节点相关的最小权重边,然后将其删除,您可以执行以下操作。

>>> for u in G.nodes():
...     min_weight_edge = min(G.edges(u),key=lambda x: G.get_edge_data(x[0],x[1])["weight"])
...     G.remove_edge(*min_weight_edge)
...