Python生成依赖性应用的DAG(有向无环图)拓扑

因为研究方向设计到依赖性的应用,做实验需要用到一些随机的DAG(有向无环图)拓扑来作为应用的表示,找了找网上没有符合的代码,于是决定自己写个小脚本来生成大量随机的DAG拓扑。
我实验中要用到的依赖性应用拓扑类似于下面这种模式:在这里插入图片描述
观察到,DAG包括一个入口节点和一个出口节点,其余的节点都是具有依赖关系的中继节点
图中入口节点的入度和出口节点的出度都为0,其余任意节点都至少有一条入边和一条出边。
根据有向无环图的性质,每一个有向无环图中的所有节点能形成有限个拓扑序,拓扑序中的节点只能向后序的节点出边(即一条依赖边中的父节点在拓扑序中的顺序一定位于子节点前面)。那么给定一个拓扑序,只要通过按顺序遍历,以一定概率随机向后加边的形式,就能生成一个DAG。
根据我所需要应用的场景,拓扑图比较“窄”,因此我将除入口和出口之外中间节点的入度和出度都限制在2以内(也可以根据自己对形状的需求来调整参数)。
因为对遍历中的每对节点对,脚本都以一定概率加边或不加边,因此会出现没有出边或没有入边的中间节点。对没有入边的节点,添加一条入口节点到它的边,同理对没有出边的节点,添加一条它到出口节点的边。
在实际运行过程中发现,如果入口到出口节点有直连的边,形成的拓扑图会比较绕,因此脚本不会生成直连入口到出口的边。
最终代码如下:

import random
n = 8#节点数量
def prob_value(p):#一个按概率连边的函数
    q = int(10*p)
    l = [1]*q+[0
  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值