经常忘记关键路径各个量怎么求,开个帖子梳理一下王道求关键路径的流程,其中包含了一些个人的思考和见解,以便复习,不足之处欢迎指正
求关键路径
正向拓扑序列,就是从开头出发,每次都是去除入度为0的结点以及结点相连的边,如果有新结点因此而入度为0,重复上述过程
逆向拓扑序列,就是从结尾出发,每次都是去除出度为0的结点以及结点相连的边,如果有新结点因此而出度为0,重复上述过程
弧,也就是活动(完成活动需要耗费时间)
结点,也就是事件(事件属于一种状态,不需要耗费时间)
完整的流程见下图
1.求所有事件的最早发生时间
令第一个结点的最早开始时间为0
按照正向拓扑排序的序列顺序依次求出后续结点的最早开始事件
ve(k): max{ 前节点的ve +权值(从这个前节点到k节点的路径的权值)} (算出的所有前节点ve后加上路径权值后的值,取最大的)(具体的求解流程见上图)
最早开始时间,为什么是正向拓扑序列的结点的最早开始时间的值,加上圆弧的值,然后取最大的那个值?
肯定要等最慢的那一个完成任务后,后面的人才可以开始做;前面的不同的结点完成得越来越慢,导致后面共同后继的这一个节点也就启动得越来越晚
2.求所有事件的最迟发生时间
令最后一个结点的 最晚开始时间 = 最早开始时间
按照逆向拓扑排序的序列顺序依次求出前面结点的最晚开始事件
vl(k): min{ 后节点的vl - 权值(从这个后节点到k节点的路径的权值)} (算出的所有后节点vl后减上路径权值后的值,取最小的)(具体的求解流程见上图)
最迟发生时间,为什么是逆向拓扑序列的结点的最晚开始时间的值,减去圆弧的值,然后取最小的那个值?
后续的结点要保证按时启动,前面的结点肯定要在这个时间点,减去圆弧的时间后,一定要启动了,如果不启动,后续结点将无法按时启动;后续的不同的结点要求启动得越来越早,导致前面的共同前驱的这一个结点也就启动得越来越早
3.求所有活动的最早发生时间
弧(也就是活动)的最早发生时间,等于这个弧开头的结点的最早开始时间,即,(前一个结点开始的瞬间,弧就可以开始了)(具体的求解流程见上图)
4.求所有活动的最迟发生(最晚开始)时间
弧(也就是活动)的最晚开始时间,等于这个弧末尾的结点的最晚开始时间,减去这个弧的长度,即,(后一个结点要求最晚那个点开始开会,弧就需要留好在路上的时间,算好时间就要出发)(具体的求解流程见上图)
5.求所有活动的时间余量
关键路径指的是最为重要的活动,指的是需要花费最多时间的弧(最长时间的路径),如果弧最早开始时间和最晚开始时间卡得很极限(刚好相等,做差为0,如上图中圈红的结点),那这个弧就属于关键路径
总结:
正向拓扑序列,就是从开头出发,每次都是去除入度为0的结点以及结点相连的边,如果有新结点因此而入度为0,重复上述过程
逆向拓扑序列,就是从结尾出发,每次都是去除出度为0的结点以及结点相连的边,如果有新结点因此而出度为0,重复上述过程
弧,也就是活动
结点,也就是事件
1.求所有事件的最早发生时间
令第一个结点的最早开始时间为0
按照正向拓扑排序的序列顺序依次求出后续结点的最早开始事件
ve(k): max{ 前节点的ve +权值(从这个前节点到k节点的路径的权值)} (算出的所有前节点ve后加上路径权值后的值,取最大的)
最早开始时间,为什么是正向拓扑序列的结点的最早开始时间的值,加上圆弧的值,然后取最大的那个值?
肯定要等最慢的那一个完成任务后,后面的人才可以开始做;前面的不同的结点完成得越来越慢,导致后面共同后继的这一个节点也就启动得越来越晚
2.求所有事件的最迟发生时间
令最后一个结点的 最晚开始时间 = 最早开始时间
按照逆向拓扑排序的序列顺序依次求出前面结点的最晚开始事件
vl(k): min{ 后节点的vl - 权值(从这个后节点到k节点的路径的权值)} (算出的所有后节点vl后减上路径权值后的值,取最小的)
最迟发生时间,为什么是逆向拓扑序列的结点的最晚开始时间的值,减去圆弧的值,然后取最小的那个值?
后续的结点要保证按时启动,前面的结点肯定要在这个时间点,减去圆弧的时间后,一定要启动了,如果不启动,后续结点将无法按时启动;后续的不同的结点要求启动得越来越早,导致前面的共同前驱的这一个结点也就启动得越来越早
3.弧的最早开始时间,等于这个弧开头的结点的最早开始时间,即,(前一个结点开始的瞬间,弧就可以开始了)
4.弧的最晚开始时间,等于这个弧末尾的结点的最晚开始时间,减去这个弧的长度,即,等于(后一个结点要求最晚那个点开始开会,弧就需要留好在路上的时间,算好时间就要出发)
5.关键路径指的是最为重要的活动,指的是需要花费最多时间的弧(最长时间的路径),如果弧最早开始时间和最晚开始时间卡得很极限(刚好相等,做差为0,如上图中圈红的结点),那这个弧就属于关键路径