發表文章

機率分配 - Part 6 Poisson

圖片
Poisson分配在系統模擬中是非常重要的機率分配函數。因為,他確切與時間有關係。你要說他很難,還真難。有人喜歡把他跟 二項分配 ,或超幾何分配等有得沒有的作比較與轉換,這跟系統模擬無關,系統模擬要的是情境,要的是歷史資料。也就是說,情境符合命題,然後歷史資料看看顯不顯著,再經過「嚴謹」的適合度檢定,沒有什麼重大意外,就用吧。怎麼說呢?歷史資料不是母體,既然不是,就會有偏差。既然有偏差,你要怎麼知道這個偏差是哪兒發生。搞不好一開始你的抽樣就不對了,樣本根本無法代表母體。後面作一堆,都是作辛酸的。要不就是發表論文用,這兒不搞這。系統模擬最終成果也是資料,由自己產生的資料來驗證模型的正確性,所以,需要兩階段。這篇 發展模擬系統之五大循環  約略有提到這個概念。 先來看看命題,在單位時間內,發生成功事件的次數。滿足Poisson的條件有三個: 條件 (i)表示在時間 0 時,成功次數是 0。  條件(ii)說在互不相交的時段 (time intervals) 內的試行是相互獨立的。  條件(iii)說只要時段長度相同, 不同時段內成功次數有相同的機率分佈。 你可想像自己在坐在咖啡店內,透過櫥窗向外看。每五分鐘(單位時間)內,去算一下有幾台車經過。每五分鐘就要重新起算。若你每天早上同一個時段都來觀察收集資料,你會得到面前這條馬路的車流量,他會服從Poisson分配。而問題在ℷ是多少。好吧,簡單的說,如果你收集到的每五分鐘的車輛數,推估母體的平均數,這個ℷ就是平均數。想要有感覺,請參考 等候理論 這篇講到的到達率。 來看機率分配函數與累積分配函數之公式吧。 這公式不好懂(計算)了吧。唉~誰叫你有手算勒。在已知ℷ的前提下,要問單位時間內,車子通過x=0的機率是多少,通過x=1的機率是多少,通過....。 想一下,系統模擬要什麼。我要的是x呀。單位時間內,透過Poisson讓我取得來客數。到底會有幾個人,我不知道,隨機,一切隨機。(抱歉,又來了) 還是來看累積分配函數的圖,更有感覺。看資料的長相,勝過公式計算。 在系統模擬中,雖然設ℷ為3,但是取得2或4的結果,都不用太驚訝。若取得-1個,那才值得驚訝。因為,一切到0為止。到目前為止所講到的機率分配函數都是到0為止(繞口)。需要得到負數值的,就得使用其他機率分...

機率分配 - Part 5 Geometric

圖片
Geometirc又叫幾何分配。經過之前分配的說明,我的習慣就是先問這個分配的命題是什麼,然後想想是什麼模擬情境(也是真實情境)中,符合其命題。 首先定義,一次試行的成功機率為p,失敗就是(1-p)。開始試行,直到成功為止,也就是說,要作幾次(x)才會成功。第幾次(x)成功的機率是多少。也就是說,前x-1次都是失敗的。想想Binomial,那個n已經被x取代了,成功了,就停止試行了。 想想玩大富翁,只要骰子丟出一個3,就有大獎。那丟出3的機率是1/6。所以 第一次就成功 1/6。 第二次才成功,表示第一次失敗。5/6*1/6 第三次才成功,表示前兩次失敗。5/6*5/6*1/6 以此類推。 接著來看函數定義。稍微補充一下,下圖的x是代表失敗的次數,所以會從0開始,第一次成功,就表示0次失敗。用失敗,函數看起來比較乾淨。Anylogic定義的x是失敗次數,所以後面的圖形請注意一下。 現在看機率分配函數的部分,應該沒有問題了吧。成功就只會有一次,其他的都是失敗。他不會發生對稱,不會變成Normal,但是他會變成Exponential,當p的機率很低很低時。Geometric x不會是負數,Exponential可以。聽不懂,沒關係。多玩玩系統模擬,自然會上手。來看看直方圖了 先來個剛剛擲骰子的。p是0.167。 x=0時(第一次成功)時,其機率是0.167,隨著次數增加,自然成功機率變小。 p=0.5看看。當然不會對稱。 來看看p很小很小時,p=0.001。是不是很像Exponential,只是一切到0為止。 在模擬中怎麼用呢?根據歷史資料,我們知道這台設備,每平均生產1000個零件後,就會當機。所以,我們設定設備的MTBF( M ean  T ime  B etween  F ailures),也就是平均故障間隔時間, 我們就會用這個機率分配函數。至於第幾次會掛,誰曉得。另外,掛點了,要修多久,又是另一個故事,另一個分配。 系統模擬的模型,就是由一對不知道結果的函數所組合起來,形成一個天知道的世界,才真正與實務情境相匹配。

