使用networkx.union()时,从networkx.Graph继承的类失败

时间:2019-01-07 17:21:43

标签: python-3.x networkx

全部

我尝试继承自己的networkx.Graph,在创建图形时添加两个节点和一个边。但是失败了

networkx.exception.NetworkXError: ('The node sets of G and H are not disjoint.', 'Use appropriate rename=(Gprefix,Hprefix)or use disjoint_union(G,H).')

当我尝试合并图形时,这是我的代码。我想念什么吗?

#!/usr/bin/python3

import networkx as nx

class die(nx.Graph):
    nLatency = 2
    def __init__(self):
        super().__init__()
        self.addNet()

    def addNet(self):
        self.add_node('N0')
        self.add_node('N1')
        self.add_edge('N0', 'N1', name='nLink', latency=self.nLatency)

S0D0 = die()
S1D0 = die()


Top = nx.union(S0D0, S1D0, rename=('S0D0', 'S1D0'))

1 个答案:

答案 0 :(得分:0)

因此,这里发生的是networkx尝试创建两个临时图,它们的一个节点是'S0D0-N0''S0D0-N1',另一个是'S1D0-N1''S1D0-N2'。然后尝试加入他们。

但是,当您在执行代码时对其进行挖掘时,创建的两个新图与原始图具有相同的类。因此,我们将创建的新图形称为H1H2。因为H1H2都具有类die,所以它们先用节点'N0''N1'初始化,然后用'S0D0-N0',{{1 }}或'S0D0-N1''S1D0-N1'被添加。因此,两者均用'S1D0-N2''N0'初始化。

因此,在'N1'处理的下一个阶段,它将测试unionH1是否具有任何公共节点,并且它们都有。这样您就会得到错误。

所以这就是错误的原因。如何解决它可能取决于您为什么要使用这些节点初始化图,以及您想要H2拥有什么类。

如果Top具有类Top,则将必须具有die'N0'(由于初始化),我怀疑您实际上并不需要。如果您只希望'N1'成为Top,则可以先将GraphS0D0变成S1D0 s:

Graph