import copy
import math
from random import shuffle as sl
from random import randint as rd
def gn(): # 生成1到1000的一个随机数
num = rd(1, 1000)
return num
def w2f(f, num, fg): # 将num写入文件f,并根据fg的值决定是否换行
f.write(str(num))
if fg == True:
f.write('\n')
else:
f.write(' ')
def DataMake(c): # 生成DAG,存入以c命名的文件内
f = open('data' + str(c) + '.in', 'w')
n = 5 # 设置图中节点数量
node = range(0, n) # 生成1到n的一个序列
node = list(node) # 将格式转换成list,便于下一步随机重排
sl(node) # 随机重排,生成节点的序号。在这里,node[i]的值表示节点,i表示当前节点的拓扑序。
m = 0 #图中边的数量
for i in range(n): #根据拓扑序列生成边
p1 = node[i] # 取起点节点
m1 = rd(1, max(1, n-i-1)) #随机生成当前节点连接边
m += m1
p2_list = [] # # 选择第二个节点,这个节点的拓扑序必须大于第一个节点
can_list = copy.deepcopy(node[i+1:]) #可选候选集
while(len(p2_list) < m1 and i != n-1):
c1 = rd(0, len(can_list)-1) #随机抽取索引
if can_list[c1] not in p2_list:
p2_list.append(can_list[c1])
else:
can_list.remove(can_list[c1])
for j in range(len(p2_list)):
w2f(f, p1, 0)
w2f(f, p2_list[j], 1)
w2f(f, n, 0)
w2f(f, m-1, 1) # 将节点数量n和边的数量m写入文件f
print(n, ' node', m-1, ' edges')
f.close()
DataMake(1) # 生成一个名为data1.in的文件,里面存储的就是一个DAG
print('Done')
Python构建有向无环图DAG
于 2022-11-07 17:22:10 首次发布