这是图算法的最后一个比较重要的部分,就是关键路径。这里主要介绍手工求解的方法和思路,至于代码嘛,我自己在写我们学校OJ的时候虽然是可以AC的,但是经测试是有BUG的,so,就不拿出来献丑了~

什么是关键路径,关键路径有什么用呢?我又去抱了抱度娘的大腿,发现这个是杜邦公司发明的算法,是用来算工期的。在工程上,我们都很讨厌工程的延期,同时一个工程由分为很多的节点,我们不知道哪些节点决定着这个工程是否会延期,每一个部分有没有可以伸缩的时间,于是,这个用来计划工程的关键路径算法就诞生了。看来,数据结构的应用真的不仅仅局限于处理计算机本身的问题上,也应用到了工程中。

下面要解释一下AOE网,AOE是Activity On Edge的缩写,即活动在边上的网。是一个有向带权图。图中的边表示活动,顶点表示事件。 要注意与AOV网的区别,AOV是有向不带权图,图中的顶点表示活动,边表示活动间的先后关系

在AOE网中还有几个需要解释的名词:

1、源点:在AOE网中,只存在一个入度为0的点,这个点叫源点。

2、汇点:在AOE网中,只存在一个出度为0的点,这个点叫汇点。

现在就可以说说什么叫关键路径了:从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径。关键路径上的活动叫做关键活动。

关键路径是图中的最长路径,同时也是这个工程完成的最短时间。关于这句话,我是这样理解的:画在工程图上的事件都不是可有可无的事件,活动也是如此,都是要执行的。但是,活动的时间有长有短,那么,把每个部分活动的最长者取出来,不就是整个工程的最短完成时间吗?这个就有点像水桶效应,判断一个水桶能装多少水,不是看组成这个水桶最长的木板,相反,是看最短的木板。同样,要判断一个工程完成的最短时间,不是看在这个工程中每一部分中的最小者,应该看其最大者,因为它们都是要执行的嘛~短的执行完,而长的没有,这个工程依然没有完成啊!所以应该关注图中的最长的路径。

对于关键路径,依然有几个名词,下面先做个列举,后面遇到了再说明:

1、事件的最早发生时间

2、事件的最迟发生时间

3、活动的最早发生时间

4、活动的最迟发生时间

下面就进入算法的正题了,我们直接看例题,根据这个例子,来走一遍关键路径算法。

比如我们要求下图的关键路径

S1:先对这幅图的顶点(即事件)进行拓扑排序

排序序列为:V1 V2 V3 V4 V5 V6

S2:根据这个拓扑排序序列,求出事件的最早发生时间

事件的最早发生时间是指,触发这个事件开始的所有活动中最长的那个活动。(注意标蓝的那两个)

我们定事件V1(源点)的最早发生时间为0

V1    0

V2    V1+3 = 0 + 3 = 3

V3    V1 + 2 = 0 + 2 = 2

V4    max{V2 + 2 , V3 + 4} = max{5 , 6} = 6

V5    V2 + 3 = 6

V6    max{V5 + 1 , V4 + 2 , V3 + 3} = max{7 , 8 , 5} = 8

S3:推算出这幅图顶点(即事件)的拓扑排序序列

逆拓扑排序序列为:V6 V5 V4 V3 V2 V1

虽然逆拓扑的定义是从图中找到一个出度为0的顶点,但是我感觉某种程度上可以直接把拓扑序列逆过来。(有错的话欢迎指出~)

S4:根据逆拓扑排序序列,求出事件的最迟发生时间

事件的最迟发生事件是指,在不推迟整个工程完成的前提下,该事件最迟必须发生的时间。

汇点(V6)的最迟发生时间与最早发生时间相同,也就是8

V6     8

V5     V6 - 1 = 8 - 1 = 7

V4     V6 - 2 = 8 - 2 = 6

V3     min{V4 - 4 , V6 - 3} = min{2 , 5} = 2

V2     min{V5 - 3 , V4 - 2} = min{4 , 4} = 4

V1     min{V2 - 3 , V3 - 2} = min{1 , 0} = 0

可以发现,求事件的最迟发生时间时,是看某个顶点的出度,出度引申的,是这个事件的后继事件。我们是知道这些后继事件的最迟发生时间的,现在我们只需要将每一个后继的最迟发生时间减去其对应的,到达现在这个事件的代价,就可以得到一个序列,这个序列的元素可能是一个或多个(上面蓝色标注的是多个的情况,也就是说当前这个事件有多个后继)。

根据事件最迟发生时间的定义,为了不拖延工期,又要使得事件迟发生,是不是应该选择差比较小的呢?粗粗的想过去,如果选择差比较大的,事件是不是就会比较”早“发生呢?想象一下我们切木头,从后面往前切,是不是切的长度短,保留的就会比较多呢?这里也差不多意思。(这个真的是纯粹个人理解哈,为了是应对考试,可能不是十分合理)

S5:求每一个活动的最早发生时间

活动的最早发生时间就是引出这个活动的事件的最早发生时间。

Vx(早)表示某一个事件的最早发生时间

A = V1(早) = 0

B = V1(早) = 0

C = V2(早) = 3

D = V2(早) = 3

E = V3(早) = 2

F = V3(早) = 2

G = V4(早) = 6

H = V5(早) = 6

S6:求每一个活动的最迟发生时间

活动的最迟发生时间是用事件的最迟发生时间减去以它为结束点的活动的持续时间。

Vx(迟)表示某一个事件的最迟发生时间

A = V2(迟) - 3 = 4 - 3 = 1

B = V3(迟) - 2 = 2 - 2 = 0

