蒙特卡洛模擬作為一種常用的模擬技術,在PMBOK里經常可以看到它的身影,其主要出現在風險管理知識領域中的定量風險分析過程,是用于做項目定量風險分析的工具之一,同時蒙特卡洛模擬也可以用于估算進度或成本以及制定進度計劃等。(全文共?2741?字,閱讀大約需要?10?分鐘。)
蒙特卡洛模擬由于在PMBOK里講得較為簡單和抽象,理解起來稍微有點困難。為了讓大家更加通透地理解蒙特卡洛模擬的作用及其過程原理,本文試圖通過一個簡單的例子來實操模擬一下這個蒙特卡洛模擬的過程。
一、簡要介紹
到底什么是蒙特卡洛模擬呢?蒙特卡洛模擬是一種統計學的方法,用來模擬大量數據。可能童鞋們看到這個定義更暈了,到底什么是統計學方法,模擬大量數據干什么?別著急下面會慢慢一一道來。
我們先來簡單介紹一下關于蒙特卡洛模擬的一些背景知識。蒙特卡洛模擬是在二戰期間,當時在原子彈研制的項目中,為了模擬裂變物質的中子隨機擴散現象,由美國數學家馮·諾伊曼(學計算機的同學都知道這位馮同志的大名,人稱“計算機之父”)和烏拉姆等發明的一種統計方法。之所以起名叫蒙特卡洛模擬,是因為蒙特卡洛在是歐洲袖珍國家摩納哥一個城市,這個城市在當時是非常著名的一個賭城。因為賭博的本質是算概率,而蒙特卡洛模擬正是以概率為基礎的一種方法,所以用賭城的名字為這種方法命名。
蒙特卡洛模擬是在計算機上模擬項目實施了成千上萬次,每次輸入都隨機選擇輸入值。由于每個輸入很多時候本身就是一個估計區間,因此計算機模型會隨機選取每個輸入的該區間內的任意值,通過大量成千上萬甚至百萬次的模擬次數,最終得出一個累計概率分布圖,這個就是蒙特卡洛模擬。
二、 模擬過程
蒙特卡洛模擬在實際的項目管理應用中一般較為復雜,而且很多時候用在專業的項目風險分析軟件里面(比如Pertmaster),通常用在較為大型的項目和企業中。我們這篇文章只是為了讓童鞋們對于蒙特卡洛模擬有個更為直觀清晰的認識,同時鑒于篇幅和不至于讓講解過于晦澀,所以這兒我們只是準備用Excel工具來簡單地模擬和介紹一下蒙特卡洛模擬的實施操作過程,這樣大家也能對蒙特卡洛模擬有個更為直觀地了解。
我們以定量分析項目總持續時間為例來簡要介紹一下蒙特卡洛模擬。比如說我們現在有個項目,該項目共有三個WBS要素分別是設計、建造和測試,為了簡單起見我們假設這三個WBS要素的預估的工期概率分布都呈標準正態分布,各自的平均工期、標準差以及最悲觀、最可能和最樂觀的估計工期如下圖所示(我們這兒簡單地認為基于正態分布的工期的最悲觀/最樂觀的估算工期定在均值正負3個標準差的位置),而且三者之間都是完成到開始的邏輯關系,這樣整個項目工期就是這三個WBS要素工期之和。
現在我們需要用蒙特卡洛模擬來以這三個要素的工期的分布為輸入,來模擬得到整個項目的工期概率分布圖。由于設計、建造和測試這三個要素都是呈標準正態分布,我們可以根據上面表格中的各自的均值和標準差數據大致畫出這三個要素工期的概率分布圖如下面的樣子:
我們要用蒙特卡洛模擬來定量分析整個項目的工期進度風險。于是我們用計算機來模擬項目的實施,我們的思路是:第一步:隨機選取每個WBS要素的工期值作為輸入(因為每個要素的工期不是恒定的,本身就是一個估計的分布區間);第二步:然后把三個WBS要素的值相加得到整個項目的工期值,這樣就完成了一次模擬;第三步:重復第一二步,然后就這樣一次一次的模擬,需要模擬成千上萬次最終得到成千上萬個整個項目總工期的數值;第四步:再對這些海量模擬次數得到海量總工期數值進行統計分析,得出其最終的項目總工期估計的概率分布。
我們先做第一步。第一步需要我們先產生這些每個要素的隨機工期值。Excel里面有個函數可以生成呈正態分布的隨機數,就是NORMINV。我們的設計要素的第一個隨機工期取值的公式就是這么寫的:=ROUND(NORMINV(RAND(),$E$3,$F$3),0),如下圖所示:
解釋一下這個公式:ROUND(NORMINV(RAND(),$E$3,$F$3),0),RAND()?是生成0到1之間的隨機數,NORMINV(RAND(),$E$3,$F$3)?是生成呈均值為E3(圖中為14)、標準差為F3(圖中為2)的正態分布的隨機數,ROUND?是四舍五入的意思,這樣回車我們就生成了設計這個要素的第一個隨機工期值17。同理我們把這個公式值往下拉,復制400次(我們此例中模擬400次),就得到了400個呈正態分布的隨機工期值;然后建造和測試的隨機工期值也是照葫蘆畫瓢,這樣我們就得到了這3個要素的400次模擬的隨機值,再每次的3個要素的隨機值相加得到總工期的模擬值,如下圖所示:
此時前三步就做完了得到了總工期的一組數據(400個)。現在開始做第四步對這組數據做統計分析和作圖。
4.1?先把總工期這一列(圖中E列)400個值拷貝一份,粘貼數值到另外一列(注意粘貼的時候選擇“選擇性粘貼”然后選“值”,因為隨機數隨時變動,這兒需要把值固定下來),用MAX和MIN函數計算出這一列400個值的最大值為76,和最小值為45,作為分組依據,然后在旁邊?I?列依次升序排列42-78(前后多取幾個數值圖像更完整)這部分數值作為分組數據,如下圖所示:
4.2?然后計算每個分組數據在總工期這組數據中出現的概率,這兒需要用到函數FREQUENCY,計算概率的公式為:=FREQUENCY(H8:H407,I8:I40)/400,意思是統計每個分組數據在總工期這一組數據中出現的次數,再除以模擬總次數400就得到這個分組數據出現的概率。再計算一個累積概率值,累積概率值就是前面的所有單個概率值加起來的概率,比如算分組數據46的累積概率值就是把46以下的數值的概率值全部加起來,這樣我們就得到關于分組數據在總工期這組數據中出現的概率和累積概率的數據,如下表格所示:
4.3?通過對上面表格的數據,以分組數據為X軸,出現概率和累積概率的值為Y軸于是可以做出下面關于總工期的概率分布圖:
紅色柱狀圖是整個項目估計剛好多少天完工的概率數據,比如圖中60天對應的概率大約是11%,表示整個項目剛好60天完工的概率是11%;藍線就是我們PMBOK上定量風險分析得到的那張S曲線圖,也是我們最終蒙特卡洛模擬需要得到的最終的模擬輸出:總工期的概率分布圖。通過這個S曲線,我們可以預測整個項目在多少天內完工的概率。比如我們需要預測整個項目在56天完工的概率,通過S曲線了解到56天對應的累積概率是34%左右,也就是整個項目56天內完工的概率是34%,那么56天內不能完工的概率就是1-34%=66%,這就是風險。如果覺得風險太高無法接受,那么我們可以把工期適當規劃長一些,比如60天,這樣查詢S曲線可以得到60天內整個項目完工的概率是70%,這樣就只有剩下30%的不能按時完工的風險,項目在進度方面的風險就大大降低了。
好了,至此關于蒙特卡洛模擬的基本概念和操作流程就說完了,希望能通過本文對大家學習和理解蒙特卡洛模擬有所助益,如有任何疑問、建議或指正,歡迎留言交流,謝謝閱讀。
推薦閱讀作者更多的文章(直接點擊下面的標題):