蔡永勇++呂超賢++許燕++徐永紅
摘要:由于現(xiàn)代項目的大型化和項目復(fù)雜性的不斷增加,如何對項目的進度進行正確的預(yù)測和合理的規(guī)劃已經(jīng)受到越來越多的關(guān)注,傳統(tǒng)的CPM/PERT方法已經(jīng)難以滿足人們的需要。本文對現(xiàn)有的進度評估技術(shù)進行了改進,加入了對四種任務(wù)邏輯關(guān)系的支持,并給出了資源沖突時的解決策略,設(shè)計并實現(xiàn)了一個面向復(fù)雜項目的進度風(fēng)險評估方法,不僅支持多種隨機變量的抽樣,還能夠給出工期優(yōu)化策略,旨在幫助項目決策者根據(jù)仿真結(jié)果識別關(guān)鍵任務(wù),以此來制定合理的工期計劃。
關(guān)鍵詞:進度風(fēng)險評估;Monte Carlo網(wǎng)絡(luò);成本風(fēng)險
中圖分類號:TP391. 41
文獻標識碼:A
DOI: 10.3969/j.issn.1003-6970.2015.07.013
0 引言
根據(jù)現(xiàn)在美國項目管理協(xié)會的劃分,風(fēng)險管理過程分為規(guī)劃風(fēng)險管理、風(fēng)險識別、實施定性風(fēng)險分析、實施定量風(fēng)險分析、規(guī)劃風(fēng)險應(yīng)對、監(jiān)控風(fēng)險6個部分。而風(fēng)險類型又主要有費用風(fēng)險、進度風(fēng)險、技術(shù)風(fēng)險、計劃風(fēng)險等等。而項目在實際運作中,會受到諸多因素的影響。項目在施工過程中,人們往往將項目的進度作為最重要的控制目標,尤其是在大型工程項目的建設(shè)上,項目進度常被當做首要控制目標。
“Monte Carlo”一詞源于摩納哥的Monte Carlo賭場,賭場中“輪盤賭”之類的游戲與概率、隨機抽樣等有著類似的原理。Monte Carlo網(wǎng)絡(luò)法亦稱為隨機抽樣法,該法是實驗數(shù)學(xué)的一個分支,是利用隨機數(shù)進行統(tǒng)計實驗來解算數(shù)學(xué)問題的方法。Monte Carlo網(wǎng)絡(luò)的本質(zhì)是對隨機變量進行概率分布估計,具體的做法是用隨機抽樣來抽取符合特定分布的偽隨機數(shù),采用某種特定方法產(chǎn)生隨機數(shù)和隨機變量,仿真隨機事件,對結(jié)果進行統(tǒng)計處理,從而得到問題的解。
Monte Carlo網(wǎng)絡(luò)方法根據(jù)事物運動過程的數(shù)量和幾何特征,在確定的分布中提取隨機變量,進行多次抽樣。在具體的實驗中,模擬次數(shù)越多,Monte Carlo網(wǎng)絡(luò)的精度也越高。
Monte Carlo網(wǎng)絡(luò)的基本步驟是:(1)通過敏感性分析,確定風(fēng)險變量。(2)構(gòu)造風(fēng)險變量的概率分布模型。(3)根據(jù)項目特點確定風(fēng)險問題的評價指標,建立風(fēng)險問題數(shù)學(xué)模型。(4)根據(jù)項目投資者的風(fēng)險承受能力確定模擬次數(shù)N。(5)對各個備選方案風(fēng)險變量進行隨機抽樣。(6)將各個備選方案的風(fēng)險變量的隨機抽樣值根據(jù)所建立的數(shù)學(xué)模型或者計算流程圖計算出項目評價基礎(chǔ)數(shù)據(jù)。(7)對各個備選方案風(fēng)險變量進行N次重復(fù)抽樣,產(chǎn)生各方案的抽樣值。(8)對各方案的結(jié)果進行統(tǒng)計分析。
本文應(yīng)用并優(yōu)化Monte Carlo網(wǎng)絡(luò)算法,包括隨機變量的生成以及考慮任務(wù)邏輯關(guān)系和資源的關(guān)鍵鏈算法且提出了當資源沖突時的解決方法。
1 隨機變量的生成
在進度管理中,任務(wù)的工時是一種期望值,應(yīng)當作隨機變量來處理。而在傳統(tǒng)的CPM方法中,工時直接被當作常量來處理,到了PERT方法中,開始認為工時服從Beta分布,進而通過估算最低值a,最可能值m,以及最高值b,來近似求得服從Beta分布的工時的均值 ,以及方差 ,但依舊誤差很大。鑒于現(xiàn)代復(fù)雜項目任務(wù)的復(fù)雜性,通過隨機方法來進行模擬能夠有效減少誤差。
本文采用Monte Carlo方法,通過構(gòu)造概率模型并對它進行隨機試驗來解算數(shù)學(xué)問題。Monte Carlo的核心在于根據(jù)已知分布產(chǎn)生簡單子樣,也就是產(chǎn)生一系列相互獨立且服從總體分布的隨機數(shù)。計算機高級語言都支持隨機數(shù)的產(chǎn)生,且可以認為它們是相互獨立且服從均勻分布的數(shù)列,因此剩下的工作就是根據(jù)這些服從均勻分布的數(shù)列產(chǎn)生服從特定分布的數(shù)列。
因為實際項目中任務(wù)服從的分布以連續(xù)分布為主,因此下面所述的方法和分布若無特殊說明,均是建立在連續(xù)分布的基礎(chǔ)上。對于形如 ,的累積分布函數(shù),目前主要的抽樣方法有直接抽樣法(又叫反函數(shù)法,逆變換法),合成法和篩選法。
本文針對三種特定的分布分別給出抽樣原理和實現(xiàn)步驟。
1.1 三角分布抽樣
三角分布亦稱辛普森(Simpson)分布,是一種連續(xù)概率分布函數(shù)。三角分布通??梢钥醋饕环N經(jīng)驗性的描述,比如可以用來描述人口,特別是當數(shù)據(jù)之間的關(guān)系已知而數(shù)據(jù)量又非常少的時候,它通過最小值、最大值和最可能的值來建立模型進行經(jīng)驗性的判斷。三角分布的累積分布函數(shù)(cumulativedistribution function)如(1)式,其中a為低限、c為眾數(shù)、b為上限,其中a代表的含義是出現(xiàn)最小值的概率,b代表的含義是出現(xiàn)最大值的概率,c代表的含義是出現(xiàn)最可能的值的概率:
(1)通過隨機數(shù)生成器生成服從U(O,1)的隨機數(shù)U。
(2)計算廠(x)的反函數(shù)f-1(x),獲取樣本x=f-1(U)
因此,對于生成的隨機數(shù)U,每次樣本x取值應(yīng)該為
1.2 正態(tài)分布抽樣正態(tài)分布又名高斯分布,其概率密度函數(shù)為
,而累計積分函數(shù)為 ,因為 無法直接計算,可見直接抽樣法對正太分布來說比較困難,目前主要的方法是進行近似計算,比如中提出的算法可以精確到小數(shù)點后16位。不過因為步驟繁瑣,難以編程實現(xiàn),因此這里選用的是Box-Muller方法來進行抽樣。Box-Muller算法隱含的原理雖然深奧,但結(jié)論卻是相當簡單:
(1)通過隨機數(shù)生成器生成服從U(O,1)的隨機數(shù)U和V
(2)計算 和
其中X和Y分別服從標準正太分布且相互獨立,可以任選其一作為抽樣結(jié)果,假設(shè)選取X作為結(jié)果,根據(jù)正態(tài)分布的特性,通過計算Xxa+μ即可,就可以得到服從N(μ,σ)的抽樣。
1.3 β分布抽樣
β分布是一個作為伯努利分布和二項式分布的共軛先驗分布的密度函數(shù),在機器學(xué)習(xí)和數(shù)理統(tǒng)計學(xué)中有重要應(yīng)用,主要用途就是給受限于有限長度的隨機變量來建立模型。β累積分布函數(shù) ,可以看出直接抽樣也是比較困難的,比較常用的方法有合成法和接受拒絕法。其中合成法依賴的定理是如果x和Y相互獨立,且x服從 ,Y服從 ,那么 服從B(a,β)分布。雖然β分布難以直接抽樣,但γ分布容易抽樣,因此可以通過γ分布來合成β分布,不過γ分布一般通過大量指數(shù)分布來合成,也比較耗時,這里采用馮諾依曼提出的接受.拒絕的方法來進行抽樣。endprint
首先滿足β分布的概率密度函數(shù)為 ,其中O
(1)選擇函數(shù)g(y),這里選擇g(y)=1,0≤y (2)找a,使得對于所有的x,均有 ,這里 ,為了方便,取a=3。 (3)生成y~U(O,1),U~U(O,1),并且判斷U是否大于20Y3(1-Y)2,如果成立Y則為本次抽樣結(jié)果,否則重新生成y和U,直至滿足條件為止。 2 任務(wù)邏輯關(guān)系轉(zhuǎn)換和進度推進仿真算法 在網(wǎng)絡(luò)計劃技術(shù)中,通常對圖的研究都僅限于FS型,包括各種經(jīng)典的圖論算法,也都是把前后節(jié)點之間的關(guān)系當作FS型來處理。而在實際的項目管理中,前驅(qū)任務(wù)和后繼任務(wù)之間的邏輯關(guān)系一共有四種,分別是: ①Finish-to-Start(FS):如圖1,前輩節(jié)點必須先結(jié)束,后繼結(jié)點才能夠開始。 ② Start-to-Start(SS):如圖2,前輩節(jié)點必須先開始,后繼結(jié)點才能夠開始。以修路為例,雖然可以一邊挖路一邊鋪瀝青,但是必須要先開始挖路再開始鋪瀝青。 ③Finish-to-Finish(FF):如圖3,前輩節(jié)點必須先結(jié)束,后繼結(jié)點才能夠結(jié)束。以鋪線為例,任務(wù)一往一棟樓中鋪線,任務(wù)二是檢查樓中鋪的線,那么必須等到鋪線完成后,檢查工作才可能停止。 ④Start-to- Finish(SF):如圖4,前輩節(jié)點必須先開始,后繼結(jié)點才能夠結(jié)束。還是以修房子為例,假設(shè)修房子必須用到材料A,那么直到材料A送達前,修房子都不可能結(jié)束。 基于傳統(tǒng)CPM算法的啟發(fā),本文設(shè)計了兼容這四種任務(wù)邏輯關(guān)系的進度推進仿真算法。 首先,對算法中涉及到的類型進行定義,用一個五元組Task(distri,per, prog,expS,expE,accS,accE)來表示項目中的任務(wù)。 其中,distri屬性和per屬性屬于任務(wù)的固有屬性,distri屬性代表Task的分布類型,比如三角分布、正態(tài)分布和β分布;per屬性代表的是任務(wù)的工時。而后面五個屬性是為了在仿真算法中記錄中間結(jié)果添加的屬性,其中prog屬性代表仿真過程中當前任務(wù)的進度,初始值為0,隨著時間的推進,prog不斷變大,當prog的值等于任務(wù)的工時per時,該任務(wù)完成(但還不一定結(jié)束,還需要參考accE屬性);expS屬性代表的是任務(wù)開始期望數(shù),屬性accS代表的是任務(wù)的當前開始期望數(shù),也就是當accS的值等于expS值時,任務(wù)可以開始;同理定義expE為任務(wù)結(jié)束期望數(shù),而accE代表任務(wù)的當前結(jié)束期望數(shù),當任務(wù)的當前結(jié)束期望數(shù)達到expE后,任務(wù)才可以結(jié)束。 接著用一個三元組Link(preTask,sucTask,type)來表示任務(wù)之間的邏輯關(guān)系,其中preTask屬性代表的是該關(guān)系連接的前驅(qū)Task,而sucTask屬性代表的是與之相連的后繼Task,屬性type則代表了該關(guān)系的邏輯類型。 算法思路:對所有的Link進行了遍歷,如果Link是FS或者SS類型,因為前驅(qū)任務(wù)的開始或者結(jié)束才會導(dǎo)致后繼任務(wù)的開始,所以后繼任務(wù)的開始期望數(shù)需要增加。同理如果Link的類型是FF或者SF型,那么需要增加后繼任務(wù)的結(jié)束期望數(shù)。核心思想是根據(jù)任務(wù)的開始期望數(shù)和結(jié)束期望數(shù)來判斷任務(wù)的開始和結(jié)束。算法采用了模擬的思想,即每次將所有任務(wù)向前推進一定的時間tmin(也就是找出那些距離完成時間最短的任務(wù),tmin為它們的總工時減去當前進度),然后將這些任務(wù)的prog屬性加上tmin代表時間向前推進。 本文對Task定義了三種狀態(tài),分別用三個集合加以表示,TR為初始任務(wù)的集合,包含的是還未開始的任務(wù),初始為所有的任務(wù)集合。TP為進行中任務(wù)的集合,當任務(wù)的當前開始期望數(shù)達標后,認為任務(wù)可以開始,這時將任務(wù)從TR移動到TP中,代表任務(wù)開始。TF為已經(jīng)結(jié)束任務(wù)的集合,當任務(wù)可以結(jié)束時,將任務(wù)移動至該集合。 在算法中,每循環(huán)一次就相當于一次時間的推進,且在循環(huán)中,算法會檢查和修改任務(wù)的狀態(tài)。其中,時間的推進用prog屬性來表示,通過從零增加prog的值到其工時,代表任務(wù)從開始到結(jié)束。而檢查任務(wù)是否能夠開始則通過判斷任務(wù)的當前開始期望數(shù)accS是否等于其開始期望數(shù)expS,檢查任務(wù)是否能夠結(jié)束則通過判斷任務(wù)的當前結(jié)束期望數(shù)accE是否等于其結(jié)束期望數(shù)expE。每當一個任務(wù)開始的時候,都需要對其后繼任務(wù)進行修改,如果它們之間的關(guān)系為SS型,則將后繼任務(wù)的accS屬性加1,如果它們之間的關(guān)系為SF型,則將后繼任務(wù)的accE屬性加1。同理每當一個任務(wù)結(jié)束的時候,需要對其后繼任務(wù)進行更新,如果它們之間的關(guān)系為FS型,則將后繼任務(wù)的accS屬性加1,如果它們之間的關(guān)系為FF型,則將后繼任務(wù)的accE屬性加1。 3 基于全拓撲排序的資源沖突解決策略 在考慮資源的情況下,任務(wù)執(zhí)行的邏輯順序不一定就是任務(wù)執(zhí)行的實際順序,關(guān)鍵任務(wù)工時的和也并非一定等于總工期。因此需要對第2節(jié)中的進度推進仿真算法進行改進。由于考慮資源的沖突,此時關(guān)鍵路徑不再是唯一制約進度的因素,非關(guān)鍵路徑上的任務(wù)也可以由于資源缺乏而拖延總工期。跟關(guān)鍵鏈法不同,本文的焦點是放在總工期的計算上,而上述算法也是拋棄了原來關(guān)鍵路徑的思想,以模擬的角度來考慮問題,以最小任務(wù)工時為單位,每次計算往前推進時間。但是,本法與關(guān)鍵鏈的思想并不矛盾,同樣可以往關(guān)鍵任務(wù)和非關(guān)鍵任務(wù)兩端加上緩沖時間更精確的為項目管理者提供進度規(guī)劃方面的建議,本文算法相當于為關(guān)鍵鏈提供了一個可行的拉動式進度計劃方案。
當調(diào)用進度推進仿真算法時可以發(fā)現(xiàn),資源沖突的問題其實可以等價于任務(wù)優(yōu)先級的問題,即有多個任務(wù)并行時,先將資源優(yōu)先分配給哪個任務(wù),擁有資源的任務(wù)可以隨著時間的推進而推進,而缺少資源的任務(wù)雖然在任務(wù)進行集合Tp中,但是卻不往前推進時間(即每次prog屬性不變)。因此問題被等價到了任務(wù)的優(yōu)先級上,一般來說,在設(shè)置任務(wù)屬性的時候,也會一起設(shè)置任務(wù)的優(yōu)先級,而對于設(shè)置了相同優(yōu)先級的任務(wù),可以通過枚舉的方式,進而運行進度推進仿真算法。具體的步驟是:
(1)首先求出任務(wù)網(wǎng)絡(luò)圖所有的拓撲排序序列,每一個序列就相當于一種潛在的任務(wù)優(yōu)先級序列,通過回溯來找出所有拓撲排序序列的算法。
(2)對上述求得的序列進行優(yōu)化,因為如果任務(wù)數(shù)目較多且任務(wù)邏輯關(guān)系復(fù)雜,全拓撲排序的結(jié)果可能非常大,甚至達到百萬的數(shù)量級,使得實際程序的運行效率低下。不過所幸實際中任務(wù)之間往往存在著各種約束,通過這些約束就能夠去除絕大部分的無用序列,從而使程序的效率得到保障。
4 進度更改算法
進度更改這里主要指的進行進度的壓縮,假設(shè)平均總工期為K,用戶設(shè)置的目標工期為M,若M 如果考慮任務(wù)的權(quán)重便可以照葫蘆畫瓢進行算法設(shè)計,假設(shè)當前有t1,t2,¨,tn那個任務(wù),每個任務(wù)的權(quán)重分別為P1,P2,…,Pn,其中關(guān)鍵任務(wù)為tc1,tc2,…,tcn,它們的權(quán)重為Pc1,Pc2,¨,,pcn,這里權(quán)重代表的是可壓縮性,即權(quán)重的數(shù)值越大,任務(wù)的可壓縮性越強。 在進度壓縮的過程中,重點應(yīng)該放在關(guān)鍵任務(wù)上,只需要對它們進行壓縮,但是需要注意壓縮過程關(guān)鍵路徑不應(yīng)該發(fā)生改變,那么當在壓縮關(guān)鍵任務(wù)時,只需要保證關(guān)鍵任務(wù)的工時即使被壓縮后也應(yīng)該是同時刻并行任務(wù)中最大的即可,所以根據(jù)上述一樣的思路,只是在壓縮過程中按照每個任務(wù)的權(quán)重來進行壓縮,而顯然,因為只考慮關(guān)鍵任務(wù),對于tci,應(yīng)該將工時壓縮到 ,此時若關(guān)鍵 任務(wù)工時小于非關(guān)鍵任務(wù)的工時,那么強制將非關(guān)鍵任務(wù)的工時減小到關(guān)鍵任務(wù)的工時,可見只需要稍稍修改ShrinkHours算法,將壓縮任務(wù)時的語句改為按照權(quán)重來進行壓縮即可。 最后在仿真完成結(jié)束后,需要根據(jù)已經(jīng)保存的仿真中間信息,對項目的進度風(fēng)險進行預(yù)估。假設(shè)進行了N次仿真,那么就記錄了N個工期,根據(jù)大數(shù)定理,當N足夠大時(一般取N為2000到10000次),便可以用這N個樣本值來代替實際值。項目風(fēng)險同樣通過這N個樣本值來進行計算,本文主要通過總工期區(qū)間統(tǒng)計圖和進度風(fēng)險圖來對風(fēng)險進行評估。其中,總工期區(qū)間統(tǒng)計圖表示的是N個總工期樣本值的分布情況,等價于之前設(shè)置的每個任務(wù)工時服從分布之和,也就是它們的組合分布,而該分布的期望則代表了最可能出現(xiàn)的總工期。進度風(fēng)險圖表示的是在不同總工期約束下,項目完成的風(fēng)險(即失敗率)。對于在工期M下的進度風(fēng)險,計算公式為 。也就是統(tǒng)計總工期小于等于M的個數(shù),再用1減去其占總個數(shù)N的比例。 5 結(jié)論 由于現(xiàn)代項目的大型化和項目復(fù)雜性的不斷增加,如何對項目的進度進行正確的預(yù)測和合理的規(guī)劃已經(jīng)受到越來越多的關(guān)注,傳統(tǒng)的CPM/PERT方法已經(jīng)難以滿足人們的需要。本文對現(xiàn)有的進度評估技術(shù)進行了改進,加入了對四種任務(wù)邏輯關(guān)系的支持,并給出了資源沖突時的解決策略,設(shè)計并實現(xiàn)了一個面向復(fù)雜項目的進度風(fēng)險評估方法,不僅支持多種隨機變量的抽樣,還能夠給出工期優(yōu)化策略,旨在幫助項目決策者根據(jù)仿真結(jié)果識別關(guān)鍵任務(wù),以此來制定合理的工期計劃。