微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何从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)
... 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。