機率分配 - Part 4 binomial

圖片
Binomial中文叫二項分配。這個機率分配函數的命題是說,在單一一次試行的機率是已知為p。然後,我連續執行n次試行,且這n次試行的每一次間都是獨立事件。所謂獨立事件的意思是彼此不受影響,沒有前後順序關係。抽號碼球為例,抽完放回,那每一次抽的事件都是獨立的,因為其可以抽取的球數(狀態),跟前一次都一樣。抽完不放回,那就非獨立了。因為,球數(狀態)已經與前一次不相同,而且剩餘球數是受上一次抽的事件結果所影響。換另一個說法,獨立事件就是組合,非獨立事件就是排列。 回到主題,命題想問的是說,我進行了n次試行,其中有k次成功的話,其機率是多少。(還是要補充一下,已知p,已知n,模擬系統要的是k)。 下圖是他的機率函數與累積函數。 慢慢地,看到這些函數應該不會害怕了。就用擲杯為例,每次丟兩支,每一支有兩種狀態,但這兩支也是獨立事件。所以總共有三種狀態,兩者皆凸(陰),兩者皆平(陽),兩者相反稱為聖杯。定義,丟出聖杯為成功事件,其機率為1/3。本次實驗情境要求要丟5次,那請問成功0次,成功1次,成功2次,成功3次,成功4次,成功5次的機率個別是多少。這個幾次,就是x,他不會成功6次或6次以上喔。當然也不會小於0次。 成功0次時,五次中,五次皆為失敗, (1-1/3)*(1-1/3)*(1-1/3)*(1-1/3)*(1-1/3) 。 成功5次時,五次中,五次皆為成功,1/3*1/3*1/3*1/3*1/3。 成功1次時,五次中,有一次成功,那是哪一次呢?有五種可能性,所以要先用組合,5取1,然後乘上機率(1/3)*(1-1/3)*(1-1/3)*(1-1/3)*(1-1/3)。 成功2次時,五次中,有兩次成功,那是哪兩次呢,用組合計算,可知有10種可能性。然後再乘上機率(1/3)*(1/3)*(1-1/3)*(1-1/3)*(1-1/3)。 其他的就類推了。 忍不住還是要強調一下,系統模擬不是要那個機率值,而是要得到幾個成功或失敗。舉例,假設一個生產線的不良率是0.005,這就是p,然後模擬中產生的10000個entity來代表這個生產線的產出物,這就是n,那模擬系統就會依據機率分配函數的特性產生幾個不良品出來,這個就是x。不要問我有幾個(x是多少),我也不知道,隨機,一切隨機。 接著來看累積分配函數。這個就要看直方圖才有感覺,別忘了,這...

機率分配 - Part 3 bernoulli

圖片
開始來講一些常用或簡單的機率分配函數。這邊不強調學術性,純粹從應用的角度出發。先從最簡單的bernoulli開始吧,他是離散型機率分配函數。他是概念基礎,讓我慢慢道來,別白努力了。 bernoulli的機率函數與累積分配函數如下圖。 bernoulli是一次試行。什麼叫試行呢?就是做一個動作或者一個實驗,也就稱之為一個事件,這個事件發生後產生一個結果狀態。而bernoulli適用於一個試行所產生的結果,只會有兩種狀態,要不成功,要不就是失敗。例如,丟銅板,不是正面就是反面。我們定義命題說,丟出正面的叫成功,丟出反面的叫失敗。 那擲骰子可不可以呢?可以呀,只要事件描述,也就是命題正確就可用。這時候,就帶出p的意義了。也就是說,你的命題中只要能說出某一個狀態成立時,他的機率是p,那其他不管是什麼阿貓阿狗,他的機率就是1-p,能這樣子描述命題,就可以用bernoulli。 丟銅板,我的命題是出現正面的機率是多少?根據正常的銅板而言,應該是0.5。所以,反面呢?是1-0.5=0.5(為何不直接說0.5,這是定義的問題。)問題是,你不知道你的銅板到底正不正常呀,所以要試行n次,越多次越好,然後算出x/n就是p。n是總試行次數,x是結果狀態為正面者。也許你會發現原來,這個銅板並不是正常的。這也就是告訴你,不要去賭博,因為,光看幾次是不準的,你也沒有足夠的時間與賭金可以試行趨近無限大的n次。 那骰子呢?還是要先說,他是一顆正常的骰子。我們的命題是說,出現為1的機率是多少,非1的機率是多少。原則上,我們應該要試行趨近無限大的n次之後,才會知道出現1的機率是多少。只是我們可以認知他是一個正常的骰子,然後用數學我們可以知道有六面,出現其中一面的機率是1/6。所以,推斷當我試行趨近無限多次的n後,可以累算出1的機率是(相當逼近於)1/6。那非1的,也就是丟出2,3,4,5,6的機率是1-1/6=5/6。 以上解釋了那個機率函數。x是一次試行,其結果滿足命題定義中的成功。當x為成功時,他發生的機率是p。很繞口,但是這是基本概念。 問題來了,系統模擬要怎麼用。很多地方都會用到,只要是有if,或者需要分化成兩類的都可以用。例如,病患性別定義女生叫成功,男生叫失敗。這時候p是多少,就是依據你的歷史資料來的呀。根據這個診所的歷史資料得知,女生的比率為0.6,所以男生...

