如何在python中创建具有负边权重的随机单源随机非循环有向图

时间:2012-11-24 16:25:27

标签: python random graph networkx bellman-ford

我想在大量的图上对Bellman ford算法进行执行时间分析,为了做到这一点,我需要生成大量的随机DAGS,并且可能有负边缘权重。

我在python中使用networkx。 networkx库中有很多随机图生成器,但是会返回带有边权重和源顶点的有向图的那个生成器。

我使用的是networkx.generators.directed.gnc_graph(),但这并不能保证只返回一个源顶点。

有没有办法用甚至没有networkx来做到这一点?

4 个答案:

答案 0 :(得分:4)

您可以使用gnp_random_graph()生成器生成随机DAG,并且只保留从较低索引指向较高的边。 e.g。

In [44]: import networkx as nx

In [45]: import random

In [46]: G=nx.gnp_random_graph(10,0.5,directed=True)

In [47]: DAG = nx.DiGraph([(u,v,{'weight':random.randint(-10,10)}) for (u,v) in G.edges() if u<v])

In [48]: nx.is_directed_acyclic_graph(DAG)
Out[48]: True

这些可以有多个来源,但你可以通过@Christopher建议制作一个指向所有来源的“超级来源”来解决这个问题。

对于小的连通概率值(上面的p = 0.5),这些也不太可能连接。

答案 1 :(得分:1)

我注意到生成的图形总是只有一个接收器顶点,这是第一个顶点。您可以反转所有边的方向以获得具有单个源顶点的图形。

答案 2 :(得分:0)

@Aric建议的方法将生成随机DAG,但该方法不适用于大量节点,例如:n趋于100000。

        G = nx.gnp_random_graph(n, 0.5, directed=True)
        DAG = nx.DiGraph([(u, v,) for (u, v) in G.edges() if u < v])
        # print(nx.is_directed_acyclic_graph(DAG)) # to check if the graph is DAG (though it will be a DAG)
        A = nx.adjacency_matrix(DAG)
        AM = A.toarray().tolist()  # 1 for outgoing edges
        while(len(AM)!=n):
            AM = create_random_dag(n)

        # to display the DAG in matplotlib uncomment these 2 line
        # nx.draw(DAG,with_labels = True)
        # plt.show()

        return AM

对于大量节点,您可以使用每个下三角矩阵都是DAG的属性。 因此,生成随机下三角矩阵将生成随机DAG。

        mat = [[0 for x in range(N)] for y in range(N)]
        for _ in range(N):
             for j in range(5):
                 v1 = random.randint(0,N-1)
                 v2 = random.randint(0,N-1)
                 if(v1 > v2):
                     mat[v1][v2] = 1
                 elif(v1 < v2):
                     mat[v2][v1] = 1

        for r in mat:
            print(','.join(map(str, r)))

答案 3 :(得分:0)

对于G-> DG-> DAG

DAG具有k个输入和m个输出

  1. 使用您喜欢的算法(ReactiveFormsModule)生成图形
  2. 将图形设为双向(G=watts_strogatz_graph(10,2,0.4)
  3. 仅确保索引低的节点指向索引高的
  4. 删除k个最低索引节点的输入边和m个最高索引节点的输出边(从DG到DAG)
  5. 确保每k个最低索引节点都有输出边,每m个最高索引节点都有输入边。
  6. 检查此DAG中的每个节点,如果k

赞:

DG = G.to_directed()