C = V4(迟) - 2 = 6 - 2 = 4

D = V5(迟) - 3 = 7 - 3 = 4

E = V4(迟) - 4 = 6 - 4 = 2

F = V6(迟) - 3 = 8 - 3 = 5

G = V6(迟) - 2 = 8 - 2 = 6

H = V6(迟) - 1 = 8 - 1 = 7

可以发现,是每一个活动箭头所指的那个事件的最迟发生时间减去活动的持续时间

S7:从S5和S6中找出值一样的项(绿色标出),这些项所组成的路径,就是关键路径

即 B E G,这三个活动也叫做关键活动

附:

以上是标注的常规步骤,但是观察S2和S4中事件的最早/最迟发生时间,如果选出值一样的呢?

这里是V1 V3 V4 V6

而这些顶点组成的路径刚好和我们从S7中求出的相重合。

【算法】基于AOE网的关键路径算法相关推荐

  1. AOE网与关键路径、关键路径算法

    AOE网与关键路径 在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动持续的时间,称这样的有向图为边表示活动的网,简称 AOE网(activity on edge ne ...

  2. AOE网与关键路径简介

    前面我们说过的拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题.如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程, ...

  3. dhu 6 获取AOE网的关键路径

    6 获取AOE网的关键路径 作者: 冯向阳时间限制: 1S章节: 课程设计 问题描述 : 建立一个有向网AOE网,设计并完成一算法Get_CriticalPath(),获取关键路径.该路径仅输出,不须 ...

  4. 推荐系统 --- 推荐算法 --- 基于用户行为的推荐算法 - 协同过滤算法

    概述 历史 1992年,Goldberg.Nicols.Oki及Terry提出 基本思想 爱好相似的用户喜欢的东西可能也会喜欢 优点 共享朋友的经验,提高推荐的准确度 根据爱好相似的用户喜欢的视频进行 ...

  5. 推荐算法——基于用户的协同过滤算法(User-base CF)的java实现

    推荐算法--基于用户的协同过滤算法(User-base CF)的java实现 推荐系统 什么是推荐系统 为什么要有推荐系统 推荐算法 基于用户的协同过滤算法(User-base CF) 算法介绍 代码 ...

  6. 推荐算法-基于协同过滤的推荐算法

    推荐算法-基于协同过滤的推荐算法 在如今信息量呈爆炸式增长的时代,谷歌百度等搜索引擎为人们查找信息提供了便利,帮助用户快速查找有价值的信息.然而此类查询方式是大众化的,无法根据个人兴趣为用户展示相关的 ...

  7. 【数据结构和算法笔记】AOE网和关键路径

    目录 AOE网的概念: 关键路径:(critical  path) 求关键路径和关键活动: 事件的最早开始时间(event early): 事件的最迟开始时间(event late): 活动的最早开始 ...

  8. AOE网:关键路径和关键活动

    关键路径 在我的经验意识深处,"关键"二字一般都是指临界点. 凡事万物都遵循一个度的问题,那么存在度就会自然有临界点. 关键路径也正是研究这个临界点的问题. 在学习关键路径前,先了 ...

  9. c语言凸包算法,基于C语言的凸包算法实现

    基于C语言的凸包算法实现 非计算机专业,代码有些的不好的地方,大佬轻喷^ _ ^ 根据要求,需要使用C语言实现凸包算法--Graham扫描法,本文将从算法理解.实现思路.遇到的问题及其解决方案三个方面 ...

  10. 图论 —— AOE 网与关键路径

    [AOE 网] 在表示一个工程时,用顶点表示事件,用弧表示活动,权值表示活动的持续时间,这样的有向图即为 AOE 网. 其有两个性质: 在顶点表示事件发生之后,从该顶点出发的有向弧所表示的活动才能开始 ...

最新文章

  1. Robocopy.exe使用详例
  2. Contact Bubble View
  3. 《实例化需求》第一篇阅读体会
  4. LSMW批处理使用方法(10)_步骤12、13
  5. @Test的作用以及Testcase和TestSuite的用法
  6. 在window打包war
  7. Dell PowerEdge R740xd可以做什么?
  8. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十九)ES6.2.2 安装Ik中文分词器
  9. 〖Linux〗zigbee实验之cc2430的cc debugger固件升级实录
  10. linux版本的火狐浏览器,火狐浏览器Linux版本
  11. 企业级docker仓库Harbor在kubernetes上搭建使用
  12. 什么是激光波长、激光功率和激光亮度?
  13. Comparator--比较器
  14. 什么是CISP-PTS?考什么?
  15. Hive之配置和使用LZO压缩
  16. idea提示:无法解析 文件 ‘xxx.xml‘,servelet应该有mapping
  17. 两个地址之间的距离测量(使用高德API)
  18. 关于运行健康项目的tomcat无法常规关闭现象
  19. 2.前端笔记-CSS-字体属性
  20. 计算机工程与应用退修后退稿,《计算机工程与应用》退修意见 - 论文投稿 - 小木虫 - 学术 科研 互动社区...

热门文章

  1. [原创]电路仿真设计multisim 14安装,破解,汉化教程
  2. 供应链三道防线(读书笔记)1(共4)
  3. opnet安装的问题
  4. 标志着“神舟三号”口服液正式进入产业化阶段.
  5. 关于全国大学生集成电路创新创业大赛
  6. 【使用pycharm管理github仓库】github代码版本控制
  7. 微弱信号检测matlab代码,微弱信号检测方法研究
  8. 微软私有云分享(R2)9-SCVMM R2和SP1界面的不同
  9. EastFax传真服务器与单机传真软件什么区别
  10. 2018年的43个最佳网络监控工具