十五分钟逐步掌握关键路径问题(时间余量、关键活动以及关键路径的求解)

关键路径问题

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波·莫听穿林打叶声》
本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

目录

  • 关键路径问题
      • 〇、概念说明
        • 1、AOE网
        • 2、关键路径
      • 一、问题描述
      • 二、问题求解
        • ①求事件v最早发生的时间 ve(i)
        • ②求事件v最晚发生的时间 vl(i)
        • ③求活动a最早开始时间e(i)
        • ④求活动a最迟开始时间l(i)
        • ⑤求时间余量(d(i))
        • ⑥关键活动
        • ⑦关键路径
      • 三、扩展解法

以下内容,仅供学习交流,且仅在CSDN平台发布,未经授权禁止二次转发。

〇、概念说明

1、AOE网

在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动所需的时间),称之为表示活动网络,简称AOE网

在AOE网中仅有一个入度为0的顶点,称为开始顶点(源点),它表示整个工程的开始;也仅存在一个出度为0的顶点,称为结束顶点(汇点),它表示整个工程的结束。

2、关键路径

在AOE网中,有些活动是可以并行进行的。从源点到汇点的有向路径可能有多条,并且这些路径长度可能不同。完成不同路径上的活动所需的时间虽然不同,但是只有所有路径上的活动都已完成,整个工程才能算结束。因此,从源点到汇点的所有路径中具有最大路径长度的路径称为关键路径,而把关键路径上的活动称为关键活动

(以上概念参考自王道数据结构)

在了解了这些基础概念之后,我们来看一下下面的问题,加深一下理解。

一、问题描述

以2022统考真题为例

【2022统考真题】下面是一个有10个活动的AOE图,时间余量最大的活动是()
在这里插入图片描述

  • A.c
  • B.g(✔)
  • C.h
  • D.j

二、问题求解

该类问题的步骤简要来说为以下五步:

  • 1️⃣求事件v最早发生的时间 ve(i)正向、事件、顶点
  • 2️⃣求事件v最晚发生的时间 vl(i)逆向、事件、顶点
  • 3️⃣求活动a最早开始时间e(i)正向、活动、有向边
  • 4️⃣求活动a最迟开始时间l(i)逆向、活动、有向边
  • 5️⃣求时间余量d(i)l(i) - e(i)

其中

  • 正向表示:从源点到汇点,正向推导
  • 逆向表示:从汇点到源点,逆向推导
  • 事件表示:v
  • 活动表示:a
  • 顶点表示:图中各个顶点
  • 有向边表示:图中各个箭头有向边

✔ 补充:求时间余量其实就是求4和3的差值(用d(i)来表示),这个差值也就是该活动完成的时间余量。
如果时间余量为0,说明该活动是关键活动,没有缓冲延迟的时间,必须要如期完成。

接下来对以上五个步骤从上到下依次展开计算,具体如下:

①求事件v最早发生的时间 ve(i)

求所有事件的最早发生时间ve[i],按照拓扑排序序列,依次求各个顶点的ve;

设置ve[1]=0,ve[i]=Max {ve[j]+weight(vj,vi)},vj为vi的任意前驱,weight则表示<vj,vi>上的权值。

根据上面的AOE图,可得其拓扑排序序列为:1、2、3、4、5、6。
从源点到汇点顺着来推导事件(顶点)的最早发生事件ve。

ve(1) = 0

在这里插入图片描述

由图可以得出
ve(2) = 0+2 = 1

在这里插入图片描述

ve(3) = Max{ve(2)+1,ve(1)+5} = Max{3,5} = 5

依次类推,可得表格中所示数据:

123456
ve(i)0258912

②求事件v最晚发生的时间 vl(i)

求所有事件的最迟发生时间vl[i],按照逆拓扑排序序列,依次求各个顶点的vl;设置vl[汇点]=ve[汇点],vl[i]=Min {vl[j]-weight(vi,vj)},vi为vj的任意前驱。

根据①中所得的拓扑排序,可得逆拓扑排序序列为:6、5、4、3、2、1
从汇点到源点逆着来推导事件(顶点)的最晚发生时间vl。

vl(6) = ve(6) = 12
在这里插入图片描述
vl(5) = 12 - 1 = 11

