求关键路径

求关键路径

1、重要概念

           1AOE (Activity On Edges)网络 如果在无有向环的带权有向图中用有向边表示一个工程中的各项活动(Activity),用边上的权值表示活动的持续时间(Duration),用顶点表示事件(Event)则这样的有向图叫做用边表示活动的网络,简称AOE (Activity On Edges)网络。AOE网是一个带权的有向无环图。

AOE网络在某些工程估算方面非常有用。例如,可以使人们了解:

    a、完成整个工程至少需要多少时间(假设网络中没有环)?

     b、为缩短完成工程所需的时间应当加快哪些活动

     (2关键路径(Critical Path) AOE网络中有些活动顺序进行,有些活动并行进行。从源点到各个顶点,以至从源点到汇点的有向路径可能不止一条。这些路径的长度也可能不同。完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,整个工程才算完成因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和。这条路径长度最长的路径就叫做关键路径(Critical Path)

      如果一个活动的最早开始时间等于它的最迟开始时间,那么这个活动就被称为是关键活动,关键活动连接在一起就是关键路径。

如图1就是一个AOE网,该网中有11个活动和9个事件。每个事件表示在它之前的活动已经完成,在它之后的活动可以开始。如事件v5表示a4a5活动已经完成,a7a8活动可以开始。每个弧上的权值表示完成相应活动所需要的时间,如完成活动a1需要6天,a8需要7天。

14、求关键路径 - 墨涵 - 墨涵天地

1

       AOE网常用于表示工程的计划或进度。由于实际工程只有一个开始点和一个结束点,因此AOE网存在唯一的入度为0的开始点(又称源点)和唯一的出度为0的结束点(又称汇点),例如图1AOE网从事件v1开始,以事件v9束。同时AOE网应当是无环的。

3)算法描述中要用到的几个表达

e(i)表示活动ai的最早开始时间,l(i)表示活动ai的最迟开始时间; l(i)-e(i)表示完成活动的时间余量。事件vi 的最早开始时间表示为ve(i), 事件vi 的最迟允许开始时间vl(i)

l[k] = e[k]的活动就是关键活动。为求得e[k]l[k],需要先求得从源点v0到各个顶点vi  ve[i]  vl[i]。如果活动a由弧<j,k>表示,其持续时间记为dut(<j,k>),则有如下关系:          
        e(i)=ve(j)
        l[i] = vl[k] – dut(<i, k>)

ve(j)vl(j)需分两步进行:

1

14、求关键路径 - 墨涵 - 墨涵天地

其中, T是所有以第j个顶点为头的弧的集合。

2

14、求关键路径 - 墨涵 - 墨涵天地

其中, S是所有以第i个顶点为尾的集合。

这两个递推公式的计算必须分别在拓扑有序及逆拓扑有序的前提下进行。也就是说,ve(j-1)必须在v的所在前驱的最早发生时间求得之后才能确定,而vl(j-1)则必须在v的所有后继的最迟发生时间求得之后才能确定。因此,可以在拓扑排序的基础上计算ve(j-1)vl(j-1)

2、需要说明的地方

1)上面的图1中的关键路径就为

14、求关键路径 - 墨涵 - 墨涵天地

2)影响关键活动的因素是多方面的,任何一项活动持续时间的改变都会影响关键路径的改变。关键活动的速度提高是有限度的,只有在不改变网的关键路径的情况下,提高关键活动的速度才有效。如果网中有几条关键路径,那么单是提高一条关键路径上的关键活动的速度,还不能导致整个工程缩短工期,而必须同时提高几条关键路径上的活动的速度。


更通俗地来理解:

 
在这种AOE网中, 最长的一条路径就是关键路径 ,因为图中每个活动都是必须的,只有最长的工期完成后,项目才真正完成了,图中10+9+20+10 也就是ADFHJ  ,显然是最长的,所以为关键路径

从左边开始每个活动所需要最长的时间就是 最早开始时间 ,如C,只有A指向它,那么最早开始时间就是5;F, A->C->F
5+4=9, A->D->F  10+9=19,两者比较,后者大,故19为最早开始时间,依次类推。

从右边倒推,可以求的 最迟开始时间, 如J为49,以I为例,I->J 倒推 49-4=45 所以I最迟开始时间为45;H为例,H->J 倒推49-10=39,H->I->J 倒推 49-4-1=44,两者取最小的,所以H的最迟开始时间为39。

关键路径的图形化展示通常应用于项目管理领域,尤其是在CPM(Critical Path Method)中。通过图形化界面可以清晰地表示出任务之间的依赖关系以及整个项目的最长路径,即关键路径。下面将从算法实现和图形化展示两个方面进行说明。 ### 算法实现 关键路径算法主要基于有向无环图(DAG, Directed Acyclic Graph),其中每个节点代表一个任务,边则表示任务间的先后顺序。为了找到关键路径,需要执行以下步骤: 1. **构建事件最早发生时间数组**:使用拓扑排序来初始化所有事件的最早开始时间为0,并按照拓扑序列依次计算各个事件的最早发生时间。 2. **计算事件最晚发生时间**:从最后一个事件开始逆向遍历整个图,确定每个事件的最晚发生时间而不影响整个项目的完成日期。 3. **确定活动松弛时间**:对于每一个活动,其松弛时间为该活动结束事件的最晚发生时间减去开始事件的最早发生时间再减去活动本身的持续时间。 4. **识别关键活动关键路径**:如果某个活动的松弛时间为0,则这个活动就是关键活动,属于关键路径的一部分。 ### 图形化方法 在实现了上述算法之后,可以通过多种方式对结果进行可视化。一种常见的做法是利用网络图或者甘特图来进行展示: - **网络图**:在网络图中,节点代表任务,箭头表示任务之间的依赖关系。关键路径可以用不同的颜色或加粗线条突出显示。 - **甘特图**:这是一种条形图,它展示了项目的进度计划,横轴代表时间,纵轴代表任务。关键路径上的任务会以特定的方式标记出来,比如红色条形,以便于直观看到哪些任务是至关重要的。 ### 示例代码 这里提供了一个简单的Python示例,用于创建一个基本的关键路径问题并用matplotlib库绘制出对应的网络图。请注意这只是一个简化版的例子,实际应用中可能需要更复杂的逻辑来处理真实的数据结构。 ```python import matplotlib.pyplot as plt import networkx as nx # 创建一个空的有向图 G = nx.DiGraph() # 添加节点和边,这里假设我们有一个简单项目包含五个任务A,B,C,D,E edges = [('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'E')] G.add_edges_from(edges) # 计算关键路径(在这个简化的例子中,直接指定关键路径) critical_path = ['A', 'B', 'C', 'D', 'E'] # 设置节点属性,为后续绘图做准备 pos = nx.spring_layout(G) # 定义布局 node_colors = ['red' if node in critical_path else 'blue' for node in G.nodes()] # 绘制图形 plt.figure(figsize=(10, 6)) nx.draw(G, pos, with_labels=True, node_size=700, node_color=node_colors, font_weight='bold') plt.show() ``` 这段代码首先导入了必要的库,然后定义了一个简单的项目模型,接着设置了关键路径,并最终使用`networkx`和`matplotlib`库将这些信息以图形的形式呈现出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值