機率分配 - Part 2

圖片
看完手動模擬之後,問題應該要更多更多了。 那只有一天的資料耶,隔天病人還會照著相同的時間來嗎?當然不會,如果都一樣,那是數學模擬,系統模擬就不用再談下去了。 問題是,隔天的病人會有哪些時間點進到診所呢?誰曉得,還沒發生的事,誰知道。系統模擬又不是在搞算命?那就等明天發生再說吧!這不是更好笑了,都已經發生了,還要系統模擬幹嘛? 是的,鑑往知來。如果我們收集夠多的歷史資料,能夠找到什麼樣的機制或方法,而這個機制或方法所產生出來的「時間點」,非常貼近於歷史資料的趨勢,那就很棒了呀。這個機制就算是拿骰子來,說不一定也可行,只是沒有說服力。這裡是科學,不是命理學。 所謂這個機制與方法,我們統稱為機率分配函數。也就是說,假設我們有一個函數,當你給了x,或者是ℷ (平均數)等,他會回應給你一個數字,這個數字可以用於模擬中,去取代原本給定的數字。這個函數每次產生的可能都會不一樣,但是,絕對符合實務情境。 但,這個函數難求呀。 首先什麼叫夠多的歷史資料,就算夠多,那函數要長什麼樣子呢?哈~他絕對不會是我們這麼簡單腦袋能想的。這是人工智慧的前身,資料科學的重點吧。 系統模擬是應用之學,你也許可以不用太計較。但,他還是有個過程可以讓我們遵循。目前被找出來的機率分配函數,非常的多。下圖是AnyLogic支援的部分,但是,建模時不受此限,仍可透過Table Function來自建自己的機率分配。 這些可是人家辛苦找出來的,是前人努力成果。你要自創一個?我是不會幹這事,我只想收集足夠的歷史資料,透過統計手法,好好找一個機率分配函數來套用。 這個統計手法,其實就是最基礎的次數分配函數。此時,不得不提醒了,次數方配函數與機率分配函數,因果相依,相互為用。 次數分配函數為果,機率分配函數為因。 收集到的資料是果,那什麼因造成的,在真實世界中還真的不知道。所以,我們想用果來推因(我們找到的因,都不是真正的因,都只是在有限空間中的一種表象)。統計的說法就是從樣本中推估母體,問題就出在抽樣過程,你根本無法確保你的樣本足以代表母體。就算是用盡各種統計手法來證明,也沒有人敢說100%的信賴區間。 我們就只能試著找出一些機率分配函數,透過他所產生的資料,畫出次數分配函數(直方圖)居然是那麼的神似。好吧,那我就拿這個機率分配函數來當作母體。因為,我有百分之XX的把握,產出資料與實務資...

手動模擬

