图--关键路径

图的其他章节

    在一个表示工程的带权有向图中,用顶点表示事件的开始或结束,用边表活动,权值表活动持续时间的图称为AOE网。AOE图中从起点到终点的最长持续时间路径就称之为关键路径,其由各个关键活动构成。该最长时间是整个工程完成的最短时间

关键活动

    假设有一道工序,时长为5,其中有并进的N个子工序,则对于橙、蓝、绿三条线而言

        蓝线必须在为0时开始,因为它是5个工时,即最早为0最晚为0

        绿线则相对比较随意一点,可以在1或2时开始,即最早为1最晚为2

        红线更随意,可以在1或2或3时开始,即最早为1最晚为3

        也就是说,绿线和红线有可容错的机会,蓝线却一点不能含糊

        故,蓝线为关键线,即关键活动

实现方式

    根据事件的最早和最晚开始时间计算活动的最早和最晚开始时间并作比较,如果相等则视为关键活动

事件的最早和最晚开始时间

    假设从A顶点到B顶点需要经过1个子活动且其持续时间为5,由于其仅受一个活动影响,则必须等待活动结束掉,即最早为5。最晚也为5,因为超过了5可能就会影响下一个工序从而导致整个事件的延期

    假设从A顶点到B顶点需要经过2个子活动ab,其中a持续时间为5,b为8,由于其受到2个活动影响,则必须等待活动b结束掉(因为活动a结束时尚不满足事件B的开启条件),即最早为8。同理,最晚超过8将导致延期

活动的最早和最晚开始时间

    当从A到B经过多个子活动时,活动持续最长的为关键活动时长。对于较短的活动而言,可以选择在关键活动时长-当前活动时长的任意时间内开始

图示

    事件的开始(st)和结束时间(et)

                  st       et    (st[j]=Max{st(i) + wi,j}    et[i]=Min{et(j) - wi,j})

        v1:   0         0    (源点为0)

        v2:      6         6

        v3       4         6     (V1-V5的关键活动时长为7,a4=a5不可选择,则a2可选择在6-4的时间内开始,但最晚为2,即2+4=6)

        v4       5         8     (V1-V8的关键活动为V1-V5-V8为14,a3可选择在14-4-2-5的时间内开始,但最晚为3,即3+5=8)

        ......

        v9       18       18  (汇点与源点相同)

    活动的开始(s)和结束(e)

                  s        e    (s=出度顶点的最早开始时间    e=入度顶点的最晚开始时间-活动持续时间)

        a1:     0        0    (源点为0)

        a2:   0       2    (a2对应的出度顶点为v1,其最早开始时间为0;入度顶点为v3,其最晚为6活动持续为4,即6-4=2)

        a3:   0       3    

        a4:   6       6

        ......

        a11:  14     14

JavaScript代码实现

    使用十字链表创建图

        1-节点结构

        2-初始化顶点表和边数组

        3-创建边表

    由于求vi-vj中vj的最早开始时间实际上是求vi至vj的路线的权值和的最大值,每一条从i到j的路线都是累加的过程,我们需要将累计的路线和来作比较并选择最长的路径。这与拓扑排序的运算过程一致

(对于v1-v5而言,会计算两次,第一次是v1-v3-v5=5即v5最早为5;第二次,j=1,e取vex[1].firstout即v2的出度边表头指针即v2-v5=1,k取e.adjout即v5在邻接表中的位置,vst[1]即v2=6 + 1 > 5,故vst[4]即v5=vst[1]即6+1=7)
(拓扑序列和事件的最早开始时间)

    最晚开始时间与最早相反,它由汇点向源点计算,对于汇点v9而言,由于整个工程的总时长限定,故其最早与最晚均为18。那么v7的最晚应当是16,因为其对应的a10活动需要两天。由于拓扑序列后v9一定在v7之后,v7一定在v5后,故只需要从后往前比较更新即可

(由于汇点的最晚时间是确定的,且一定是整个工程最晚的,故vet初始均为18;每次从拓扑序列中取出的值均按遍历出度表查找其历史活动持续时间,只有发现更小则更新。对于v5-v9而言,会进行两次:第一次18-4-7,第二次:18-2-9)

    计算关键路径

(若事件最晚开始时间为10,活动持续事件为6,则活动最晚在4开始,因为4+6=10)

你可能感兴趣的:(图--关键路径)