当前位置: 首页 > news >正文

【数据结构】图论核心应用:关键路径算法详解——从AOE网到项目管理实战​

关键路径

  • 导读
  • 一、重要概念
    • 1.1 AOE网
    • 1.2 关键路径
  • 二、关键路径算法
    • 2.1 算法步骤
    • 2.2 实例演示
    • 2.3 关键活动与关键路径的特性
  • 结语

图的基本应用

导读

大家好,很高兴又和大家见面啦!!!

在之前的图论学习中,我们已经掌握了拓扑排序这一重要概念。

拓扑排序是针对有向无环图(DAG)的一种线性序列,它要求对于图中的任意一条有向边(u,v),在序列中u都出现在v之前。

这种排序方法在任务调度、依赖关系分析等场景中有着广泛的应用。

与拓扑排序相对应的是逆拓扑排序:

它要求对于任意一条有向边(u,v),在序列中v都出现在u之前。

这两种排序方法虽然方向相反,但都体现了有向无环图中活动之间的前后依赖关系。

今天,我们将在这两种排序方法的基础上,深入探讨图论中的一个核心应用——关键路径分析

关键路径方法源于项目管理领域,用于确定项目中哪些任务的时间延迟会直接影响整个项目的完成时间。

  • 通过拓扑排序,我们可以确定项目中各个事件的合理发生顺序;
  • 通过逆拓扑排序,我们则可以分析在不影响总工期的前提下,各个事件最迟应该何时发生。

这两种分析方法的结合,正是求解关键路径的核心思路。

在本文中,我们将首先介绍 AOE网Activity On Edge network)这一重要概念,然后详细讲解如何通过拓扑排序和逆拓扑排序来求解关键路径,并通过具体实例演示整个计算过程。

掌握关键路径分析方法,不仅有助于理解项目管理中的时间优化问题,也为后续学习更多高级图算法奠定坚实基础。

让我们开始探索如何找出那些"牵一发而动全身"的关键活动吧!

一、重要概念

1.1 AOE网

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

AOV网一样,AOE网同样为有向无环图(DAG图),不过不同的是,二者的边和顶点所代表的含义是不同的:

  • AOV网:顶点表示活动,有向边表示活动的先后顺序,有向边并无权值
  • AOE网:顶点表示事件,有向边表示活动,边权值表示完成该活动的开销

AOE网具有一下两个性质:

  1. 只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始;
  2. 只有在进入某顶点的各有向边所代表的活动都已结束时,该顶点所代表的事件才能发生
买苹果5min
洗苹果3min
洗苹果3min
削苹果皮5min
准备买苹果
到家洗苹果
吃苹果
开始削皮

这里可能有点绕,这里我们通过吃苹果这个工程来进行理解:

  • 只有在准备买苹果这个事件发生后,买苹果这个活动才能开始;

  • 对于吃苹果这个顶点的所代表的事件,只有在指向该顶点的所有有向边所代表的活动(洗苹果3min与削苹果皮5min)都已经结束时,该事件才能发生;

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

1.2 关键路径

AOE网中,有些活动是可以并行进行的。这里我们将吃苹果这个工程给稍作修改:

买苹果3min
洗苹果3min
买水果刀5min
削苹果皮3min
开始
准备洗苹果
准备削苹果皮
吃苹果

在上图中,我们以开始这一顶点作为源点,当开始这一事件发生后,买苹果和买水果刀这两个活动是可以并行进行的,就比如,我们可以自己去买苹果,让家里的其他人去买水果刀,因此这两个活动可以并行进行。

从源点到汇点的有向路径可能有多条,并且这些路径长度可能不同。就比如上图中就存在两条路径:

  • 路径1
买苹果3min
洗苹果3min
削苹果皮3min
开始
准备洗苹果
准备削苹果皮
吃苹果
  • 路径2
买水果刀5min
削苹果皮3min
开始
准备削苹果皮
吃苹果

完成不同路径上的活动所需的时间虽然不同,但是只有所有路径上的活动都已完成,整个工程才能算结束。因此,从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径,而把关键路径上的活动称为关键活动

