目录

一、什么是关键路径?

1、现实问题

二、关键路径相关概念?

三、关键路径算法实现?

1、算法分析

2、算法步骤

3、算法实现


一、什么是关键路径?

关键路径:若有向图中,各顶点表示事件,各有向边表示活动持续事件,则该图为活动边网络,简称AOE网。AOE网中的关键路径,就是完成整个网络所需的最短时间亦最长路径,AOE网中,往往有若干项活动可以平行的进行,因此,从开始顶点到最后一个顶点的最长路径称为关键路径。

1、现实问题

问题:

  • 假设以有向图表示一个施工流图,弧上的权值表示完成该项子工程所需时间。

  • 问:整个工程完成的最短时间?以及哪些活动将是影响整个工程如期完成的关键所在?

使用图描述上面情况:

  • 弧表示活动

  • 弧上的数字表示完成该项活动所需的时间。


二、关键路径相关概念?

1、AOE(Activity On Edge)网:若以弧表示活动,弧上的权值表示进行该项活动所需的时间,以顶点表示事件Event,称这种有向网为==边活动网络==,简称为AOE。

2、事件:是一个关于某几项活动开始或完成的断言。

  • 指向它的弧表示的活动已经完成。

  • 而从它出发的弧表示的活动开始进行

  • 整个有向图也表示了活动之间的优先关系

  • 这样的有向网也是不允许存在环的

3、源点和汇点:

  • 源点:表示工程开始事件的顶点的入度为零

  • 汇点:表示工程结束事件的顶点的出度为零

  • 一个工程AOE网应该是只有一个源点和一个汇点的有向无环图

4、关键路径和关键活动:

  • 关键路径:由于AOE网中某些活动可以并行进行,故完成整个工程的最短时间即为从源点到汇点==最长路径的长度==,这个路径称为关键路径。

  • 关键活动:构成关键路径的即为关键活动。

  • 实例:下图工程从开始到完成需要18天

    • a1、a4、a8和a11四项活动必须按时开始并按时完成,否则将延误整个工程的工期,使整个工程不能在18天内完成。

    • 于是,称a1、a4、a8和a11为AOE图的关键活动

    • 由a1、a4、a8和a11构成的路径称为关键路径。

三、关键路径算法实现?

1、算法分析

  • 相关概念

    • 假设顶点v0为源点,vn-1 为汇点

    • 时间v0的发生时刻为0时刻

    • 从v0到vi的最长路径叫做事件vi的最早发生时间

    • 用e(i)表示==活动的最早开始时间==。(这个时间决定了所有以vi为尾的弧所表示活动的最早开始时间)

    • 用l(i)表示==活动的最晚开始时间==。

    • 两者之差l(i)-e(i)意味着完成活动ai的时间余量

    • 当l(i)=e(i)时的活动成为==关键活动==。

    • 用ve(j)表示==事件vj的最早开始时间==。

    • 用vl(j)表示==事件vj的最晚开始时间==。

  • 关键路径和非关键路径分析

  • 顶点v0到v8的一条关键路径是:(v0, v1, v4, v6, v8) ,路径长度为18。

  • 活动a6不是关键活动,它的最早开始时间为5,最晚开始时间为8,时间余量为3。也就是说a6延迟3天,并不会影响整个工程的完成。

  • 总结:

    1.要缩短整个工程,必须先找到关键路径,提高关键活动的工效。

    2.由于关键路径上的活动都是关键活动,所以,提前完成非关键活动并不能加快工程的进度。

2、算法步骤

1、从源点v0触发,令ve(0) = 0,按拓扑有序序列求其余各顶点的ve(j)=maxi {ve(i) + |vi, vj| } , <vi, vj> ∈ T,其中:T是所有以vj为头的弧的集合。若得到的拓扑有序序列中顶点的个数小于网中的顶点个数n,则说明网中有环,不能求出关键路径,算法结束。

2、从汇点vn-1出发,令vl(n-1) = ve(n-1) ,按逆拓扑有序序列求其余各顶点的 vl(i)=minj {vl(j) - |vi, vj| } , <vi, vj> ∈ S,其中:S是所有以vj为尾的弧的集合。

3、求每一项活动ai(1<=i<=n)的最早开始时间e(i)=ve(j),vj是ai的起点。

4、求每一项活动ai的最晚开始时间l(i) = vl(j) - |vi, vj| , vi是ai的起点, vj是ai的终点。

5、若对于满足e(i) = l (i) ,则它是关键活动

两条关键路径:


3、算法实现

