【问题标题】:Removing loops in a graph network删除图网络中的循环
【发布时间】:2020-09-20 15:32:59
【问题描述】:

我有一个如下图所示的 Networkx 图表

图像已使用以下代码创建

import networkx as nx
import matplotlib.pyplot as plt

G = nx.gnm_random_graph(n=20, m=30, seed=1)
nx.draw(G, with_labels=True)
plt.show()
G.add_edges_from([(2, 20), (20, 8)])
n = len(G.nodes())

retain_node_ids = [1,2]
G.add_edges_from([(u, v) for u in retain_node_ids for v in (n, n+1)])
G = nx.k_core(G, k=2)
G.remove_nodes_from([n, n+1])
nx.draw(G, with_labels=True)
plt.show()

这是一个流网络,我想删除像红色标记的循环。这是一个示例图;在真实的网络中有很多这样的循环,我想检测并删除这些循环中的所有边缘。

例如,流向是从 7 -> 8 并且没有出口,边 (7,8) 不是多边。

非常感谢有关如何删除此类循环的建议。

编辑: 为什么要删除红框内的循环区域? 这是因为图形是有向的。假设流向是从 7 到 8,这是一个运输网络,一旦货物流入 8,那么它可以从 8 -> 2 或 8-> 20 运输,但没有退出循环。

【问题讨论】:

  • 听起来你想计算一个minimum spanning tree
  • 你的图是定向的吗?我认为这是因为您在谈论流程,如果是,那么起始节点是什么?您是否只想找到孤立的循环(仅通过 1 条边连接到图的其余部分)?
  • @AzimMazinani 是的,我的图是有向的
  • @Oil L 感谢您的建议。但我正在寻找一种仅删除上述循环的方法,最小生成树也会删除其他循环。
  • 问题格式不正确。是什么让红框中的循环与图中的任何其他循环不同?呈现的图也是无向的,但问题似乎与有向图中的特定循环模式有关?至少发布一个有向图,清楚地显示你正在尝试做什么。

标签: python-3.x graph networkx


【解决方案1】:

Tarjan 算法检测有向图中的循环,并报告在循环中捕获的节点。根据实施情况,您必须多次重新运行它,直到它干净为止。

https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm

【讨论】:

  • 感谢您的建议。但是我要删除的循环只有 3 个节点(也如上图所示)。我不清楚如何在这里使用 Tarjan 的算法。你能详细说明一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多