就如上述两条路径的长度分别为:

  • 路径1:9min
  • 路径2:8min

对于这两条路径而言,路径1的长度明显大于路径2的长度,因此路径1就是该工程的关键路径,该路径上的活动(买苹果、洗苹果、削苹果皮)就是关键活动

完成整个工程的最短时间就是关键路径的长度,即关键路径上个活动花费开销的总和。也就是说,完成吃苹果这个工程的最短时间需要花费9min。

这是因为关键活动影响了整个工程的时间,即若关键活动不能按时完成,则整个工程的完成时间就会延长。如下所示:

买苹果3min->5min
洗苹果3min
削苹果皮3min
开始
准备洗苹果
准备削苹果皮
吃苹果

当原本仅需3min买苹果的时间没能按时完成,而是延长到了5min,那么整个工程的完成的最短时间就由原先的9min延长到了11min。

因此,只要找到了关键活动,就找到了关键路径,也就可以得出最短完成时间。

在关键活动中,有以下参量我们需要了解:

  • 事件 vkv_kvk 的最早发生时间 ve(k)v_e(k)ve(k):指从源点 v1v_1v1 到顶点 vkv_kvk 的最长路径长度。
    • 事件 vkv_kvk 的最早发生时间决定了所有从 vkv_kvk 开始的活动能够开工的最早时间。可用下面的递推公式来计算:

vev_eve(源点) = 0
ve(k)=Max{ve(j)+Weight(vj,vk)}v_e(k) = Max\{v_e(j) + Weight(v_j, v_k)\}ve(k)=Max{ve(j)+Weight(vj,vk)}vkv_kvkvjv_jvj 的任意后继,Weight(vj,vk)Weight(v_j, v_k)Weight(vj,vk) 表示 <vj,vk><v_j, v_k><vj,vk> 上的权值

  • 事件 vkv_kvk 的最迟发生时间 vl(k)v_l(k)vl(k):指在不推迟整个工程完成的前提下,即保证它的后继事件 vjv_jvj 在其最迟发生时间 vl(j)v_l(j)vl(j) 能够发生时,该事件最迟必须发生的时间。

vlv_lvl(汇点) = vev_eve(汇点)
vl(k)=Min{vl(j)−Weight(vk,vj)},vkv_l(k) = Min\{v_l(j) - Weight(v_k, v_j)\}, v_kvl(k)=Min{vl(j)Weight(vk,vj)},vkvjv_jvj 的任意前驱

  • 活动 aia_iai 的最早开始时间 e(i)e(i)e(i):指该活动弧的起点所代表的事件的最早发生时间。

    • 若边 <vk,vj><v_k, v_j><vk,vj> 表示活动 aia_iai ,则有 e(i)=ve(k)e(i) = v_e(k)e(i)=ve(k)
  • 活动 aia_iai 的最迟开始时间 l(i)l(i)l(i):指该活动弧的终点所表示事件的最迟发生时间与该活动所需时间之差。

    • 若边 <vk,vj><v_k, v_j><vk,vj> 表示活动 aia_iai ,则有 l(i)=vl(j)−Weight(vk,vj)l(i) = v_l(j) - Weight(v_k, v_j)l(i)=vl(j)Weight(vk,vj)
  • 一个活动 aia_iai 的最迟开始时间 l(i)l(i)l(i) 和其最早开始时间 e(i)e(i)e(i) 的差额 d(i)=l(i)−e(i)d(i) = l(i) - e(i)d(i)=l(i)e(i):指该活动完成的时间余量,即在不增加完成整个工程所需总时间的情况下,活动 aia_iai 可以拖延的时间。

    • 若一个活动的时间余量为零,则说明该活动必须要如期完成,否则就会拖延整个工程的进度,所以称 l(i)−e(i)=0l(i) - e(i) = 0l(i)e(i)=0l(i)=e(i)l(i) = e(i)l(i)=e(i) 的活动 aia_iai 是关键活动

二、关键路径算法

2.1 算法步骤