public class CriticalPath {private LinkStack T = new LinkStack();   // 拓扑逆序列顶点栈private int[] ve, vl;                    // 各顶点的最早发生时间和最迟发生时间// 有向图G采用邻接表存储,求各顶点的最早发生时间ve,若G无回路,则用栈T返回G的一个拓扑序列,且函数返回true,否则为falsepublic boolean topologicalOrder(ALGraph G) throws Exception {int count = 0;                                     // 输出顶点计数int[] indegree = TopologicalSort.findInDegree(G); // 求各个顶点的入度LinkStack S = new LinkStack();                      // 建零入度顶点栈Sfor (int i = 0; i < G.getVexNum(); i++)if (indegree[i] == 0)                         // 入度为0者进展S.push(i);ve = new int[G.getVexNum()];                       // 初始化while (!S.isEmpty()) {int j = (Integer) S.pop();T.push(j);                                       // j号顶点入T栈并计数++count;for (ArcNode arc = G.getVexs()[j].firstArc; arc != null; arc = arc.nextArc) {int k = arc.adjVex;if (--indegree[k] == 0)                        // 对j号顶点的每个邻接点的入度减1S.push(k);                               // 若入度减为0,则入栈if (ve[j] + arc.value > ve[k])ve[k] = ve[j] + arc.value;}}if (count < G.getVexNum())return false;                                  // 该有向图有回路elsereturn true;}// G为有向图,输出G的各项关键活动public boolean criticalPath(ALGraph G) throws Exception {if (!topologicalOrder(G))return false;vl = new int[G.getVexNum()];for (int i = 0; i < G.getVexNum(); i++)// 初始化顶点时间的最迟发生时间vl[i] = ve[G.getVexNum() - 1];while (!T.isEmpty()) {                    // 按拓扑逆序列求各顶点的vl值int j = (Integer) T.pop();for (ArcNode arc = G.getVexs()[j].firstArc; arc != null; arc = arc.nextArc) {int k = arc.adjVex;int value = arc.value;if (vl[k] - value < vl[j])vl[j] = vl[k] - value;}}System.out.println("ve:事件最早发生时间、vl事件最晚发生时间");System.out.println("事件ve\tvl");for (int j = 0; j < G.getVexNum(); j++) {int ee = ve[j];int el = vl[j];System.out.println(G.getVex(j) + "\t" + ee + "\t" + el);        // 输出关键事件}System.out.println("e:活动最早开始时间、l:活动最晚开始时间");System.out.println("源点-->\t汇点权值\te\tl\tl-e\t关键活动");for (int j = 0; j < G.getVexNum(); j++)// 求ee,el和关键活动for (ArcNode arc = G.getVexs()[j].firstArc; arc != null; arc = arc.nextArc) {int k = arc.adjVex;int value = arc.value;int ee = ve[j];int el = vl[k] - value;char tag = (ee == el) ? '*' : ' ';System.out.println(G.getVex(j) + "\t->\t" + G.getVex(k) + "\t"+ value + "\t" + ee + "\t" + el + "\t" + (el-ee) + "\t" + tag);       // 输出关键活动}return true;}public static void main(String[] args) throws Exception {ALGraph G = GenerateGraph.generateALGraph();CriticalPath p = new CriticalPath();p.criticalPath(G);}
}// 调试结果:
//ve:事件最早发生时间、vl事件最晚发生时间
//事件  ve    vl
//v0    0   0
//v1    6   6
//v2    4   6
//v3    5   8
//v4    7   7
//v5    7   10
//v6    16  16
//v7    14  14
//v8    18  18
//e:活动最早开始时间、l:活动最晚开始时间
//源点-->  汇点  权值  e   l   l-e 关键活动
//v0    ->   v3  5   0   3   3
//v0    ->   v2  4   0   2   2
//v0    ->   v1  6   0   0   0   *
//v1    ->   v4  1   6   6   0   *
//v2    ->   v4  1   4   6   2
//v3    ->   v5  2   5   8   3
//v4    ->   v7  7   7   7   0   *
//v4    ->   v6  9   7   7   0   *
//v5    ->   v7  4   7   10  3
//v6    ->   v8  2   16  16  0   *
//v7    ->   v8  4   14  14  0   *

