(1)什么是关键路径
关键路径通常(但并非总是)是决定项目工期的进度活动序列。它是项目中最长的路径,即使很小浮动也可能直接影响整个项目的最早完成时间。关键路径的工期决定了整个项目的工期,任何关键路径上的终端元素的延迟在浮动时间为零或负数时将直接影响项目的预期完成时间(例如在关键路径上没有浮动时间)。 但特殊情况下,如果总浮动时间大于零,则有可能不会影响项目整体进度。
一个项目可以有多个、并行的关键路径。另一个总工期比关键路径的总工期略少的一条并行路径被称为次关键路径。最初,关键路径方法只考虑终端元素之间的逻辑依赖关系。关键链方法中增加了资源约束。关键路径方法是由杜邦公司发明的。
(2)关键路径的特点
【1】 关键路径上的活动的持续时间决定项目的工期,关键路径上所有活动的时间加起来就是项目的工期
【2】 关键路径上的任何一个活动都是关键活动,其中任何一个活动的延迟都会导致整个项目完成时间的延迟
【3】 关键路径是从始点到终点的项目路线中耗时最长的路线,因此想要缩短项目工期,必须在关键路径上想办法,反之如果关键路径延长,则整个项目工期就会延长
【4】 关键路径的耗时是可以完成项目的最短时间量
【5】 关键路径上的活动是总时差最小的活动
示例-1:
某软件项目的活动图如下图所示,其中顶点表示项目里程碑,连接顶点的边表示活动,边上的数字表示该活动所需天数,则完成该项目最少的时间为多少天?
图中关键路径为:A – B -- C – E – F – I – K – L ,其长度为24,关键路径上的活动均为关键活动。则完成该项目最少的时间为24天。
下面是一个使用C语言实现关键路径算法的示例程序:
#include <stdio.h>
#include <stdlib.h>
#define MAX_TASKS 10
// 任务结构体
typedef struct {
int id; // 任务编号
int duration; // 任务持续时间
int earliest; // 最早开始时间
int latest; // 最迟开始时间
int slack; // 松弛时间
} Task;
// 边结构体
typedef struct {
int from; // 起始任务编号
int to; // 终止任务编号
int weight; // 边的权重(任务持续时间)
} Edge;
// 计算任务的最早开始时间
void calculateEarliest(Task tasks[], int numTasks, Edge edges[], int numEdges) {
int i,j;
for (i = 0; i < numTasks; i++) {
tasks[i].earliest = 0; // 初始化最早开始时间为0
}
for (i = 0; i <