求关键路径的算法步骤如下所示:

  • 从源点出发,令 vev_eve(源点) = 0 ,按拓扑有序求其余顶点的最早发生时间 ve()v_e()ve()
  • 从汇点出发,令 vlv_lvl(汇点) = vev_eve(汇点),按逆拓扑有序求其余顶点的最迟发生时间 vl()v_l()vl()
  • 根据各顶点的 ve()v_e()ve() 值求所有弧的最早开始时间 e()e()e()
  • 根据各顶点的 vl()v_l()vl() 值求所有弧的最迟开始时间 l()l()l()
  • AOEAOEAOE 网中所有活动的差额 d()d()d() ,找出所有 d()=0d() = 0d()=0 的活动构成关键路径

2.2 实例演示

接下来我们根据下面的实例来理解算法的各个步骤:

a1 = 3
a4 = 3
a8 = 1
a3 = 2
a7 = 2
a5 = 4
a2 = 2
a6 = 3
v1
v2
v5
v6
v4
v3

第一步:从源点出发,令 vev_eve(源点) = 0 ,按拓扑有序求其余顶点的最早发生时间 ve()v_e()ve()

按照拓扑排序的规则,我们可以得到其中一个拓扑排序序列为:

  • v1,v2,v3,v4,v5,v6v_1, v_2, v_3, v_4, v_5, v_6v1,v2,v3,v4,v5,v6

按照该顺序,我们依次对个顶点的最早发生时间进行求解:

  • ve1=0v_{e_1} = 0ve1=0:对于源点,该事件的最早发生时间肯定事从零时刻开始,因此其最早发生时间为: ve1=0v_{e_1} = 0ve1=0

  • ve2=Max{ve1+a1}v_{e_2} = Max\{v_{e_1} + a_1\}ve2=Max{ve1+a1}:对于顶点2,该事件要想发生,就一定得等活动 a1a_1a1 结束后,而 a1=3a_1 = 3a1=3 ,因此,该顶点事件的最早发生时间为: ve2=Max{0+3}=3v_{e_2} = Max\{0 + 3\} = 3ve2=Max{0+3}=3

  • ve3=Max{ve1+a2}v_{e_3} = Max\{v_{e_1} + a_2\}ve3=Max{ve1+a2}:对于顶点3,该事件要想发生,就一定得等活动 a2a_2a2 结束后,而 a2=2a_2 = 2a2=2 ,因此,该顶点事件的最早发生时间为: ve3=Max{0+2}=2v_{e_3} = Max\{0 + 2\} = 2ve3=Max{0+2}=2

  • ve4=Max{ve2+a3,ve3+a5}v_{e_4} = Max\{v_{e_2} + a_3, v_{e_3} + a_5\}ve4=Max{ve2+a3,ve3+a5}:对于顶点4,该事件要想发生,就一定得等活动 a3a_3a3 与活动 a5a_5a5 均结束后才能发生,而 a3=2,a5=4a_3 = 2, a_5 = 4a3=2,a5=4 ,因此,该顶点事件的最早发生时间为:ve4=Max{3+2,2+4}=Max{5,6}=6v_{e_4} = Max\{3 + 2, 2 + 4\} = Max\{5, 6\} = 6ve4=Max{3+2,2+4}=Max{5,6}=6

  • ve5=Max{ve2+a4}v_{e_5} = Max\{v_{e_2} + a_4\}ve5=Max{ve2+a4}:对于顶点5,该事件要想发生,就一定得等活动 a4a_4a4 结束后,而 a4=3a_4 = 3a4=3 ,因此,该顶点事件的最早发生时间为:ve5=Max{3+3}=6v_{e_5} = Max\{3 + 3\} = 6ve5=Max{3+3}=6

  • ve6=Max{ve5+a8,ve4+a7,ve3+a6}v_{e_6} = Max\{v_{e_5} + a_8, v_{e_4} + a_7, v_{e_3} + a_6\}ve6=Max{ve5+a8,ve4+a7,ve3+a6}:对于顶点6,该事件要想发生,就一定得等活动 a6,a7,a8a_6, a_7, a_8a6,a7,a8 均结束后才能发生,而 a6=3,a7=2,a8=1a_6 = 3, a_7 = 2, a_8 = 1a6=3,a7=2,a8=1 ,因此,该顶点事件的最早发生时间为:ve6=Max{6+1,6+2,2+3}=Max{7,8,5}=8v_{e_6} = Max\{6 + 1, 6 + 2, 2 + 3\} = Max\{7, 8, 5\} = 8ve6=Max{6+1,6+2,2+3}=Max{7,8,5}=8