圖片
所謂打鐵趁熱,上回留個「次數分配-直方圖」與「機率分配函數」之間的關係與應用原想接著來說說,但時間有限,所以,先來講講手動模擬。 ========== 透過手動模擬,對於模擬所需要的「時間」能有更清楚的理解。網路上有說十維空間,那是數學的世界。但是透過模擬系統,我們可以掌握時間,可以達到仿四度空間的能力。 「時光」,時不可逆,光可逆。 透過模擬系統的時間架構,可以預測未來。若不滿意,可以拉回現況時間點(抱歉,已經不再是上一個模型的啟動時點),再來一次。 上回收集的原始資料可拆解兩個使用目的病患到達時間與服務時間。兩者並列如下。 對模擬來看,時間雖然持續性發生,但是發生任何事件時,都是一個頓點,外力介入點,程式撰寫點。這跟電腦系統是相同的道理。也就是說,你要設定中斷點,並且收集必要資料。 我們先把收集什麼資料放一邊,專心在到底可以有什麼樣的事件,各事件的關係以及跟等候理論到底有什麼關聯性。 首先我們要來問問,既然時間不斷地演進,那到底由誰來決定斷點呢?就我們的模型來說,就是那個病患,由他來決定很多事件的發生與結束。這個傢伙叫Entity,在Anylogic中叫Agent。 就是這個entity遊歷了我們模擬系統中的元素,抱歉,條件複雜下,哪些Entity遊歷了哪幾個元素,不到最後關頭,我們還不曉得勒。這些過程重不重要,就是決定你要收集哪些資訊了。 回過來說Entity因為遊歷了元素,所以觸發元素所支援的中斷事件。一個模擬系統內,往往不會只有一個Entity,但也不可能無限制,甚至不同模擬規模就得設定其Entity數量。這也是為何大巨蛋疏散模擬,要設定不同的人員數量。 言歸正傳,那到底有哪些中斷事件,哈~還是跟元素的設計目的有關。不過,一般起碼都會有{初始、[{到達、離開}]、結束}。有看懂嗎?硬是要用JSON表示法。整體而言是一個物件,一定有初始、結束,然後中間歷經不同元素,是可重複的陣列,裡面會有一個{到達、離開}的物件。模擬結束後,這兩個數據一定要同時存在,不會有Entity進入元素後,沒有離開的。 ========= 準備好基本資料與基本知識後,我們開始用Excel進行手動模擬。首先要準備好模擬原始狀態的試算表。這個模型只有一個Queue,只有一個Service。多了,老子才不幹勒,白癡才會用手動去搞1/M/M的...

機率分配 - Part 1

圖片
系統模擬之精彩處,在於他不是數學模式(你要他是也可以,在驗證階段),而是基於模擬情境,應用符合實務之機率分配函數。舉凡系統中所有的數字,都可以試圖找到一個恰當的機率分配函數來代表他。這一塊真的不容易簡易說清楚,光是看到一堆機率函數就傻眼了,甚至來龍去脈都搞不清楚。 什麼是恰當呢?既然是隨機,每次結果就會不一樣,既然不一樣,那要怎麼說對與錯呢?所以,這個取決於你對模型的精準度要求,也就是你能夠接受的誤差範圍。 這下子,問題又來了,什麼是你能夠接受的誤差範圍呢?在這邊講也講不完,到後期講到模型最佳化時,也許會試圖來說清楚,這邊就按下不表。這麼說吧,你有閒工夫,去收集到最完整的原始資料,以統計的手法,找出最適之機率分配函數,然後在應用此機率分配函數到模型中,來產生數據資料。繞口了吧。 好吧,那就偷懶,其實我們只會用到幾個常用的機率分配函數。甚至說,試圖用大數法則說服自己,通通都是Normal 分配。要不就再偷懶一點直接用Triangular分配,什麼,也還是不要,那~用Random吧。只要最後的產出資料落在你可以接受的誤差範圍之內,沒有人會在意你用的是什麼分配。當然,這個誤差範圍不能太離譜呀。你的模型使用「分鐘」做模擬單位時間,卻說可以接受「小時」的誤差範圍,這就太離譜了。若你的模型用「天數」作模擬單位時間,誤差在30分鐘都是合理範圍。抱歉,還是要說,看你對於模擬精準度的要求。 原始資料收集是建置模擬系統的基礎工作之一。是苦工,卻不可逃避。然而,原始資料到應用於模型中仍然有些差距。下圖是我們收集病患進到診所的原始資料。請稍微注意一下數據內容,是的,都是時間點。因為,就收集資料的角度來說,每一個事件的發生或結束,最方便的方法,就是紀錄當時的時間。 若上一篇有跟到,有理解到的話,這些資料並不能直接使用到模擬系統中。補充一下,就Anylogic來說,他是可以直接使用原始資料。可能需要回顧一下 模擬時間 這篇所題的觀念。 在模擬系統中,我們想要使用的資料是: 這些病患到達診所的情境會符合什麼樣的機率分配。 從進到診所到被醫師看診,他願意等候的時間是符合什麼樣的機率分配。 從他進到診間到離開診間,中間接受醫師看診的服務時間是符合什麼樣的機率分配。 從他離開診間到離開診所,中間他停留在診所內的時間又是符合什麼樣的機率分配。 太多了,如果你的模...