使用networkx在图形中查找基数k的所有node_cut

时间:2015-08-17 20:16:22

标签: python algorithm graph-theory networkx connectivity

networkx函数minimum_node_cut(G)返回一组最小基数的节点,它们断开连接G.但它只返回一个集合,即使其他解决方案可能存在。 我想知道如何获得给定图G的所有这些minimum_node_cuts。

在扩展中,如何获得基数k的所有节点切换?

我无法想到一种可以有效计算的算法。是否存在比天真更好的方法,包括尝试k个节点的每个组合并检查G是否断开连接?

编辑:我真的很喜欢David Eisenstat的回答,但是我无法实现它..我尝试了但是我得到了一个错误,这可能是由于递归中的错误而无法确定它是什么。这是代码:

def all_small_cuts(G, k, S=set()): 
    try:
        kappa = nx.node_connectivity(G)
    except nx.NetworkXPointlessConcept:
        return

    if kappa > k - len(S):
        return
    if kappa == 0:  # disconnected
        yield S
    if len(S) < k:
        for node in G.nodes():
            G.remove_node(node)
            S.update(set(str(node)))
            for el in all_small_cuts(G, k, S):
                yield el

我刚刚更换了yield from,因为我正在使用python 2.7。

2 个答案:

答案 0 :(得分:1)

我不确定您的性能要求是什么,但如果不编写新代码,可以比指数做得更好。假设我们有一个闭包node_connectivity,当U是一组节点时,node_connectivity(U)U上诱导子图的连通性。对于最多k的基数削减,存在递归枚举策略。 (警告:未经测试。)

def all_small_cuts(U, k, S={}):  # U is the set of vertices
                                 # whose inclusion in S
                                 # is not yet decided
    kappa = node_connectivity(U)
    if kappa > k - len(S):
        return
    if kappa == 0:  # disconnected already
        yield S
    if len(S) < k:
        for v in U:
            yield from all_small_cuts(U - {v}, k, S | {v})

这通过修剪不会产生任何结果的递归树的分支来枚举具有多项式延迟的相关切割。

这里有很大的改进空间,因为连通性测试背后的流动问题具有丰富的组合结构。

答案 1 :(得分:0)

在最近发布的NetworkX 1.10中,我们添加了Kanevsky的整齐算法[1]的实现,用于查找图的所有最小尺寸节点剪切集。该函数名为nx.all_node_cuts,它返回一个基数节点切割集的生成器,其基数等于G的节点连接性。因此,如果您不需要所有节点切割但只有一个足够好,根据某些任意标准,你可以在找到它们后立即停止计算它们。

[1] Kanevsky,A。(1993)。在图中查找所有最小尺寸的分离顶点集。网络23(6),533-541。 http://onlinelibrary.wiley.com/doi/10.1002/net.3230230604/abstract