第二步:从汇点出发,令 vlv_lvl(汇点) = vev_eve(汇点),按逆拓扑有序求其余顶点的最迟发生时间 vl()v_l()vl()

按照逆拓扑排序规则,我们可以得到其中一个逆拓扑排序序列为:

  • v6,v5,v4,v3,v2,v1v_6, v_5, v_4, v_3, v_2, v_1v6,v5,v4,v3,v2,v1

按照该顺序,我们依次对各个顶点的最迟发生时间进行求解:

  • vl6=ve6v_{l_6} = v_{e_6}vl6=ve6:对于汇点,我们假设该事件的最迟发生时间与最早发生时间一致,那么其对应的最迟发生时间则为:v6=8v_6 = 8v6=8

  • vl5=Min{vl6−a8}v_{l_5} = Min\{v_{l_6} - a_8\}vl5=Min{vl6a8}:对于顶点5,在他开始后,要想让顶点6的事件准时开始,那么他就一定要给活动 a8a_8a8 留出足够的时间,而 a8=1a_8 = 1a8=1 ,因此,顶点5的最迟发生时间为:vl5=Min{8−1}=7v_{l_5} = Min\{8 - 1\} = 7vl5=Min{81}=7

  • vl4=Min{vl6−a7}v_{l_4} = Min\{v_{l_6} - a_7\}vl4=Min{vl6a7}:对于顶点4,在他开始后,要想让顶点6的事件准时开始,那么他就一定要给活动 a7a_7a7 留出足够的时间,而 a7=2a_7 = 2a7=2 ,因此,顶点4的最迟发生时间为:vl4=Min{8−2}=6v_{l_4} = Min\{8 - 2\} = 6vl4=Min{82}=6

  • vl3=Min{vl6−a6,vl4−a5}v_{l_3} = Min\{v_{l_6} - a_6, v_{l_4} - a_5\}vl3=Min{vl6a6,vl4a5}:对于顶点3,在他开始后,要想让顶点6与顶点4的事件准时开始,那么他就一定要给活动 a6,a5a_6,a_5a6a5 留出足够的时间,而 a6=3,a5=4a_6 = 3, a_5 = 4a6=3,a5=4 ,因此,顶点3的最迟发生时间为:vl3=Min{8−3,6−4}=2v_{l_3} = Min\{8 - 3, 6 - 4\} = 2vl3=Min{83,64}=2

  • vl2=Min{vl5−a4,vl4−a2}v_{l_2} = Min\{v_{l_5} - a_4, v_{l_4} - a_2\}vl2=Min{vl5a4,vl4a2}:对于顶点2,在他开始后,要想让顶点5与顶点4的事件准时开始,那么他就一定要给活动 a4,a3a_4,a_3a4a3 留出足够的时间,而 a4=3,a3=2a_4 = 3, a_3 = 2a4=3,a3=2 ,因此,顶点2的最迟发生时间为:vl2=Min{7−3,6−2}=4v_{l_2} = Min\{7 - 3, 6 - 2\} = 4vl2=Min{73,62}=4

  • vl1=Min{vl2−a1,vl3−a2}v_{l_1} = Min\{v_{l_2} - a_1, v_{l_3} - a_2\}vl1=Min{vl2a1,vl3a2}:对于顶点1,在他开始后,要想让顶点2与顶点3的事件准时开始,那么他就一定要给活动 a1,a2a_1,a_2a1a2 留出足够的时间,而 a1=3,a2=2a_1 = 3, a_2 = 2a1=3,a2=2 ,因此,顶点1的最迟发生时间为:vl3=Min{4−3,2−2}=0v_{l_3} = Min\{4 - 3, 2 - 2\} = 0vl3=Min{43,22}=0