【数据结构】什么的图的关键路径?关键路径相关概念?关键路径算法实现?相关推荐

  1. 数据结构基本概念——图的存储结构和遍历算法

    1图的存储方式 邻接矩阵和邻接表 1.邻接矩阵: 表示顶点之间相邻关系的矩阵. 设G=(V,E)是具有n个顶点的图,顶点序号依次为0,1,-,n-1,则表示G的邻接矩阵是具有如下定义的n阶方阵A: A ...

  2. 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径

    文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...

  3. 【数据结构知识】图【超详细版】

    前言 这一章内容比较多,每一节的知识点都很复杂,需要花很长时间才能搞懂,希望看的人耐心一点. [数据结构系列][前一章:树][后一章:查找] 六.图 目录 六.图 1.图的顶点和边间的关系 2.连通图 ...

  4. 关键路径问题java_关键路径问题课程设计Java

    关键路径问题课程设计Java 关键路径问题 关键路径问题 摘要 关键路径是我们估算某些工程非常有用,是一种非常重要的估算一项工程所需的最短时间的依据.本文对如何求一个工程的关键路径做了详细的说明,包括 ...

  5. C++版数据结构继承关系图

    文章目录 1 C++版数据结构继承关系图 1 C++版数据结构继承关系图 http://www.plantuml.com/plantuml/png/RP0nJaCn38Ptd-AfUs_0K4JPAW ...

  6. 数据结构基础:图结构的学习笔记

    1.图的定义 图是比树更加复杂的数据结构,在图的结构当中,任意两个节点之间都有可能有直接关系,所以图中一个节点的前驱和后继的数目是没有限制的. 2.图的用途 用于描述各种复杂的数据对象,在自然科学.社 ...

  7. noj数据结构稀疏矩阵的加法十字链表_数据结构之:图

    导读 1. 什么是图?图的存储方式? 2. 图的遍历(深度优先搜索,广度优先搜索) 3. 最短路径 1. 什么是图?图的存储方式? 前面总结了"树"这种数据结构,而这篇博客总结的是 ...

  8. 数据结构探险之图篇(上)理论篇

    数据结构探险之图篇 什么是图? 如下图:无向图 & 有向图 箭头分方向. 无向图中每条认为有来有回两条线 无向图&有向图 图中的概念: 有向图中的概念 结点称为顶点. 之间的线称为弧. ...

  9. 数据结构实践项目——图的基本运算及遍历操作

    本文是针对[数据结构基础系列(7):图]中第1-9课时的实践项目. 0701 图结构导学 0702 图的定义 0703 图的基本术语 0704 图的邻接矩阵存储结构及算法 0705 图的邻接表存储结构 ...

  10. 数据结构实验八 图及其应用

    数据结构实验八 图及其应用 实验内容 1.编写一个程序,完成如下功能: (1) 建立如下有向图G1的邻接矩阵输出,并由邻接矩阵产生邻接表输出之: (2) 输出图G1从顶点0开始的深度优先遍历序列: ( ...

最新文章

  1. 数据结构学习(十三)、快速排序
  2. 关于MVC/P 的简单介绍
  3. 我眼里的Exchange 2010 之:1—DAG
  4. 来到博客园 就要好好记录 分享技术
  5. Linux服务器集群系统(四)——LVS集群的负载调度
  6. js定时器异步请求时候 上一个请求没有响应时下一个请求已经开始_关于异步的理解...
  7. 数字逻辑电路课程设计之数字电子时钟
  8. Jsp+Ssm+Mysql实现的房屋租赁租房管理系统
  9. 电路故障检测与调试分析
  10. 原码一位乘法c语言程序,原码一位乘法与补码一位乘法
  11. 「Linux」- 修改鼠标滚轮的滚动方向 @20210315
  12. url怎么隐藏html后缀,去除url后缀(.html,.jsp等)的有效方法
  13. 基于JavaEE的实验室管理系统技术点
  14. Mybatis报错: Could not find resource mapper
  15. 敏感词工具(sensitive word)的使用
  16. zabbix4.4 使用自动发现监测web网站健康状态(通过mysql表获取web地址)
  17. 不等式解集怎么取_(√)口诀巧取不等式组的解集
  18. UE4(Unreal Engine 4)显示FPS
  19. Linux内核配置选项详解
  20. 神舟战神 8/9 代同方机型黑苹果 (非本人原创) (本人已按照教程安装)

热门文章

  1. 文本生成图像T2I复现所需操作命令合集
  2. 今年春运新增的这些“黑科技” 你感受到了吗?
  3. 长胜操盘手实战兵谱 一、猎庄之出手必赢的绝招 (2)
  4. 运维篇(二):git hooks之pre-receive脚本校验日志格式
  5. webpack与grunt/glub 的比较
  6. 不同cpu服务器虚拟迁移,案例五:虚拟机迁移报错CPU不兼容
  7. mpu6050姿态解算与卡尔曼滤波(2)卡尔曼滤波
  8. gridfs http文件服务器,mongodb gridfs nginx 文件服务器 安装配置
  9. 【BUG】url 参数 AES 加密和解密问题
  10. 进计算机中级职称,怎么考试?考哪些内容?