我正在与正在经历一系列中断事件的网络合作。因此,许多节点因给定事件而失败。因此,左侧图像与右侧图像之间存在过渡:
我的问题:如何找到断开连接的子图,即使它们只包含1个节点?我的目的是计算他们并将渲染为失败,因为在我的研究中这适用于他们。对于半隔离节点,我的意思是隔离节点组,但彼此连接。
我知道我可以找到这样的孤立节点:
def find_isolated_nodes(graph):
""" returns a list of isolated nodes. """
isolated = []
for node in graph:
if not graph[node]:
isolated += node
return isolated
但是你如何修改这些线以使它们找到孤立节点的组,就像在右侧图片中突出显示的那样?
MY THEORTICAL ATTEMPT
Flood Fill 算法解决了这个问题,解释为here。但是,我想知道如何简单地计算巨型组件中的节点数量,然后从第2阶段仍显示的节点数量中减去它。您将如何实现这一点?
答案 0 :(得分:3)
如果我理解正确,你正在寻找"隔离"节点,意味着节点不在图的最大组件中。正如您所提到的,一种识别"隔离"的方法。节点是找到不在最大组件中的所有节点。为此,您可以使用networkx.connected_components
来获取组件列表并按大小对其进行排序:
components = list(nx.connected_components(G)) # list because it returns a generator
components.sort(key=len, reverse=True)
然后你可以找到最大的组件,并计算出#34;隔离的"节点:
largest = components.pop(0)
num_isolated = G.order() - len(largest)
我将这一切放在一个示例中,我绘制一个Erdos-Renyi random graph,将孤立的节点着色为蓝色:
# Load modules and create a random graph
import networkx as nx, matplotlib.pyplot as plt
G = nx.gnp_random_graph(10, 0.15)
# Identify the largest component and the "isolated" nodes
components = list(nx.connected_components(G)) # list because it returns a generator
components.sort(key=len, reverse=True)
largest = components.pop(0)
isolated = set( g for cc in components for g in cc )
# Draw the graph
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos=pos, nodelist=largest, node_color='r')
nx.draw_networkx_nodes(G, pos=pos, nodelist=isolated, node_color='b')
nx.draw_networkx_edges(G, pos=pos)
plt.show()