当前位置:鱼C工作室 >数据结构和算法 > 查看文章

关键路径 – 数据结构和算法67

关键路径

 

让编程改变世界

Change the world by program


 

关键路径

 

上节课小甲鱼讲的这个拓扑排序主要是为了解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题。

譬如说,造一辆汽车,我们需要先造各种各样的零件(一般的轿车由一万多个不可拆解的独立零件组成,F1赛车更是高达两万多个),最终再组装成整车。

 

请问汽车厂造一辆汽车,最短需要多少时间呢?

我们这里简单给大家参考,其中生产轮子:0.5天,发动机:3天,底盘:2天,外壳:2天,其他零部件:2天,全部零部件集中到一处:0.5天,组装成车并测试:2天

 

有童鞋说时间不就是全部加起来嘛,这显然不对,因为现在生产普遍是引进了流水线模式,就是所有的零部件是再不同的流水线上同时生产的,也就是说,在发动机生产的这3天里,已经生产了6个轮子,1.5个外壳和1.5个底盘,而组装车是在这些零部件都生产好后才可以进行的。

因此最短的时间其实是零部件中生产时间最长的发动机3天+集中零部件0.5天+组装车的2天,一共5.5天可以完成一辆汽车的生产。

 

AOE网:

 

在上节课讲了AOV网的基础上,我们来介绍一个新的概念。

在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,我们称之为AOE网(Activity On Edge Network)。

 

我们把AOE网中没有入边的顶点称为始点或源点,没有出边的顶点称为终点或汇点。

其实有些童鞋可能会觉得这么多鸟文的缩写怎么才能记住丫,坑爹的英语伤不起啊,大家不妨可以试试联想记忆:例如上节课讲的AOV网,小甲鱼不是举了“我想拍一部色情电影”的例子嘛,那刚好AOV里边有个AV,AVAV,AV女优嘛,这就联想起来了。这节课我们开头就整了个法拉利F40,刚好出现了个AOE网,里边有个AE,丫~~,这让小甲鱼很容易又想到了最喜欢的游戏:极品飞车就是由EA sports发行的,所以也很容易挂钩起来了,想忘记或者混淆都难,你说呢?

 

No Pic You Say A J8:

AOE网

 

这就是一个AOE网,1是源点,表示一个工程的开始,9是汇点,表示整个工程的结束。顶点1,2,3,4,5,6,7,8,9分别表示事件,这里有9个事件,11 项活动 a 1 , a 2 , … , a 11 。

每个事件表示在它之前的活动已经完成,在它之后的活动可以开始。如 1 表示整个工程开始, 9 表示整个工程结束。 5 表示活动 a 4 和 a 5 已经完成,活动 a 7 和 a 8 可以开始。

与每个活动相联系的权表示完成该活动所需的时间。如活动 a 1 需要 6 天时间可以完成。

 

AOV网和AOE网对比

AOV网和AOE网对比

AOV网和AOE网对比

AOV网和AOE网对比

 

我们把路径上各个活动持续的时间之和称之为路径长度,从源点到汇点具有最大长度的路径叫做关键路径,在关键路径上的活动叫关键活动。图中:从开始到发动机完成到部件集中到位到组装完成就是一条关键路径,路径长度为5.5。

如果说我们想要缩短整个工程的工期,你去改进轮子生产效率,哪怕一个轮子改进到只需要0.1天就可以完成,也是没有用的,只有缩短关键路径上的关键活动时间才可以减少整个工期的长度。例如你把发动机制造缩短为2天,那么关键路径长度一下子就降低到4.5了,整整缩短了一天的时间。

 

那么现在的问题是如何找出关键路径,对于我们来说,这个AOE图就傻瓜也能看得出来,但如果是刚才举例源点和汇点那个图,想必就没有那么容易了吧?现实生活中的工程往往都是比这个复杂很多,所以我们必须找出某种算法,让电脑去做这种费神费力的事儿(怪不得那么多科幻片里机器人要造反……)。

 

课后思考

1. 关键路径如何建立在拓扑序列上。

2. 谷歌、百度、维基以下关键词

etv(Earliest Time Of Vertex)

ltv(Latest Time Of Vertex)

ete(Earliest Time Of Edge)

lte(Latest Time Of Edge)

3. 想想代码如何构成,下节课我们谈代码编写!


为您推荐

报歉!评论已关闭.