对于工程管理,人们最关注的两个问题分别是工程是否能顺利进行,以及估算整个工程完成所需要的最短时间和影响工程时间的关键活动。前一个问题可用拓扑排序解决,后一个问题则需要找出工程进行的
关键路径通常是所有工程活动中最长的路径,关键路径上的活动如果延期将直接导致工程延期。
利用 AOV 网表示有向typedef struct tagEdgeNode {
int vertexlndex; //活动边终点顶点索引 std::string name; //活动边的名称
int duty; //活动边的时间(权重)
}EDGE_NODE;
typedef struct tagVertexNode {
int sTime; //事件最早开始时间
int eTime; //事件最晚开始时间
int inCount; //活动的前驱节点个数
std::vector edges; //相邻边表
}VERTEX_NODE;
算法开始之前,每个顶点的 sTime 被初始化为 0,eTime 被初始化为一个有效范围之外的最大值(0x7FFFFFFF),算法结束之后,sTime 和 eTime 会被计算为实际的时间值。
什么是关键路径
开始讨论关键路径之前,先来介绍一下活动的最早开始时间和最晚开始时间。
工程中一个活动何时开始依赖于其前驱活动何时结束,只有所有的前驱活动都结束后这个活动才可以开始,前驱活动都结束的时间就是这个活动的最早开始时间。与此同时,在不影响工程完工时间的前提下,有些活动的开始时间存在一些余量,在时间余量允许的范围之内推迟一段时间开始活动也不会影响工程的最终完成时间,活动的最早开始时间加上这个时间余量就是活动的最晚开始时间。活动不能在最早开始时间之前开始,当然,也不能在最晚开始时间之后开始,否则会导致工期延误。
如果一个活动的时间余量为 0,即该活动的最早开始时间和最晚开始时间相同,则这个活动就是关键活动,由这些关键活动
计算关键路径的算法
计算关键路径的基础是先找出工程中的所有关键活动,确定一个活动是否是关键活动的依据就是活动的最早开始时间和最晚开始时间,因此需要先介绍如何计算活动的最早开始时间和最晚开始时间。
在 AOE 网中,事件 ei 必须在指向 ei 的所有活动都结束后才能发生,只有 ei 发生之后,从 ei 发出的活动才能开始&