问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关键路径怎么求?求详解。

发布网友 发布时间:2022-04-23 06:01

我来回答

5个回答

热心网友 时间:2023-07-18 21:31

关键路径的算法是建立在拓扑排序的基础之上的,这个算法中用到了拓扑排序。

1.什么是拓扑排序?

举个例子先:一个软件专业的学生学习一系列的课程,其中一些课程必须再学完它的基础的先修课程才能开始。如:在《程序设计基础》和《离散数学》学完之前就不能开始学习《数据结构》。这些先决条件定义了课程之间的领先(优先)关系。这个关系可以用有向图更清楚地表示。图中顶点表示课程,有向边表示先决条件。若课程i是课程j的先决条件,则图中有弧<i,j>。若要对这个图中的顶点所表示的课程进行拓扑排序的话,那么排序后得到的序列,必须是按照先后关系进行排序,具有领先关系的课程必然排在以它为基础的课程之前,若上例中的《程序设计基础》和《离散数学》必须排在《数据结构》之前。进行了拓扑排序之后的序列,称之为拓扑序列。

2.如何实现拓扑排序?

很简单,两个步骤:

1.在有向图中选一个没有前驱的顶点且输出。

2.从图中删除该顶点和以它为尾的弧。

重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后一种情况则说明有向图中存在环。

3.什么是关键路径?

例子开头仍然,图1是一个假想的有11项活动的A0E-网。其中有9个事件v1,v2......,v9,每个事件表示在它之前的活动一完成,在它之后的活动可以开始。如v1表示整个工程的开始,v9表示整个工程结束,v5表示a4和a5已完成,a7和a8可以开始。与每个活动相联系的数是执行该活动所需的时间。比如,活动a1需要6天,a2需要4天。

由于整个工程只有一个开始点和一个完成点,故在正常情况(无环)下,网中只有一个入度为零的点(称作源点)和一个出度为零的点(叫做汇点)。
那么该工程待研究的问题是:1.完成整项工程至少需要多少时间?2.哪些活动是影响工程进度的关键?
由于在AOE-网中有些活动可以并行进行,所以完成工程的最短时间是从开始点到完成点的最长路径的长度(这里所说的路径长度是指路径上各活动持续时间之和,不是路径上弧的数目)。路径长度最长的路径叫做关键路径(Critical path)。
假设开始点是v1,从v1到vi的最长路径叫做时间vi的最早发生时间。这个时间决定了所有以vi为尾的弧所表示的活动的最早开始时间。我们用e(i)表示活动ai的最早开始时间。还可以定义一个活动开始的最迟时间l(i),这是在不推迟整个工程完成的前提下,活动ai最迟必须开始进行的时间。两者之差l(i)-e(i)意味着完成活动ai的时间余量。当这个时间余量等于0的时候,也即是l(i)=e(i)的活动,我们称其为关键活动。显然,关键路径上的所有活动都是关键活动,因此提前完成非关键活动并不能加快工程的进度。
因此,分析关键路径的目的是辨别哪些是关键活动,以便争取提高关键活动的功效,缩短整个工期。

4.如何实现关键路径?
由上面的分析可知,辨别关键活动就是要找e(i)=l(i)的活动。为了求得e(i)和l(i),首先应求得事件的最早发生时间ve(j)和最迟发生时间vl(j)。如果活动ai由弧<j,k>表示,其持续时间记为t(<j,k>),则有如下关系
e(i) = ve(j)
l(i) = vl(k) - t(<j,k>)
求解ve(j)和vl(j)需分两个步进行:
1)从ve(0)=0开始向前推进求得ve(j)
Ve(j) = Max{ve(i) + t(<i,j>) };<i,j>属于T,j=1,2...,n-1
其中T是所有以第j个顶点为头的弧的集合。