现在我们就得到了各个顶点的最早开始时间与最迟开始时间,如下所示:

v1v2v3v4v5v6
最早开始时间ve032668
最迟开始时间vl042678

第三步:根据各顶点的 ve()v_e()ve() 值求所有弧的最早开始时间 e()e()e()

按照前面我们求出的各顶点的最早开始时间,我们就可以求得各弧的最早开始时间:

  • <v1,v2><v_1, v_2><v1,v2>:其表示的活动为 a1a_1a1 ,因此其最早开始时间为:e1=ve1=0e_1 = v_{e_1} = 0e1=ve1=0

  • <v1,v3><v_1, v_3><v1,v3>:其表示的活动为 a2a_2a2 ,因此其最早开始时间为:e2=ve1=0e_2 = v_{e_1} = 0e2=ve1=0

  • <v2,v4><v_2, v_4><v2,v4>:其表示的活动为 a3a_3a3 ,因此其最早开始时间为:e3=ve2=3e_3 = v_{e_2} = 3e3=ve2=3

  • <v2,v5><v_2, v_5><v2,v5>:其表示的活动为 a4a_4a4 ,因此其最早开始时间为:e4=ve2=3e_4 = v_{e_2} = 3e4=ve2=3

  • <v3,v4><v_3, v_4><v3,v4>:其表示的活动为 a5a_5a5 ,因此其最早开始时间为:e5=ve3=2e_5 = v_{e_3} = 2e5=ve3=2

  • <v3,v6><v_3, v_6><v3,v6>:其表示的活动为 a6a_6a6 ,因此其最早开始时间为:e6=ve3=2e_6 = v_{e_3} = 2e6=ve3=2

  • <v4,v6><v_4, v_6><v4,v6>:其表示的活动为 a7a_7a7 ,因此其最早开始时间为:e7=ve4=6e_7 = v_{e_4} = 6e7=ve4=6

  • <v5,v6><v_5, v_6><v5,v6>:其表示的活动为 a8a_8a8 ,因此其最早开始时间为:e8=ve5=6e_8 = v_{e_5} = 6e8=ve5=6

第四步:根据各顶点的 vl()v_l()vl() 值求所有弧的最迟开始时间 l()l()l()

同理,我们也可以求得各弧的最迟开始时间:

  • <v1,v2><v_1, v_2><v1,v2>:其表示的活动为 a1a_1a1 ,因此其最迟开始时间为:l1=vl2−a1=4−3=1l_1 = v_{l_2} - a_1= 4 - 3 = 1l1=vl2a1=43=1

  • <v1,v3><v_1, v_3><v1,v3>:其表示的活动为 a2a_2a2 ,因此其最迟开始时间为:l2=vl3−a2=2−2=0l_2 = v_{l_3} - a_2 = 2 - 2 = 0l2=vl3a2=22=0

  • <v2,v4><v_2, v_4><v2,v4>:其表示的活动为 a3a_3a3 ,因此其最迟开始时间为:l3=vl4−a3=6−2=4l_3 = v_{l_4} - a_3= 6 - 2 = 4l3=vl4a3=62=4

  • <v2,v5><v_2, v_5><v2,v5>:其表示的活动为 a4a_4a4 ,因此其最迟开始时间为:l4=vl5−a4=7−3=4l_4 = v_{l_5} - a_4 = 7 - 3 = 4l4=vl5a4=73=4

  • <v3,v4><v_3, v_4><v3,v4>:其表示的活动为 a5a_5a5 ,因此其最迟开始时间为:l5=vl4−a5=6−4=2l_5 = v_{l_4} - a_5 = 6 - 4 = 2l5=vl4a5=64=2

  • <v3,v6><v_3, v_6><v3,v6>:其表示的活动为 a6a_6a6 ,因此其最迟开始时间为:l6=vl6−a6=8−3=5l_6 = v_{l_6} - a_6 = 8 - 3 = 5l6=vl6a6=83=5

  • <v4,v6><v_4, v_6><v4,v6>:其表示的活动为 a7a_7a7 ,因此其最迟开始时间为:l7=vl6−a7=8−2=6l_7 = v_{l_6} - a_7 = 8 - 2 = 6l7=vl6a7=82=6

  • <v5,v6><v_5, v_6><v5,v6>:其表示的活动为 a8a_8a8 ,因此其最迟开始时间为:l8=vl6−a8=8−1=7l_8 = v_{l_6} - a_8 = 8 - 1 = 7l8=vl6a8=81=7

