查找并计算网络中隔离和半隔离节点的数量

时间:2015-11-04 12:15:27

标签: python count components networkx connectivity

我正在与正在经历一系列中断事件的网络合作。因此,许多节点因给定事件而失败。因此,左侧图像与右侧图像之间存在过渡:

enter image description here

我的问题:如何找到断开连接的子图,即使它们只包含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阶段仍显示的节点数量中减去它。您将如何实现这一点?

1 个答案:

答案 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()

graph with isolated nodes colored blue