在这里插入图片描述

vl(4) = Min {vl(5)-1,vl(6)-4}= Min{10,8} = 8

依次类推,最终可得:

123456
vl(i)04581112

③求活动a最早开始时间e(i)

求所有活动的最早开始时间e[i],若边<vi,vj>表示活动i,则有e[j]=ve[i]。
从源点到汇点推导活动(有向边)的最早发生时间e。
在这里插入图片描述

e(a) = ve(1) = 0
在这里插入图片描述

e(b) = ve(1) = 0
在这里插入图片描述

e(c ) = ve(2) = 2

依次类推,最终可得:

abcdefghij
e(i)0022555889

④求活动a最迟开始时间l(i)

求所有活动的最迟开始时间l,若边<vi,vj>表示活动i,则有l[i]=vl[j]-weight(vi,vj)。
从汇点到源点推导活动(有向边)的最晚发生时间l。

在这里插入图片描述

l(j) = vl(6) - 1 = 12 - 1 = 11
在这里插入图片描述

l(i) = vl(6) - 4 = 12 - 8 = 4

在这里插入图片描述

l(h) = vl(5) - 1 = 11 - 1 = 10

依次类推,最终可得l的值如下表:

abcdefghij
l(i)2045571110811

⑤求时间余量(d(i))

最后,让l(i)-e(i)得到d(i)
d(a) = l(a) - e(a) = 2 - 0 = 2
d(b) = l(b) - e(b) = 0 - 0 = 0

依次类推,即可得出我们要求的时间余量d:

abcdefghij
d(i)2023026202

整体表格如下:

abcdefghij
e(i)0022555889
l(i)2045571110811
d(i)2023026202

根据表格中所得,时间余量最大的活动是 g,余量为6

补充一下关键活动和关键路径,具体内容如下:

⑥关键活动

abcdefghi j
e(i)0022555889
l(i)2045571110811
d(i)2 0 2302620 2

根据关键活动的定义,可得关键活动有b、e、i,这些活动都是无法延迟进行的活动,必须如期进行。

⑦关键路径

abcdefghi j
e(i)0022555889
l(i)2045571110811
d(i)2 0 2302620 2

根据关键活动,可以画出关键路径如下:
在这里插入图片描述

那么问题来了,关于上面时间余量那一块的求解,有没有其它一些简便一些的算法呢?

自然是有的(但方法不能保证百分百正确率,存在一定的技巧性),可以看看以下的一种扩展解法,但是算法思路肯定不止这一种,大家可以集思广益在评论区分享一下!

三、扩展解法

扩展解法思路参考自一位博主写的408真题篇:2022 408真题数据结构篇,个人进行了改善。

可以借助贪心算法的思想来选择。

可以先找出里面最长的几条边构造关键路径,b=5、f=4、i=4、d=3、e=3,枚举到这里就差不多了,我们发现 b=5、e=3、i=4 已经能将起点终点连通了。

假设这就是起点到终点的最长路径,下面开始看看起点到终点的最短路径 a=2、c=1、g=1,我们可以观察到反差最明显的,就是路径3 -> 6 可以分解为3->4->6,g 的时间余量明显是很大的。

但是要注意的是,这种贪心解法高效,但是正确率并非 100%

  • 如果想保证正确率,第一种解法较为妥当;
  • 如果追求高效,可以从尝试一下贪心或者其它算法的求解方法。

以上就是本文的全部内容,感谢观看!

Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
点赞加关注,文章收藏不迷路!本篇文章对你有帮助的话,还请多多点赞支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20769.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【多线程初阶】Thread类常见方法以及线程的状态

多线程初阶系列目录 持续更新中 1.第一次认识线程 2.Thread类常见方法以及线程的状态 … 文章目录 多线程初阶系列目录前言1. Thread 类及常见方法1.1 常见构造方法1.2 常见属性1.3 重要方法1.3.1 启动一个线程 ---- start()1.3.2 中断一个线程 ---- interrupt()1.3.3 等待一…

oled拼接屏优势详解

