Python构建有向无环图DAG

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')


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值