我想在大量的图上对Bellman ford算法进行执行时间分析,为了做到这一点,我需要生成大量的随机DAGS,并且可能有负边缘权重。
我在python中使用networkx。 networkx库中有很多随机图生成器,但是会返回带有边权重和源顶点的有向图的那个生成器。
我使用的是networkx.generators.directed.gnc_graph(),但这并不能保证只返回一个源顶点。
有没有办法用甚至没有networkx来做到这一点?
答案 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个输出
ReactiveFormsModule
)生成图形G=watts_strogatz_graph(10,2,0.4)
)赞:
DG = G.to_directed()