抱歉,如果这是一个明显的错误-我是Python新手。 无论如何,我正在使用Python中的NetworkX包来生成一系列图形。 本质上,我正在做的事情是通过优先附件将图形最多扩展到“ n”个顶点,但要保留每个“切片”。 我的代码如下所示:

# function to generate a sequence of barabasi-albert random graphs
import networkx as nx

def pa_graph_seq(n, m, c=0, G=None, seed=None, seq=True):

    # Note: seq = True means function returns a list of
    #       networkx graph objects. Otherwise returns the
    #       graph from the final time slice

    # Some preliminary checks
    if m<1 or m>=n:
        raise nx.NetworkXError(\
            "BA network must have m>=1 and m<n, m=%d,n=%d"%(m,n))
    if seed is not None:
        random.seed(seed)
    if G is not None and len(G) >= n:
        raise nx.NetworkXError(\
             "G must have strictly less than n nodes")

    # If initial graph was not specified, initialize empty graph
    if G==None: G = nx.MultiGraph()

    # If seq==True, initialize the list with the initial graph
    if seq==True: Gseq = [G]

    # Grow the graph
    step = len(G)+1
    while step <= n:
        # Add a single node
        G.add_node(1)

        # Add edges
        for i in range(m):
            # Get degree sequence of current graph
            deg = nx.degree(G)
            d = deg.values()       

            # Increment degree of new node by 1
            d[len(d)-1] = d[len(d)-1]+1        

            # Sample node and attach edge           
            newnode = deg_sample(d,c)
            G.add_edge(step,deg_sample(d,c))

        # If seq==True, append onto Gseq
        if seq==True: Gseq.append(G)

        step += 1

    # Next loop for debugging only
    for i in range(len(Gseq)):
        print nx.nodes(Gseq[i])

    if seq == True:
        return Gseq
    else:
        return G

Gseq的奇怪问题是,最终的Gseq列表似乎只包含最终图形的n副本。 例如,小型调试循环( # Next loop for... )中的输出如下所示:

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

实际上,第一个元素的长度应为0,而第二个元素的长度应为1,依此类推(因为根据优先级附件,每次我们添加一个节点)。 显然对任何人我在这里犯了什么错误? 我已经确认,如果只在main for循环内添加一个print nx.nodes(G) ,那么输出看起来就是我想要的样子...

多谢您的协助与耐心!

===============>>#1 票数:1 已采纳

该代码仅将G的引用附加到GSeq ,而实际上未附加新的图形对象。 要获得您想if G==None: G = nx.MultiGraph()放置的行为if G==None: G = nx.MultiGraph()在主循环中, if G==None: G = nx.MultiGraph()

为了更好地理解python如何处理可变和不可变读取的数据。

我认为@markusian有正确的想法。 MultiGraph有一个复制方法 ,该方法应该可以使您获得所需的行为。 尝试类似

if seq==True: Gseq.append(G.copy())

  ask by gogurt translate from so

未解决问题?本站智能推荐: