求关键路径

求关键路径

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。

关键路径是项目管理中一个重要的概念,用于确定项目中最长的路径,它决定了项目的最短完成时间。使用Lingo软件关键路径长度,一般可以通过建立线性规划模型来实现。以下是详细步骤和示例代码: ### 问题建模 假设一个项目有 $n$ 个活动活动 $i$ 到活动 $j$ 之间的持续时间为 $d_{ij}$。我们引入决策变量 $x_{ij}$ 来表示活动 $i$ 到活动 $j$ 是否在关键路径上($x_{ij}=1$ 表示在,$x_{ij}=0$ 表示不在),同时引入变量 $t_i$ 表示活动 $i$ 的最早开始时间。 #### 目标函数 目标是最大化关键路径的长度,即所有在关键路径上的活动持续时间之和: $$\max \sum_{i=1}^{n}\sum_{j=1}^{n}d_{ij}x_{ij}$$ #### 约束条件 1. **流量守恒约束**:对于每个非起始和非结束活动 $k$,进入该活动的路径和离开该活动的路径数量应该相等。 $$\sum_{i=1}^{n}x_{ik}=\sum_{j=1}^{n}x_{kj}, \forall k \neq s, k \neq t$$ 其中 $s$ 是起始活动,$t$ 是结束活动。 2. **起始活动和结束活动约束**:起始活动只有流出路径,结束活动只有流入路径。 $$\sum_{j=1}^{n}x_{sj}=1$$ $$\sum_{i=1}^{n}x_{it}=1$$ 3. **时间约束**:如果活动 $i$ 到活动 $j$ 在关键路径上,那么活动 $j$ 的最早开始时间应该不早于活动 $i$ 的最早开始时间加上活动 $i$ 到活动 $j$ 的持续时间。 $$t_j \geq t_i + d_{ij}x_{ij}, \forall i,j$$ 4. **变量取值约束**:$x_{ij}$ 是 0 - 1 变量,$t_i$ 是非负实数。 $$x_{ij} \in \{0,1\}, \forall i,j$$ $$t_i \geq 0, \forall i$$ ### Lingo代码实现 ```lingo ! 定义集合; SETS: NODES /1..n/; ! n 是活动的数量,需要根据实际情况修改; ARCS(NODES, NODES): D, X; ! D 是活动持续时间矩阵,X 是决策变量; ENDSETS ! 数据部分,需要根据实际情况修改; DATA: D = 0, d12, d13, ..., d1n d21, 0, d23, ..., d2n ... dn1, dn2, dn3, ..., 0; START = 1; ! 起始活动编号; END = n; ! 结束活动编号; ENDDATA ! 目标函数; MAX = @SUM(ARCS: D * X); ! 流量守恒约束; @FOR(NODES(k) | k #NE# START #AND# k #NE# END: @SUM(NODES(i): X(i,k)) = @SUM(NODES(j): X(k,j)) ); ! 起始活动和结束活动约束; @SUM(NODES(j): X(START,j)) = 1; @SUM(NODES(i): X(i,END)) = 1; ! 时间约束; @FOR(ARCS(i,j): T(j) >= T(i) + D(i,j) * X(i,j) ); ! 变量取值约束; @FOR(ARCS: @BIN(X)); @FOR(NODES: T >= 0); ``` ### 代码解释 1. **集合定义**:`NODES` 集合表示所有活动,`ARCS` 集合表示活动之间的连接,同时定义了活动持续时间矩阵 `D` 和决策变量矩阵 `X`。 2. **数据部分**:需要根据实际的活动持续时间矩阵修改 `D` 的值,同时指定起始活动和结束活动的编号。 3. **目标函数**:最大化关键路径的长度。 4. **约束条件**:包括流量守恒约束、起始活动和结束活动约束、时间约束和变量取值约束。 5. **变量类型**:使用 `@BIN` 函数将 $x_{ij}$ 限制为 0 - 1 变量,$t_i$ 是非负实数。 ### 运行代码 将上述代码复制到Lingo软件中,修改数据部分的活动持续时间矩阵和起始、结束活动编号,然后运行解器,即可得到关键路径的长度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值