关键路径
外汇网2021-06-23 08:28:10
176
核心路径介绍核心路径的工期决定了整个项目的工期。任何核心路径上的终端元素的推迟将直接影响项目的预期完成时间(比如在核心路径上没有浮动时间)。
一个项目可以有多个,并行的核心路径。其他总工期比核心路径的总工期略少的一条并行路径被称为次核心路径。
最初,核心路径方法只考虑终端元素之间的逻辑依靠关系。核心链方法中增长了资源约束。
核心路径方法是由杜邦公司发明的。探寻核心路径)} ( 1.1 ) j ∈ T 其中T是以顶点vk为尾的所有弧的头顶点的集合(2 ≤ k ≤ n) 。
假使得到的拓朴有序序列中顶点的个数差于网中顶点个数n,则表明网中有环,不能求出核心路径,算法终结。B、从完成顶点 v n 出发,令vl(n)=ve(n),按逆拓朴有序求其余各顶点的允许的最晚发生时间:
vl(j)=min{vl(k)-dut()} k ∈ S 其中 S 是以顶点vj是头的所有弧的尾顶点集合(1 ≤ j ≤ n-1) 。
C、求每一项活动ai(1 ≤ i ≤ m)的最早开始时间e(i)=ve(j);最晚开始时间:
l(i)=vl(k)-dut() 若某条弧满足 e(i)=l(i) ,则它是核心活动。
对于图1所示的 AOE 网,按以上步骤的计算结果见表1,可得到a1 , a4 , a7 , a8 , a10 , a11 是核心活动。(即从顶点j到k)表明,其连续时间记为dut(),则
e(i)=ve(j)
l(i)=vl(k)-dut() (6_6_1)
求ve(i)和vl(j)分两步:
· 从ve(1)=0开始向前递推
ve(j)=Max{ ve(i)+dut() } (6_6_2)
T, 2<=j<=n
其中,T是所有以j为弧头的弧的集合。
· 从vl(n)=ve(n)开始向后递推
vl(i)=Min{ vl(j)-dut() } (6_6_3)
S, 1<=i<=n-1
其中,S是所有以i为弧尾的弧的集合。
两个递推公式是在拓扑有序和逆拓扑有序的前提下执行。
4、 求核心路径的算法
(1) 输入e条弧,建立AOE网的存储结构。
(2) 从源点v1出发,令ve(1)=0,求 ve(j) 2<=j<=n。
(3) 从汇点vn出发,令vl(n)=ve(n),求 vl(i) 1<=i<=n-1。
(4) 依据各顶点的ve和vl值,求每条弧s(活动)的最早开始时间e(s)和最晚开始时间l(s),其中e(s)=l(s)的为核心活动。
求核心路径是在拓扑排序的前提下执行的,不能执行拓扑排序,自然也不能求核心路径。
Status ToplogicalSort(ALGraph G,stack &T){
FindInDegree(G,indegree);
InitStack(S);count=0; ve[0..G.vexnum-1]=0;
while(!StackEmpty(S))
{ Pop(S,j);Push(T,j); ++count;
for(p=G.vertices[j].firstarc;p;p=p->nextarc)
{k=p>adjvex;
if(--indegree[k]==0) Push(S,k);
if(ve[j]+*(p->info)>ve[k]) ve[k]=ve[j]+*(p->info);
}
}
if(count
else return OK;
}
status CriticalPath(ALGraph G){
if(!ToplogicalOrder(G,T)) return ERROR;
vl[0..G.vexnum-1]=ve[0..G.vexnum-1];
while(!StackEmpty(T))
for(Pop(T,j),p=G.vertices[j].firstarc;p;p=p->nextarc)
{k=p>adjvex; dut=*(p->info);
if(vl[k]-dut
}
for(j=0;j
for(p=G.vertices[j].firstarc;p;p=p->nextarc)
{k=p>adjvex; dut=*(p->info);
ee=ve[j]; el=vl[k];
tag=(ee==el)?’*’:’’;
printf(j,kdut,ee,el,tag);
}
}
#include
using namespace std;
int n,m,w[1001][1001],pv[1001],queue[1001],Time[1001],l=0,r=0,Pos[1001],path[1001];
void init()
{
int i,a,b,c;
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
w[a][b]=c;
pv[b]++;
}
}
inline void Newq(int v)
{
r++;
queue[r]=v;
}
inline void Del(int v)
{
int i;
for (i=1;i<=n;i++)
if (w[v][i])
{
pv[i]--;
if (!pv[i])
Newq(i);
}
}
void topo()
{
for (int i=1;i<=n;i++)
if (!pv[i])
Newq(i);
while (r
{
l++;
Del(queue[l]);
}
}
void crucialpath()
{
int i,j;
memset(Time,0,sizeof(Time));
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if ((w[j][queue[i]]) && (Time[j]+w[j][queue[i]]>Time[queue[i]]))
{
Time[queue[i]]=Time[j]+w[j][queue[i]];
Pos[queue[i]]=j;
}
}
void print()
{
printf("%d\n",Time[n]);
int i=n,k=0;
while (i!=1)
{
k++;
path[k]=i;
}
for (i=k;i>1;i--)
printf("%d ",path[i]);
printf("%d\n",path[1]);
}
int main()
{
init();
topo();
crucialpath();
print();
return 0;
}
标签:
随机快审展示
加入快审,优先展示
推荐文章
- 黑马在线:均线实战利器 9920 阅读
- 短线交易技术:外汇短线博弈精讲 5155 阅读
- MACD震荡指标入门与技巧 5262 阅读
- 黄金操盘高手实战交易技巧 5688 阅读
- 做精一张图 4415 阅读
热门文章
- 港币符号与美元符号的区别是什么啊? 29612 阅读
- 我国各大银行汇率为什么不一样啊? 19301 阅读
- 越南盾对人民币怎么算的?越南盾对人民币汇率换算方法是什么 14659 阅读
- 百利好环球欺诈,不给出金,无法联系。 12583 阅读
- 港元符号是什么啊 港元符号跟美元符号是一样吗 12363 阅读