python 生成有向无环图(DAG)--改编自CSDN

本文介绍了如何使用Python生成有向无环图(DAG)并进行拓扑排序。首先解释了拓扑排序的定义和在DAG中的应用,接着展示了生成DAG的随机算法,并提供了相关代码,最后对代码中的疑问进行了探讨。
摘要由CSDN通过智能技术生成

本文改编自CSDN,作者ZhouMu,原文链接如下:

https://blog.csdn.net/zhoujinyu0713/article/details/10163037?utm_source=tuicool

本文的主要工作是,说明拓扑序的含义及其在生成DAG时的妙用,并给原文代码标注释。


0. 拓扑序

这一部分主要参考自百度百科中的“拓扑排序”词条。原文链接如下:

https://baike.baidu.com/item/%E6%8B%93%E6%89%91%E6%8E%92%E5%BA%8F/5223807?fromtitle=%E6%8B%93%E6%89%91%E5%BA%8F&fromid=17352962&fr=aladdin

定义:

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

定义中所谓的“偏序”是离散数学中的概念,偏序关系指的是,满足(1)自反性(2)反对称性(3)传递性的关系R。自反性指的是,集合中的任一元素x满足:x R x。反对称性指的是,如果x R y, 则 y R x不成立。传递性指的是,若x R y, y R z, 则有 x R z。

定义中所谓的“全序”也是离散数学中的概念。它在偏序关系的基础上加了限制:集合中任意两个元素都能比较大小。

对有向无环图进行拓扑排序的方法:

(1) 选择一个入度为0的顶点并输出之;
(2) 从网中删除此顶点及所有 出边
循环结束后,若输出的顶点数小于网中的顶点数,则输出“有 回路”信息,否则输出的顶点序列就是一种拓扑 序列
下面的图一是一个给DAG进行拓扑排序的例子:

1. 生成DAG的思路

假设要生成含有N个节点的网络。首先随机生成一个 1 到N 的排列。这个排列就是DAG的拓扑序,然后每次随机从前往后连边,这样就可以保证生成的是一个DAG了。

2. Python代码及注释

下面是原文的代码。我对代码存在两个疑问:

1. 为啥要在每条边后面加上随机生成的两个数?有什么用意?难道是权重?

2. 为啥在最后生成k个随机数?有什么用? 

希望知道的小伙伴能给我讲讲。

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值