现在我们就得到了所有弧的最早开始时间与最迟开始时间,如下所示:

a1a2a3a4a5a6a7a8
最早开始时间e00332266
最迟开始时间l10442567

第五步:求 AOEAOEAOE 网中所有活动的差额 d()d()d() ,找出所有 d()=0d() = 0d()=0 的活动构成关键路径

根据求得的各弧的最早开始时间与最迟开始时间,我们便可以求得各活动的二者时间差额,如下所示:

a1a2a3a4a5a6a7a8
最迟开始时间l10442567
最早开始时间e00332266
时间差额d10110301

根据差额我们可以找到关键活动:a2,a5,a7a_2, a_5, a_7a2,a5,a7,而这些活动所对应的关键路径为:

a2 = 2
a5 = 4
a7 = 2
v1
v3
v4
v6

2.3 关键活动与关键路径的特性

在一项工程中,关键路径与关键活动具有一下特性:

  • 若关键活动的时间增加,则整个工程的工期将会延长
  • 若关键活动的时间在一定范围内缩短,则整个工程的工期会被缩短
  • 若关键活动的时间缩短超过这一范围,则该关键路径会转为非关键路径,其对应的活动也会变为非关键活动。
  • AOE网 中的关键路径并不唯一,当网中存在多条关键路径时,只提高一条关键路径上的关键活动速度,并不能缩短整个工程的工期;只有加快那些包括所有关键路径上的关键活动,才能达到缩减工期的目的

下面我们还是以吃苹果这个工程来理解这些特性:

买苹果a1 = 3
洗苹果a3 = 3
买水果刀a2 = 6
削苹果皮a4 = 5
v1出门
v2准备洗苹果
v3准备削皮
v4吃苹果

在这个工程中,两条路径:

  • 路径1
买苹果a1 = 3
洗苹果a3 = 3
削苹果皮a4 = 5
v1出门
v2准备洗苹果
v3准备削皮
v4吃苹果
  • 路径2
买水果刀a2 = 6
削苹果皮a4 = 5
v1出门
v3准备削皮
v4吃苹果

均为该工程的关键路径,其中活动 a4a_4a4 为两条路径共有的关键活动,那么当我们缩短该工程的时间时,整个工程的工期都会缩短;

当我们缩短活动 a1a_1a1 或者活动 a3a_3a3 的时间时,此时路径1不再是关键路径,其路径上的活动也不再是关键活动,因此,其时间变化并不会影响整个工程的工期;

当我们增加某个活动的时间是,整个工程的工期将被延长,且不包含该活动的路径变为非关键路径;

买苹果a1 = 5
洗苹果a3 = 3
买水果刀a2 = 6
削苹果皮a4 = 5
v1出门
v2准备洗苹果
v3准备削皮
v4吃苹果

在上图中,关键路径为:

买苹果a1 = 5
洗苹果a3 = 3
削苹果皮a4 = 5
v1出门
v2准备洗苹果
v3准备削皮
v4吃苹果

工程的工期为:5+3+5=135 + 3 + 5 = 135+3+5=13

  • 当我们缩短关键路径上的活动 a1,a3a_1, a_3a1,a3 的总时间时间在 0∼20 \sim 202 这个范围内时,整个工程的工期将被缩短
  • 当超过这个范围时,该路径将变为非关键路径,路径上的活动 a1,a3a_1, a_3a1,a3 将变为非关键活动

结语

