發表文章

目前顯示的是 1月, 2018的文章

機率分配 - 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來說,他是可以直接使用原始資料。可能需要回顧一下 模擬時間 這篇所題的觀念。 在模擬系統中,我們想要使用的資料是: 這些病患到達診所的情境會符合什麼樣的機率分配。 從進到診所到被醫師看診,他願意等候的時間是符合什麼樣的機率分配。 從他進到診間到離開診間,中間接受醫師看診的服務時間是符合什麼樣的機率分配。 從他離開診間到離開診所,中間他停留在診所內的時間又是符合什麼樣的機率分配。 太多了,如果你的模

等候理論

圖片
等候理論( Queueing Theory )是非常實用且生活化的東西。生活周遭都有他的身影,舉凡你要排隊等著別人服務的事物都是,只是你沒有從作業研究或數學的角度來審視他而已。 這邊太學術的東西,我也談不起。只從系統模擬的角度切入,也先強調一下,等候理論只是系統模擬在離散事件或流程模擬中所需要的基礎。下圖是最基本的結構圖。 圈圈是代表提供服務的個體,注意,他並不一定是個人,像ATM也是一個提供服務者。 這個服務者就會衍生出一堆的問題,基本資料類,一次能服務多少人(還是要強調一下,接受服務的不一定非得要人),每次服務要多久時間。資料分析類,他的產能是多少,要的效能是多少,他的稼動率是多少。 這邊再補充一下,一個提供服務者被佔用,但並不一定代表他都在認真工作中。所謂的被佔用的概念,就是這段期間內,他不能夠提供給其他人服務。這段期間內,他也有可能在等待被服務者所需要的一些前置作業等。總之,實務情況如何,就算是很複雜,模擬系統的模型都得想辦法實踐出來。 像是樓梯的圖形就稱之為等候線,或者是等候區。兩者是有差異,等候線是不抽號碼牌,先來先排隊,由被服務者端決定順序;而等候區是抽號碼牌的,服務順序是由提供服務者來決定。這個等候線/區也會衍生很多問題。基本資料類,例如他的容量是多少,也就是說能排幾個人,能排多長,能等多久;可否插單。資料分析類,平均要等多久才能被服務到,一條等候線上大概會有多少人。 等候線/區左方箭號的部分就是指被服務者進來的方向,而提供服務者右方的箭號代表被服務者離開的方向。 被服務者也會衍生出好多問題,基本資料類,多久會來一個,或者是說,間隔多久會有一個。「平均多久來幾個」有學問一點,這叫做Arrival rate;「平均間隔多久來一個」有學問一點,這叫做Interarrival time。這兩者是一般初學系統模擬者,常常會搞混的東西。從單位角度比較好理解。注意,既然說平均就不會是剛好。 「平均多久來幾個」白話一點就是說每分鐘平均來1個人,單位是1人/分鐘。 「平均間隔多久來一個」白話一點就是說平均一分鐘會來一個人,單位是1分鐘。 希望這張圖能有說幫助。 以上講的是指一個「單元」的概念,有「來源」、「等候」、「服務」、「離開」等四個元素所組成。 實務上就會有很多種單元組合與元素組合的變化,也就是等候理