2)从vl(n-1) = ve(n-1)起向后推进求得vl(j)
vl(i) = Min{vl(j) - t(<i,j>};<i,j>属于S,i=n-2,...,0
其中,S是所有以第i个顶点为尾的弧的集合。
这两个递推公式的计算必须分别在拓扑有序和逆拓扑有序的前提先进行。也就是说,ve(j-1)必须在vj的所有前驱的最早发生时间求得之后才能确定,而vl(j-1)必须在Vj的所有后继的最迟发生时间求得之后才能确定。因此可以在拓扑排序的基础上计算ve(j-1)和vl(j-1)。


具体算法描述如下:
1.输入e条弧<j,k>,建立AOE-网的存储结构。
2.拓扑排序,并求得ve[]。从源点V0出发,令ve[0]=0,按拓扑有序求其余各顶点的最早发生时间ve[i]。如果得到的拓扑有序序列中顶点个数小于网中顶点数n,则说明网中存在环,不能求关键路径,算法终止;否则执行步骤3。
3.拓扑逆序,求得vl[]。从汇点Vn出发,令vl[n-1] = ve[n-1],按逆拓扑有序求其余各顶点的最迟发生时间vl[i]。
4.求得关键路径。根据各顶点的ve和vl值,求每条弧s的最早开始时间e(s)和最迟开始时间l(s)。若某条弧满足条件e(s) = l(s),则为关键活动。

为了能按逆序拓扑有序序列的顺序计算各个顶点的vl值,需记下在拓扑排序的过程中求得的拓扑有序序列,这就需要在拓扑排序算法中,增设一个栈,以记录拓扑有序序列,则在计算求得各顶点的ve值之后,从栈顶到栈底便为逆拓扑有序序列。

package graph;
import java.util.*;
public class Grph_CriticalPath 
{
Graph_AdjList adjList;
Stack<Integer> T = new Stack<Integer>(); 
int ve[];
int vl[];
final int max = 10000;

public Grph_CriticalPath(Graph_AdjList adjList)                   //图的存储结构是用的邻接表
{
this.adjList = adjList;
int length = adjList.vetexValue.length;
ve = new int[length];
vl = new int[length];
for(int i=0;i<length;i++)
{
ve[i] = 0;
vl[i] = max;
}
}

public void getCriticalPath()
{
topologicalOrder();

int t = T.pop();
T.push(t);
vl[t] = ve[t];
while(!T.isEmpty())
{
int j = T.pop();
for(Graph_AdjList.ArcNode p = adjList.vetex[j].firstArc; p!=null ;p = p.next)
{
int k = p.adjvex;
if(vl[k]-p.weight<vl[j])
{
vl[j] = vl[k]-p.weight;
}
}
}
for(int i=0;i<ve.length;i++)
{
for(Graph_AdjList.ArcNode p = adjList.vetex[i].firstArc; p!=null ;p = p.next)
{
int k = p.adjvex;
int ee = ve[i];
int el = vl[k]-p.weight;
if(ee==el)
{
System.out.print(i+","+k+"     ");
}

}
}
}

public void topologicalOrder()
{
Stack<Integer> S = new Stack<Integer>();
S.push(0);
int count = 0;
while(!S.isEmpty())
{
int j = S.pop();
T.push(j);
count++;
Graph_AdjList.ArcNode p = null;
for(p = adjList.vetex[j].firstArc; p!=null ;p = p.next)
{
int k = p.adjvex;
if(--adjList.degree[k]==0)
{
S.push(k);
}
if(ve[j]+p.weight>ve[k])
{
ve[k] = ve[j]+p.weight;
}
}
}
if(count<adjList.vetexValue.length)
{
System.out.println("图中存在环路!");
return;
}
}

public void print()
{
while(!T.isEmpty())
{
System.out.print(T.pop()+"     ");
}
}

public void printVel()
{
System.out.println();
for(int i=0;i<ve.length;i++)
{
System.out.print(ve[i]+"    ");
}
System.out.println();
for(int i=0;i<vl.length;i++)
{
System.out.print(vl[i]+"    ");
}
}


}

转自:http://blog.csdn.net/pigli/article/details/5777048

追问好详细,谢谢。。。

追答举手之劳

热心网友 时间:2023-07-18 21:32

1、下载360安全卫士,打开界面,然后右下角人工服务——热门工具——搜索(重装系统)打开之后点击重装系统,自动下重装。
2、打开人工服务——360专家(免费)——通过预约专家——微信预约专家——在预约的时间会通知你打开电脑然后以远程服务的方法来帮你重装。

热心网友 时间:2023-07-18 21:32

关键路径法(CPM)计算是软考中的必考题,是一个重点也是一个难点。在中级和高级考试中都会以选择题或简答题型出现,只要撑握了关键路径计算方法,一般这部分得分还是比较有把握的

热心网友 时间:2023-07-18 21:33

关键路径的算法是建立在拓扑排序的基础之上的,这个算法中用到了拓扑排序。

热心网友 时间:2023-07-18 21:34

首先你应该找到最早完成跟最迟完成的时间,然后剪一下就可以了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2024年云南292分能考上什么大学? 2024高考多少分能被焦作大学录取 【芍药花茶】芍药花茶的功效与作用 芍药花茶怎样喝 芍药花茶的介绍 芍药花茶的属性和功效 联想拯救者电竞手机Pro评测 植物大战僵尸花园战争有用的激活码发给我,有用我就采纳 亲亲奶爸《亲亲奶爸》歌词 植物大战花园战争激活码只能用一次? 歌词中带有。我的好爸爸。我的好爸爸。儿女怎能舍得让你走,_百度... edge浏览器没声音是怎么回事-edge浏览器没声音解决办法 数据结构中,关键路径是最长的路径,那为什么求的时候还要找最早路径和最晚路径相等的路径呢? 关键路径是事件节点网络中 关键路径等于最长路径吗 Project 2013 关键线路只显示了后半部分,关键线路的前置作业未标红是怎么回事? 什么是关键路径? 判断:在AOE网络中一定只有一条关键路径。() 关键路径怎么算 如何找到关键路径 怎样选个燃气灶 海尔自动点火燃气灶怎样把烧煤气的换成用天然气的 海尔家用燃气快速热水器温度不稳定,一会冷一会热 都是燃气灶,便宜和贵的主要区别在哪里? 台式燃气灶具的维修拆装流程 海尔家用燃气快速热水器jsq20-pr怎么使用? 海尔燃气热水器怎么使用? 海尔燃气灶好吗? 海尔家用燃气快速热水器使用说明书? 海尔的燃气灶怎么样啊? 海尔的燃气热水器怎么样? win7电脑本地连接连不上网怎么办? 如何编辑PDF文件中的文字内容? 只有关键路径上的活动才是关键活动是否正确 关键路径的作用和影响,尽量简略成几句话 什么是关键线路?它是如何确定的?确定关键线路有什么意义? 关键路径的探寻 数据结构,求助。AOE网中工程求最短时间为什么选最长路径作关键路径,而不是最短路径?(说得通俗易懂 图的关键路径 数据结构,关键路径 数据结构中关键路径的问题,为什么求事件最早开始时间是把权值最大的路径加起来呢? 关键路径含义?是否最多只有一条 8p打开旁白 关机了,开机后siri 要密码,打不开了,哪位大神给我方法_问一问 手机qq空间设置里在我的动态推荐制作是什么? qq动态推荐是不是有什么机制? qq咋在动态中推荐歌单 QQ动态里面的推荐是怎么弄的? qq发的动态视频能上推荐吗 QQ动态中的推荐是怎么弄的呀 手机qq空间好友动态推荐是什么意思? qq空间说说推荐是怎么回事 QQ动态里的推荐广告是根据什么推荐的