今天的内容到这里就全部结束了,通过今天的学习,我们系统掌握了图论中极具实用价值的关键路径分析方法。让我们来详细回顾本文的核心知识点:

  1. AOE网的核心概念

    • 顶点表示事件,有向边表示活动,边权值表示活动开销

    • 与AOV网的区别:AOV网顶点表示活动,AOE网边表示活动

    • 两个重要性质:事件触发活动的开始,活动完成触发事件的发生

    • 仅有一个源点(入度为0)和一个汇点(出度为0)

  2. 关键路径的核心定义

    • 从源点到汇点的最长路径决定了整个工程的最短工期

    • 关键路径上的活动称为关键活动,其延迟会直接影响总工期

    • 工程最短完成时间 = 关键路径的长度

  3. 五大关键参数体系

    • 事件最早发生时间ve(k):ve(k) = Max{ve(j) + Weight(vj, vk)}

    • 事件最迟发生时间vl(k):vl(k) = Min{vl(j) - Weight(vk, vj)}

    • 活动最早开始时间e(i):e(i) = ve(k)(活动起点的最早发生时间)

    • 活动最迟开始时间l(i):l(i) = vl(j) - Weight(vk, vj)

    • 时间余量d(i):d(i) = l(i) - e(i),d(i)=0的活动为关键活动

  4. 关键路径五步算法:

    1. 拓扑排序求所有事件的最早发生时间ve()
    2. 逆拓扑排序求所有事件的最迟发生时间vl()
    3. 根据ve()求所有活动的最早开始时间e()
    4. 根据vl()求所有活动的最迟开始时间l()
    5. 计算时间余量d(),d(i)=0的活动构成关键路径
  5. 关键路径的重要特性

    • 关键活动时间增加 → 总工期延长

    • 关键活动适度缩短 → 总工期缩短

    • 关键活动过度缩短 → 可能转为非关键活动

    • 多关键路径时需同时优化所有路径上的关键活动

💡 学习建议
建议大家亲手重现文中的实例计算,重点掌握五步算法的执行逻辑。关键路径分析在项目管理、工程优化等领域应用广泛,是图论通向实际应用的重要桥梁。

✨ 点击关注,系统学习图论完整知识体系!

👍 点赞支持 - 让更多需要的朋友看到这篇干货

⭐ 收藏备忘 - 建立个人知识库随时查阅

📤 转发分享 - 帮助更多正在学习图论的同学

💬 评论交流 - 有任何问题欢迎随时讨论

记得关注我,接下来我们将深入讲解图的更多实际应用场景!感谢阅读,我们下期再见!

http://www.dtcms.com/a/428479.html

相关文章:

  • 泰安市网站建设啥十小企业网站建设
  • 【Linux篇】--进程
  • 网站内链怎么删除合肥制作企业网站
  • 金融互助平台网站制作八喜网站建设
  • 西安微网站建设江西网站制作的公司哪家好
  • win10程序(十)慢速xls转xlsx
  • 河北建设厅网站设置阿凡达网站建设
  • 响应式学校网站模板下载重庆重庆网站建设
  • 拷贝构造和运算符重载
  • EasyDSS点播管理功能升级!转码、检索、播放全流程更灵活
  • 酒店网站建设便宜软件开发的工作内容
  • 手机网站做落地页贸易公司做网站怎么样
  • 网站建设专题的意义电商网站建设基础ppt
  • 【UE4/UE5】在虚幻引擎中创建控制台指令的几种方法
  • 51个人网站产品推广策划方案怎么做
  • 如何解决 pip install 安装报错 ImportError: cannot import name ‘xxx’ from ‘yyy’ 问题
  • 在Centos的Linux中安装Windows10系统
  • 小型企业做网站的价格自媒体自助下单网站怎么做
  • 解码数据结构树
  • 通信中级(综合能力)小范围重点
  • 私人做网站有什么用建设网站需要哪些元素
  • 网站开发整体流程公众号怎么做微网站吗
  • 网站制作上首页图片在线设计网站
  • 多线程逻辑备份工具 mydumper 全方位解析:备份恢复原理与实战用法
  • C++ 运算符重载与友元:实现优雅直观的类操作
  • 开源外贸网站升降平台找企汇优做网站推广
  • 汽车之家 网站建设网站设计的风格有哪些
  • Windows上部署FTP详解
  • 沙河做网站重庆丰都建设局网站
  • 企业网站建设情况汇报网页设计费用明细