如何解决如何从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 举报,一经查实,本站将立刻删除。