接着說AOE網關鍵路徑尋找的方法


AOE尋找關鍵路徑的核心思想就是尋找事件和活動的最早時間和最晚時間(earlist time ,latest time),節點(事件)和邊(活動)的最早、最晚時間分別縮寫為etv,ltv,ete,lte(編程時候,也有用ve,vl,ee,el代替的)。關於最短時間最晚時間的取值,經常會有誤解,我們不妨簡化問題(我相信任何復雜的問題,都可以簡化為簡單的問題並入手分析)。

假如甲乙兩個人被領導分配工作,協同完成某一項工作,其中,領導分配工作用時10分鍾,甲完成他負責的工作用了50分鍾,乙完成他負責的工作,用了70分鍾。這個工程可以用AOE圖表示如下:

現在問,事件“人物完成”最早需要多長時間?顯然應該是10+70=80分鍾,而不是10+50=60分鍾,因為就算甲完成的早,但是有乙這個隊友拖后退(也許是乙的任務難度更大,題外話),整個任務最早也是80分鍾后完成,了解這個有人么用呢?可以了解是哪一個環節(活動)托慢了整個任務的效率,進而做改進。

現在我們知道了整個任務最快需要80分鍾,我們可以把最終的任務實踐看作一個大的工程的某一個環節(事件),則每一個事件的最早發生時間,其實也就是最長的時間。
我們把數據做一個簡單的記錄:
開始節點的最早發生時間:0
甲開始工作的最早發送時間:10,甲用時50分鍾
乙開始工作的最早發送時間:10,乙用時70分鍾
任務最早完成時間:80分鍾。

現在問:甲工作的最遲發生時間是在幾分鍾?我們知道,在整個工程的最短80分鍾時間內,乙一直在不停的工作,而甲呢,做完后,則可以休息20分鍾,當然,甲也可以拖拖拉拉的做,用70分鍾做完自己本可以50分鍾做完的事情,甚至甲可以休息20分鍾后再接着工作,絲毫不影響整個任務的時間進度。這就是說,甲最遲的開始時間可以是20分鍾后,等於80-50=30,這就是反方向,從最后一個節點向前推。

我們接着把問題再稍稍的復雜一點點,看下面這個圖,我們只看圖中紅色圈起來的部分。

假設V4的最早發生時間是第15分鍾,整個工程的最早完成時間是27分鍾,那么問,V4的最晚發生時間是第幾分鍾?
這里V4到終點分為兩個路線,我們把兩個路線的節點直接忽略,而把中間的邊的權重相加,變成:下圖:

相當於V4開始有兩種路線可以到達V9,耗時分別是11和12。這時候,如果問V4的最晚發生時間是第幾分鍾?如果我們用27-11=16,認為V4的最晚發生時間是第16分鍾,那么v4如果在第16分鍾開始按照下面的方案工作,則最終完成時間就是27分鍾,顯然托慢了工程的進度,是不正確的,正確的應該是27-12(最長路線)=15分鍾,也就是說:倒推最遲發生時間的時候,是減去最大值。
然后我們就可以自己動手,寫出上面圖中V0----V9所有事件的最早發生時間和最晚發生時間。寫一下,看看和我寫的一樣不一樣:

現在找一下關鍵路徑的點,看一下是不是我紅線沿途畫的這幾個點:

有沒有發現,關鍵路徑上的事件,他們的最早發生時間和最晚發生時間大小都是一致的?
注意,起始節點的最早和最遲都是0,結束節點的最早和最遲也相等,都是項目的最短時間(最大值)。
我們先把上面的思路總結成下面的公式,這是編程判斷的基礎:

是不是覺得自己可以絞盡腦汁寫代碼找出關鍵路徑了?別急,知道這些信息還不夠,如果有多個關鍵路徑,僅僅根據節點是看不出關鍵路徑的。你還需要知道活動的最早開始時間和最遲開始時間。
活動就是在節點<Vj,Vk>之間的一條有向線。活動的最早開始時間,顯然就是有向線的起始節點Vj的最早開始時間(也是之前最長活動時間的和),而活動的最遲發生時間,則和節點的算法類似,也是從工程的最早結束時間倒着推,一步步的減去最大值。
假設節點V[i]----->V[j]之間的活動是e[k],則活動e[k]的最晚開始時間,就是V[j]的最晚開始時間,減去活動的時間:公式:為

這個公式,可以只用兩個節點的圖分析一下,應該能夠分析出來。
如此,你試試寫出來上面圖中所有節點和邊的最早和最晚時間。看看是不是下面這樣子

上圖中,我把最早和最遲時間相同的節點和邊,用黃顏色填充,以便更醒目。(a0的最遲結束時間錯了,應該是4)
這樣子,我們就手工找到了關鍵路徑以及路徑上的節點。
下一篇隨筆將討論如何編程實現這個算法思路


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM