关键路径法
在无回路的有向网络中,假设只有一个入度为0的顶点(称为源点)和一个出度为0的顶点(称为汇点),则从源点到汇点之间的最长的路径称为关键路径。
AOE网:
无回路有向网络可以用来表示一个包含多项活动的工程计划:有向边表示一项活动,边上的权表示完成这项活动需要的时间;顶点表示"所有入边代表的活动已完成,出边代表的活动可以开始"这样一种状态或者事件,其中源点表示工程的开始,汇点表示工程的结束;源点到汇点的某一关键路径上边的权值之和表示完成整个工程的计划时间。
通过求有向网络的关键路径,可以算出整个工程从开始到结束至少需要多少时间;可以知道哪些活动是影响工程进度的关键活动。
这种用边表示活动且只有一个源点和一个汇点的无回路有向网络称为边表示活动的网,简称AOE网。
两个与顶点有关的量:
在下面的讨论中,假定AOE网有n个顶点,源点是V1,汇点是Vn。
-最早发生时间:
事件Vi的可能的最早发生时间earliest(i),它等于从源点V1到顶点Vi的最长路径长度。
-最迟发生时间
在保证汇点事件Vn在earliest(n)时刻发生的前提下,事件Vi允许的最迟发生时间latest(i),它等于earliest(i)减去从顶点Vi到汇点Vn的最长路径长度。
earliest数组的计算方法:
-令earliest(1)=0;
-按顶点的拓扑顺序计算earliest(j):
earliest(j)=max{(earliest(i)+Wij)|Vi邻接到Vj}
-例如
earliest(a)=max{earliest(b)+u,earliest(c)+v}
latest数组的计算方法:
-令latest(n)=earliest(n);
-按顶点的逆拓扑顺序计算latest(i):
latest(i)=min{(latest(j)-Wij)|Vj邻接于Vi}
-例如:
latest(a)=min{latest(d)-x,latest(e)-y}
两个与边有关的量:
对于活动ak=<Vi,Vj>,可以定义它的可能的最早开始时间和允许的最迟开始时间。
-最早开始时间:活动ak的可能的最早开始时间等于事件Vi的可能的最早发生时间earliest(i)
-最迟开始时间:活动ak的允许的最迟开始时间等于事件Vj的允许的最迟发生时间latest(j)减去完成该活动的计划时间Wij。
(最早发生,从前往后算;最迟发生,从后往前算。)
求关键路径的算法:
1、计算每个事件可能的最早发生时间
//计算每个事件可能的最早发生时间
template<class T>
void ExtLGraph<T>:: Earliest(int* earliest, int* order)
{
for(int i=0;i<n;i++) earliest[i]=0;
for(i=0;i<n;i++){
int k=order[i];
for (ENode<T>* p=a[k]; p; p=p->nextArc){
int j=p->adjVex;
if (earliest[j]<earliest[k]+p->w)
earliest[j]=earliest[k]+p->w;
}
}
}
2、计算每个事件允许的最迟发生时间
//计算每个事件允许的最迟发生时间
template<class T>
void ExtLGraph<T >:: Latest(int* latest,int* order,int longest)
{
for (int i=0;i<n;i++) latest[i]=longest;
for (i=n-2;i>-1;i--){
int j=order[i];
for (ENode<T>* p=a[j];p;p=p->nextArc) {
int k=p->adjVex;
if (latest[j]>latest[k]-p->w)
latest[j]=latest[k]-p->w;
}
}
}
3、输出关键活动
最早发生时间和最迟发生时间相等的事件,一般就是关键活动。
从源点到汇点具有最大长度的路径叫关键路径,在关键路径上的活动称为关键活动。
相关阅读
AOE网示例图: AOE网:在一个表示工程的带权有向图中,用顶点表示事件(如V0),用有向边表示活动(如<v0,v1> = a1),边上的权值表示活动的持
产品的需求管理是产品经理所担当的责任之一,通过需求的管理能够良好的支持项目经理安排任务以及确保产品的交付进度。关键路径法在
产品的需求管理是产品经理所担当的责任之一,通过需求的管理能够良好的支持项目经理安排任务以及确保产品的交付进度。关键路径法在