湖北省是中国中部地区的一个省份&#xff0c;拥有着丰富的资源和广阔的市场。在这个省份中&#xff0c;随着科技的不断发展&#xff0c;越来越多的企业开始使用oled拼接屏来展示自己的产品和服务。那么&#xff0c;什么是oled拼接屏呢&#xff1f;它有哪些优势和应用场景呢&…

【LeetCode: 16. 最接近的三数之和 | 双指针专题 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

(六)人工智能应用--深度学习原理与实战--理解张量与运算图

Tensorflow名称中的Tensor即张量&#xff0c;不仅仅是Tensorflow&#xff0c;几乎所有的深度学习平台都以张量为基本的数据结构。简单来说&#xff0c;张量就是多维数组&#xff0c;本质上是一种数据容器&#xff0c;它可以有任意维度&#xff0c;比如矩阵就是二维张量(二维数组…

基于 jmeter 和 shell 的接口性能自动化

目录 前言&#xff1a; 1. 总体需求 2. 实现流程 3.准备工作 4.具体实现 4.1 用例执行 主流程脚本 4.2 服务器监控 监控脚本&#xff1a; 服务器监控脚本 4.3 生成 html 报告 html 样式表 发邮件脚本 前言&#xff1a; 基于JMeter和Shell的接口性能自动化是一种有…

如何在 Blender 中更快地渲染?这些技巧需要知道

Blender 是一款开源 3D 建模和动画软件&#xff0c;动画艺术家、产品设计师和游戏创作者经常使用。Blender 不仅允许用户创建 2D 对象或角色并对其进行动画处理以获得 3D 模型&#xff0c;而且 Blender 背后还有强大的艺术家和计算机科学家社区&#xff0c;不断改进代码以提供功…

Appium: Windows系统桌面应用自动化测试(三) 【脚本操作】

Appium: Windows系统桌面应用自动化测试 【脚本操作】 一、常用操作1、添加被测程序1.1示例一&#xff1a;通过程序路径指定应用程序&#xff0c;例如指定写字板程序路径。1.2示例二&#xff1a;通过程序ID指定应用程序&#xff0c;例如指定计算器ID。1.3 应用程序ID&#xff0…

尚硅谷Linux学习笔记

文章目录 1. Linux概述2. Linux目录结构3. Linux操作命令3.1 vim编辑命令3.1.1 一般模式3.1.2 编辑模式3.1.3 指令模式 3.2 网络相关命令3.3 系统管理3.4 帮助命令3.4.1 man 获得帮助信息3.4.2 help 获得 shell 内置命令的帮助信息3.4.3 常用快捷键 3.5 文件目录类3.5.1 pwd、e…

「提高你的CSS技能」:15个重要的CSS属性详解

这篇文章介绍了15个重要的CSS属性&#xff0c;旨在提高读者的CSS知识和技能。文章以清晰的方式解释了每个属性的作用和用法&#xff0c;并提供了相应的示例代码。通过这篇文章&#xff0c;读者可以了解到一些有趣且实用的CSS属性。 1:in-range 和:out-of-range 伪类 CSS的:in…

基于51单片机+SHT30设计的环境温度与湿度检测设备(IIC模拟时序)

一、项目介绍 当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备。设备采用IIC模拟时序通信协议&#xff0c;能够实时监测环境的温度和湿度&#xff0c;并将数据通过LCD显示屏显示出来&#xff1b;可以广泛应用于室内环境监测、气象观测、农业温室监测等领域…

音视频开发实战03-FFmpeg命令行工具移植

一&#xff0c;背景 作为一个音视频开发者&#xff0c;在日常工作中经常会使用ffmpeg 命令来做很多事比如转码ffmpeg -y -i test.mov -g 150 -s 1280x720 -codec libx265 -r 25 test_h265.mp4 &#xff0c;水平翻转视频&#xff1a;ffmpeg -i src.mp4 -vf hflip -acodec copy …

常用的访问控制权限模型DAC RBAC

常用的访问控制权限模型DAC RBAC 文章目录 常用的访问控制权限模型DAC RBACLinux 自主访问控制与强制访问控制术语概念存取访问控制 Access Control自主访问控制强制访问控制 基于角色的权限控制模型RBAC模型管理方法RBAC0的管理命令RBAC0的系统支持方法RBAC0的高级审查持方法 …