使用 Erlang 快速建立模擬環境

本篇文章要談談我近期的一項工作項目。要解決的問題是,工廠的員工分配為幾個小組,每個小組有各自特定的工作指派數量,並且每個小組的員工都有各自特定的工作指派數量,令每個工作指派數量都表示為百分比,全部分組的工作需求比例總和為 1 (即 100% ) ,每一組的員工工作需求比例總和也都為 1 。待處理的工作以不定時、不定量的頻率來到,要按照每組、每人的工作需求比例將每一件工作分別派給大家,一件工作只能指派給一位員工。當開始工作之後,任何時間來看每個人接收的工作指派比例都應當符合預定的工作需求比例。

當時我到 Google Scholar 讀了一點資料之後,覺得這個問題的解決很符合貝式定理公式。貝式定理本來是指事件在限定條件之下發生或不發生的機率。而我覺得用到這個問題的場合,可以把機率代換成工作的需求比例。每一組都有指定的工作指派比例,並且在每一組限定範圍內,每一位員工又有自己的工作指派比例。看樣子是要用到二層貝式定理公式。於是,我做了一些推導與思考,找出一條可能成立的式子:


(組已指派工作量 x 個人已指派工作量 - 個人工作需求比例 / 全部待處理的工作數量)
 * (1 - 組工作需求比例 / 全部待處理的工作數量) / 組工作需求比例 / 個人工作需求比例

這條公式的意義很簡單,就不多解釋了。 在正確的式子成形之前,我還有幾條不夠穩定的式子,在做了程式驗證之後才找到這條最正確版本的式子。

接著,我需要一個模擬程式來檢查如果在實際工作環境中套用這一條式子是否可以正確運作。使用 Erlang 程式語言,我先定義所謂待處理工作是一列的二進位數字,用列表表示:

[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0]

1 表示在某個時間點有一件工作待處理, 0 表示在某個時間點沒有工作來到。任二個 1 之間存在的 0 數目多寡沒有固定規則。有了這樣的工作序列定義,可以用以下 order_rate/1 求工作的到達率。

order_rate([]) ->
    0.0;
order_rate(Order) ->
    length([ S || S <- Order, S > 0]) / length(Order).

後來,我把工作序列的產生寫成 order/0 函數,使用亂數產生隨機的待處理總工作量:

order() ->
    Count = random:uniform(80) + 50,
    Percent = random:uniform(100),
    { Count, Percent, order(Count, Percent) }.

order(0, _) ->
    [];
order(Count, Percent) ->
    Data = round(random:uniform() * 100),
    [if Data =< Percent -> 1; true -> 0 end|order(Count-1,Percent)].

接下來,將工作分組編碼,由 state/0 產生分組資料。每一筆記錄依序有六個欄位:組名、個人名稱、組已指派工作數量、個人已指派工作數量、組工作需求比例、個人工作需求比例。比例的百分比是用實數表示,比較容易計算。並且需注意每次修改工作分組的時候要把組的工作需求比例整理為總和為 1 ,並且也要注意每一組的人總和工作比例也是 1 。

% {Group, Name, G. receives, P. receives, G. rate, P. rate}
state() ->
    [{a, a_1, 0, 0, 0.25, 0.33  },
     {a, a_2, 0, 0, 0.25, 0.33 },
     {a, a_3, 0, 0, 0.25, 0.34 },
     {b, b_1, 0, 0, 0.3, 0.5  },
     {b, b_2, 0, 0, 0.3, 0.5  },
     {c, c_1, 0, 0, 0.45, 0.25 },
     {c, c_2, 0, 0, 0.45, 0.25 },
     {c, c_3, 0, 0, 0.45, 0.1  },
     {c, c_4, 0, 0, 0.45, 0.4  }].

在任何時間點,程式的核心工作是以下列式子求每一人的權重。

        [ {G,N,Gre,Pre,Gra,Pra,
                (Gra*Pra-Pre/O) * (1-Gre/O) / nz(Gre) / nz(Pre)
          }
         || {G,N,Gre,Pre,Gra,Pra} <- state() ]

O 是全部待處理工作數量,在有工作要處理時才做此運算,所以 O 始終大於零。分母位置的 Gre 和 Pre 分別是組已指派工作數量和個人已指派工作數量,這二個數字隨時都可能是 0 ,所以要用到 nz/1 保證產生正確的分母數字。當 nz/1 遇到參數為零時,傳回一個極小值。

nz(N) when N == 0 ->
    0.0000001;
nz(N) ->
    N.

基本單元整理好了,就可以把核心程式功能寫出來。以下是我的核心程式: run/1 將工作序列分解並依序輸入測試程序、 test/3 將工作一一按照權重指派給適當的員工。支援的函數有 state_print/1 將工作指派情況印出來、 test_print/1 印出過程中的參數情況 (包含權重) 、 qsort/1 按照權重排列員工順序、 assign/2 將指定的組和員工的工作指派分別加一。

run([]) ->
    State = state(),
    state_print(State),
    State;
run([Order|Os]) ->
    State = run(Os),
    if
	Order > 0 ->
	    State1 = test(length([ O || O <- [Order|Os], O > 0 ]),
		               order_rate([Order|Os]), State),
	    state_print(State1),
	    State1;
	true ->
	    State
    end.

test(O, D, State) ->
    if
	is_integer(D) ->
	    io:format("Order rate: ~w~n", [D]);
	true ->
	    io:format("Order rate: ~.2f~n", [D])
    end,
    State1 = [{G,N,Gre,Pre,Gra,Pra,
		    (Gra*Pra-Pre/O) * (1-Gre/O) / nz(Gre) / nz(Pre)
	         }
	        || {G,N,Gre,Pre,Gra,Pra} <- State ],
    test_print(State1),
    [{G,N,_,_,_,_,_}|_] = qsort(State1),
    assign([ {G1,N1,Gre,Pre,Gra,Pra} || {G1,N1,Gre,Pre,Gra,Pra,_} <- State1], {G,N}).

state_print([]) ->
    ok;
state_print([{G,N,Gre,Pre,Gra,Pra}|Ss]) ->
    io:format("~w:~w -> ~w ~w ~.2f ~.2f~n", [G,N,Gre,Pre,Gra,Pra]),
    state_print(Ss).

test_print([]) ->
    ok;
test_print([{G,N,Gre,Pre,Gra,Pra,S}|Fs]) ->
    io:format("~w:~w ~w ~w ~.2f ~.2f => ~.4f~n", [G,N,Gre,Pre,Gra,Pra,S]),
    test_print(Fs).

qsort([]) ->
    [];
qsort([Record|Rs]) ->
    qsort([X||X<-Rs,gt(X,Record)])
	++ [Record|qsort([Y||Y<-Rs,ge(Record,Y)])].

gt({_,_,_,_,_,_,Ja},{_,_,_,_,_,_,Jb}) ->
    Ja > Jb.

ge({_,_,_,_,_,_,Ja},{_,_,_,_,_,_,Jb}) ->
    Ja >= Jb.

assign([], _) ->
    [];
assign([{G,N,Gre,Pre,Gra,Pra}|State], {G,N}) ->
    [{G,N,Gre+1,Pre+1,Gra,Pra}|assign(State,{G,N})];
assign([{G,N,Gre,Pre,Gra,Pra}|State], {G,N1}) ->
    [{G,N,Gre+1,Pre,Gra,Pra}|assign(State,{G,N1})];
assign([{G,N,Gre,Pre,Gra,Pra}|State], {G1,N1}) ->
    [{G,N,Gre,Pre,Gra,Pra}|assign(State,{G1,N1})];
assign([State|Ss], Name) ->
    [State|assign(Ss, Name)].

最後將主程式加上,即可開始進行檢測。

-module(task).
-export([trial/0]).

trial() ->
    {Count, Percent, Zos} = order(),
    Os = [ Zo || Zo <- Zos, Zo > 0 ],
    run(Zos),
    io:format("~w 0/1s in rate ~w% were generated.", [Count,Percent]),
    io:format(" ~w 1s got in all ~w.~n", [length(Os), length(Zos)]).

執行結果列於下方。由過程中所印出的每人工作指派和比例來看,指派的工作數量非常符合預定的比例。由此可見貝式定理真是驚人地準確。

> task:trial().
a:a_1 -> 0 0 0.25 0.33
a:a_2 -> 0 0 0.25 0.33
a:a_3 -> 0 0 0.25 0.34
b:b_1 -> 0 0 0.30 0.50
b:b_2 -> 0 0 0.30 0.50
c:c_1 -> 0 0 0.45 0.25
c:c_2 -> 0 0 0.45 0.25
c:c_3 -> 0 0 0.45 0.10
c:c_4 -> 0 0 0.45 0.40
Order rate: 1.00
a:a_1 0 0 0.25 0.33 => 8250000000000.0020
a:a_2 0 0 0.25 0.33 => 8250000000000.0020
a:a_3 0 0 0.25 0.34 => 8500000000000.0020
b:b_1 0 0 0.30 0.50 => 15000000000000.0000
b:b_2 0 0 0.30 0.50 => 15000000000000.0000
c:c_1 0 0 0.45 0.25 => 11250000000000.0000
c:c_2 0 0 0.45 0.25 => 11250000000000.0000
c:c_3 0 0 0.45 0.10 => 4500000000000.0010
c:c_4 0 0 0.45 0.40 => 18000000000000.0040
a:a_1 -> 0 0 0.25 0.33
a:a_2 -> 0 0 0.25 0.33
a:a_3 -> 0 0 0.25 0.34
b:b_1 -> 0 0 0.30 0.50
b:b_2 -> 0 0 0.30 0.50
c:c_1 -> 1 0 0.45 0.25
c:c_2 -> 1 0 0.45 0.25
c:c_3 -> 1 0 0.45 0.10
c:c_4 -> 1 1 0.45 0.40
Order rate: 0.40
a:a_1 0 0 0.25 0.33 => 8250000000000.0020
a:a_2 0 0 0.25 0.33 => 8250000000000.0020
a:a_3 0 0 0.25 0.34 => 8500000000000.0020
b:b_1 0 0 0.30 0.50 => 15000000000000.0000
b:b_2 0 0 0.30 0.50 => 15000000000000.0000
c:c_1 1 0 0.45 0.25 => 562500.0000
c:c_2 1 0 0.45 0.25 => 562500.0000
c:c_3 1 0 0.45 0.10 => 225000.0000
c:c_4 1 1 0.45 0.40 => -0.1600
a:a_1 -> 0 0 0.25 0.33
a:a_2 -> 0 0 0.25 0.33
a:a_3 -> 0 0 0.25 0.34
b:b_1 -> 1 1 0.30 0.50
b:b_2 -> 1 0 0.30 0.50
c:c_1 -> 1 0 0.45 0.25
c:c_2 -> 1 0 0.45 0.25
c:c_3 -> 1 0 0.45 0.10
c:c_4 -> 1 1 0.45 0.40
Order rate: 0.50
a:a_1 0 0 0.25 0.33 => 8250000000000.0020
a:a_2 0 0 0.25 0.33 => 8250000000000.0020
a:a_3 0 0 0.25 0.34 => 8500000000000.0020
b:b_1 1 1 0.30 0.50 => -0.1222
b:b_2 1 0 0.30 0.50 => 1000000.0000
c:c_1 1 0 0.45 0.25 => 750000.0000
c:c_2 1 0 0.45 0.25 => 750000.0000
c:c_3 1 0 0.45 0.10 => 300000.0000
c:c_4 1 1 0.45 0.40 => -0.1022
a:a_1 -> 1 0 0.25 0.33
a:a_2 -> 1 0 0.25 0.33
a:a_3 -> 1 1 0.25 0.34
b:b_1 -> 1 1 0.30 0.50
b:b_2 -> 1 0 0.30 0.50
c:c_1 -> 1 0 0.45 0.25
c:c_2 -> 1 0 0.45 0.25
c:c_3 -> 1 0 0.45 0.10
c:c_4 -> 1 1 0.45 0.40
Order rate: 0.50
a:a_1 1 0 0.25 0.33 => 618750.0000
a:a_2 1 0 0.25 0.33 => 618750.0000
a:a_3 1 1 0.25 0.34 => -0.1237
b:b_1 1 1 0.30 0.50 => -0.0750
b:b_2 1 0 0.30 0.50 => 1125000.0000
c:c_1 1 0 0.45 0.25 => 843750.0000
c:c_2 1 0 0.45 0.25 => 843750.0000
c:c_3 1 0 0.45 0.10 => 337500.0000
c:c_4 1 1 0.45 0.40 => -0.0525
a:a_1 -> 1 0 0.25 0.33
a:a_2 -> 1 0 0.25 0.33
a:a_3 -> 1 1 0.25 0.34
b:b_1 -> 2 1 0.30 0.50
b:b_2 -> 2 1 0.30 0.50
c:c_1 -> 1 0 0.45 0.25
c:c_2 -> 1 0 0.45 0.25
c:c_3 -> 1 0 0.45 0.10
c:c_4 -> 1 1 0.45 0.40
Order rate: 0.50
a:a_1 1 0 0.25 0.33 => 660000.0000
a:a_2 1 0 0.25 0.33 => 660000.0000
a:a_3 1 1 0.25 0.34 => -0.0920
b:b_1 2 1 0.30 0.50 => -0.0150
b:b_2 2 1 0.30 0.50 => -0.0150
c:c_1 1 0 0.45 0.25 => 900000.0000
c:c_2 1 0 0.45 0.25 => 900000.0000
c:c_3 1 0 0.45 0.10 => 360000.0000
c:c_4 1 1 0.45 0.40 => -0.0160
a:a_1 -> 1 0 0.25 0.33
a:a_2 -> 1 0 0.25 0.33
a:a_3 -> 1 1 0.25 0.34
b:b_1 -> 2 1 0.30 0.50
b:b_2 -> 2 1 0.30 0.50
c:c_1 -> 2 1 0.45 0.25
c:c_2 -> 2 0 0.45 0.25
c:c_3 -> 2 0 0.45 0.10
c:c_4 -> 2 1 0.45 0.40
Order rate: 0.38
a:a_1 1 0 0.25 0.33 => 687500.0000
a:a_2 1 0 0.25 0.33 => 687500.0000
a:a_3 1 1 0.25 0.34 => -0.0681
b:b_1 2 1 0.30 0.50 => -0.0056
b:b_2 2 1 0.30 0.50 => -0.0056
c:c_1 2 1 0.45 0.25 => -0.0181
c:c_2 2 0 0.45 0.25 => 375000.0000
c:c_3 2 0 0.45 0.10 => 150000.0000
c:c_4 2 1 0.45 0.40 => 0.0044
a:a_1 -> 2 1 0.25 0.33
a:a_2 -> 2 0 0.25 0.33
a:a_3 -> 2 1 0.25 0.34
b:b_1 -> 2 1 0.30 0.50
b:b_2 -> 2 1 0.30 0.50
c:c_1 -> 2 1 0.45 0.25
c:c_2 -> 2 0 0.45 0.25
c:c_3 -> 2 0 0.45 0.10
c:c_4 -> 2 1 0.45 0.40
Order rate: 0.35
a:a_1 2 1 0.25 0.33 => -0.0216
a:a_2 2 0 0.25 0.33 => 294642.8571
a:a_3 2 1 0.25 0.34 => -0.0207
b:b_1 2 1 0.30 0.50 => 0.0026
b:b_2 2 1 0.30 0.50 => 0.0026
c:c_1 2 1 0.45 0.25 => -0.0108
c:c_2 2 0 0.45 0.25 => 401785.7143
c:c_3 2 0 0.45 0.10 => 160714.2857
c:c_4 2 1 0.45 0.40 => 0.0133
a:a_1 -> 2 1 0.25 0.33
a:a_2 -> 2 0 0.25 0.33
a:a_3 -> 2 1 0.25 0.34
b:b_1 -> 2 1 0.30 0.50
b:b_2 -> 2 1 0.30 0.50
c:c_1 -> 3 1 0.45 0.25
c:c_2 -> 3 1 0.45 0.25
c:c_3 -> 3 0 0.45 0.10
c:c_4 -> 3 1 0.45 0.40
Order rate: 0.38
a:a_1 2 1 0.25 0.33 => -0.0159
a:a_2 2 0 0.25 0.33 => 309375.0000
a:a_3 2 1 0.25 0.34 => -0.0150
b:b_1 2 1 0.30 0.50 => 0.0094
b:b_2 2 1 0.30 0.50 => 0.0094
c:c_1 3 1 0.45 0.25 => -0.0026
c:c_2 3 1 0.45 0.25 => -0.0026
c:c_3 3 0 0.45 0.10 => 93750.0000
c:c_4 3 1 0.45 0.40 => 0.0115
a:a_1 -> 3 1 0.25 0.33
a:a_2 -> 3 1 0.25 0.33
a:a_3 -> 3 1 0.25 0.34
b:b_1 -> 2 1 0.30 0.50
b:b_2 -> 2 1 0.30 0.50
c:c_1 -> 3 1 0.45 0.25
c:c_2 -> 3 1 0.45 0.25
c:c_3 -> 3 0 0.45 0.10
c:c_4 -> 3 1 0.45 0.40
Order rate: 0.41
a:a_1 3 1 0.25 0.33 => -0.0064
a:a_2 3 1 0.25 0.33 => -0.0064
a:a_3 3 1 0.25 0.34 => -0.0058
b:b_1 2 1 0.30 0.50 => 0.0151
b:b_2 2 1 0.30 0.50 => 0.0151
c:c_1 3 1 0.45 0.25 => 0.0003
c:c_2 3 1 0.45 0.25 => 0.0003
c:c_3 3 0 0.45 0.10 => 100000.0000
c:c_4 3 1 0.45 0.40 => 0.0153
a:a_1 -> 3 1 0.25 0.33
a:a_2 -> 3 1 0.25 0.33
a:a_3 -> 3 1 0.25 0.34
b:b_1 -> 2 1 0.30 0.50
b:b_2 -> 2 1 0.30 0.50
c:c_1 -> 4 1 0.45 0.25
c:c_2 -> 4 1 0.45 0.25
c:c_3 -> 4 1 0.45 0.10
c:c_4 -> 4 1 0.45 0.40
Order rate: 0.43
a:a_1 3 1 0.25 0.33 => -0.0041
a:a_2 3 1 0.25 0.33 => -0.0041
a:a_3 3 1 0.25 0.34 => -0.0035
b:b_1 2 1 0.30 0.50 => 0.0200
b:b_2 2 1 0.30 0.50 => 0.0200
c:c_1 4 1 0.45 0.25 => 0.0019
c:c_2 4 1 0.45 0.25 => 0.0019
c:c_3 4 1 0.45 0.10 => -0.0083
c:c_4 4 1 0.45 0.40 => 0.0120
a:a_1 -> 3 1 0.25 0.33
a:a_2 -> 3 1 0.25 0.33
a:a_3 -> 3 1 0.25 0.34
b:b_1 -> 3 2 0.30 0.50
b:b_2 -> 3 1 0.30 0.50
c:c_1 -> 4 1 0.45 0.25
c:c_2 -> 4 1 0.45 0.25
c:c_3 -> 4 1 0.45 0.10
c:c_4 -> 4 1 0.45 0.40
Order rate: 0.44
a:a_1 3 1 0.25 0.33 => -0.0020
a:a_2 3 1 0.25 0.33 => -0.0020
a:a_3 3 1 0.25 0.34 => -0.0014
b:b_1 3 2 0.30 0.50 => -0.0039
b:b_2 3 1 0.30 0.50 => 0.0143
c:c_1 4 1 0.45 0.25 => 0.0034
c:c_2 4 1 0.45 0.25 => 0.0034
c:c_3 4 1 0.45 0.10 => -0.0073
c:c_4 4 1 0.45 0.40 => 0.0142
a:a_1 -> 3 1 0.25 0.33
a:a_2 -> 3 1 0.25 0.33
a:a_3 -> 3 1 0.25 0.34
b:b_1 -> 4 2 0.30 0.50
b:b_2 -> 4 2 0.30 0.50
c:c_1 -> 4 1 0.45 0.25
c:c_2 -> 4 1 0.45 0.25
c:c_3 -> 4 1 0.45 0.10
c:c_4 -> 4 1 0.45 0.40
Order rate: 0.46
a:a_1 3 1 0.25 0.33 => -0.0002
a:a_2 3 1 0.25 0.33 => -0.0002
a:a_3 3 1 0.25 0.34 => 0.0004
b:b_1 4 2 0.30 0.50 => -0.0014
b:b_2 4 2 0.30 0.50 => -0.0014
c:c_1 4 1 0.45 0.25 => 0.0049
c:c_2 4 1 0.45 0.25 => 0.0049
c:c_3 4 1 0.45 0.10 => -0.0064
c:c_4 4 1 0.45 0.40 => 0.0161
a:a_1 -> 3 1 0.25 0.33
a:a_2 -> 3 1 0.25 0.33
a:a_3 -> 3 1 0.25 0.34
b:b_1 -> 4 2 0.30 0.50
b:b_2 -> 4 2 0.30 0.50
c:c_1 -> 5 1 0.45 0.25
c:c_2 -> 5 1 0.45 0.25
c:c_3 -> 5 1 0.45 0.10
c:c_4 -> 5 2 0.45 0.40
Order rate: 0.43
a:a_1 3 1 0.25 0.33 => 0.0014
a:a_2 3 1 0.25 0.33 => 0.0014
a:a_3 3 1 0.25 0.34 => 0.0021
b:b_1 4 2 0.30 0.50 => -0.0003
b:b_2 4 2 0.30 0.50 => -0.0003
c:c_1 5 1 0.45 0.25 => 0.0044
c:c_2 5 1 0.45 0.25 => 0.0044
c:c_3 5 1 0.45 0.10 => -0.0039
c:c_4 5 2 0.45 0.40 => 0.0016
a:a_1 -> 3 1 0.25 0.33
a:a_2 -> 3 1 0.25 0.33
a:a_3 -> 3 1 0.25 0.34
b:b_1 -> 4 2 0.30 0.50
b:b_2 -> 4 2 0.30 0.50
c:c_1 -> 6 2 0.45 0.25
c:c_2 -> 6 1 0.45 0.25
c:c_3 -> 6 1 0.45 0.10
c:c_4 -> 6 2 0.45 0.40
Order rate: 0.45
a:a_1 3 1 0.25 0.33 => 0.0029
a:a_2 3 1 0.25 0.33 => 0.0029
a:a_3 3 1 0.25 0.34 => 0.0036
b:b_1 4 2 0.30 0.50 => 0.0006
b:b_2 4 2 0.30 0.50 => 0.0006
c:c_1 6 2 0.45 0.25 => -0.0014
c:c_2 6 1 0.45 0.25 => 0.0039
c:c_3 6 1 0.45 0.10 => -0.0025
c:c_4 6 2 0.45 0.40 => 0.0018
a:a_1 -> 3 1 0.25 0.33
a:a_2 -> 3 1 0.25 0.33
a:a_3 -> 3 1 0.25 0.34
b:b_1 -> 4 2 0.30 0.50
b:b_2 -> 4 2 0.30 0.50
c:c_1 -> 7 2 0.45 0.25
c:c_2 -> 7 2 0.45 0.25
c:c_3 -> 7 1 0.45 0.10
c:c_4 -> 7 2 0.45 0.40
Order rate: 0.47
a:a_1 3 1 0.25 0.33 => 0.0042
a:a_2 3 1 0.25 0.33 => 0.0042
a:a_3 3 1 0.25 0.34 => 0.0049
b:b_1 4 2 0.30 0.50 => 0.0015
b:b_2 4 2 0.30 0.50 => 0.0015
c:c_1 7 2 0.45 0.25 => -0.0008
c:c_2 7 2 0.45 0.25 => -0.0008
c:c_3 7 1 0.45 0.10 => -0.0017
c:c_4 7 2 0.45 0.40 => 0.0018
a:a_1 -> 4 1 0.25 0.33
a:a_2 -> 4 1 0.25 0.33
a:a_3 -> 4 2 0.25 0.34
b:b_1 -> 4 2 0.30 0.50
b:b_2 -> 4 2 0.30 0.50
c:c_1 -> 7 2 0.45 0.25
c:c_2 -> 7 2 0.45 0.25
c:c_3 -> 7 1 0.45 0.10
c:c_4 -> 7 2 0.45 0.40
Order rate: 0.48
a:a_1 4 1 0.25 0.33 => 0.0038
a:a_2 4 1 0.25 0.33 => 0.0038
a:a_3 4 2 0.25 0.34 => -0.0037
b:b_1 4 2 0.30 0.50 => 0.0023
b:b_2 4 2 0.30 0.50 => 0.0023
c:c_1 7 2 0.45 0.25 => -0.0005
c:c_2 7 2 0.45 0.25 => -0.0005
c:c_3 7 1 0.45 0.10 => -0.0014
c:c_4 7 2 0.45 0.40 => 0.0022
a:a_1 -> 5 2 0.25 0.33
a:a_2 -> 5 1 0.25 0.33
a:a_3 -> 5 2 0.25 0.34
b:b_1 -> 4 2 0.30 0.50
b:b_2 -> 4 2 0.30 0.50
c:c_1 -> 7 2 0.45 0.25
c:c_2 -> 7 2 0.45 0.25
c:c_3 -> 7 1 0.45 0.10
c:c_4 -> 7 2 0.45 0.40
Order rate: 0.47
a:a_1 5 2 0.25 0.33 => -0.0025
a:a_2 5 1 0.25 0.33 => 0.0033
a:a_3 5 2 0.25 0.34 => -0.0023
b:b_1 4 2 0.30 0.50 => 0.0031
b:b_2 4 2 0.30 0.50 => 0.0031
c:c_1 7 2 0.45 0.25 => -0.0002
c:c_2 7 2 0.45 0.25 => -0.0002
c:c_3 7 1 0.45 0.10 => -0.0012
c:c_4 7 2 0.45 0.40 => 0.0026
a:a_1 -> 6 2 0.25 0.33
a:a_2 -> 6 2 0.25 0.33
a:a_3 -> 6 2 0.25 0.34
b:b_1 -> 4 2 0.30 0.50
b:b_2 -> 4 2 0.30 0.50
c:c_1 -> 7 2 0.45 0.25
c:c_2 -> 7 2 0.45 0.25
c:c_3 -> 7 1 0.45 0.10
c:c_4 -> 7 2 0.45 0.40
Order rate: 0.49
a:a_1 6 2 0.25 0.33 => -0.0016
a:a_2 6 2 0.25 0.33 => -0.0016
a:a_3 6 2 0.25 0.34 => -0.0015
b:b_1 4 2 0.30 0.50 => 0.0038
b:b_2 4 2 0.30 0.50 => 0.0038
c:c_1 7 2 0.45 0.25 => 0.0001
c:c_2 7 2 0.45 0.25 => 0.0001
c:c_3 7 1 0.45 0.10 => -0.0009
c:c_4 7 2 0.45 0.40 => 0.0030
a:a_1 -> 6 2 0.25 0.33
a:a_2 -> 6 2 0.25 0.33
a:a_3 -> 6 2 0.25 0.34
b:b_1 -> 5 3 0.30 0.50
b:b_2 -> 5 2 0.30 0.50
c:c_1 -> 7 2 0.45 0.25
c:c_2 -> 7 2 0.45 0.25
c:c_3 -> 7 1 0.45 0.10
c:c_4 -> 7 2 0.45 0.40
Order rate: 0.50
a:a_1 6 2 0.25 0.33 => -0.0013
a:a_2 6 2 0.25 0.33 => -0.0013
a:a_3 6 2 0.25 0.34 => -0.0012
b:b_1 5 3 0.30 0.50 => -0.0004
b:b_2 5 2 0.30 0.50 => 0.0033
c:c_1 7 2 0.45 0.25 => 0.0003
c:c_2 7 2 0.45 0.25 => 0.0003
c:c_3 7 1 0.45 0.10 => -0.0007
c:c_4 7 2 0.45 0.40 => 0.0034
a:a_1 -> 6 2 0.25 0.33
a:a_2 -> 6 2 0.25 0.33
a:a_3 -> 6 2 0.25 0.34
b:b_1 -> 5 3 0.30 0.50
b:b_2 -> 5 2 0.30 0.50
c:c_1 -> 8 2 0.45 0.25
c:c_2 -> 8 2 0.45 0.25
c:c_3 -> 8 1 0.45 0.10
c:c_4 -> 8 3 0.45 0.40
Order rate: 0.49
a:a_1 6 2 0.25 0.33 => -0.0010
a:a_2 6 2 0.25 0.33 => -0.0010
a:a_3 6 2 0.25 0.34 => -0.0009
b:b_1 5 3 0.30 0.50 => 0.0000
b:b_2 5 2 0.30 0.50 => 0.0037
c:c_1 8 2 0.45 0.25 => 0.0005
c:c_2 8 2 0.45 0.25 => 0.0005
c:c_3 8 1 0.45 0.10 => -0.0004
c:c_4 8 3 0.45 0.40 => 0.0008
a:a_1 -> 6 2 0.25 0.33
a:a_2 -> 6 2 0.25 0.33
a:a_3 -> 6 2 0.25 0.34
b:b_1 -> 6 3 0.30 0.50
b:b_2 -> 6 3 0.30 0.50
c:c_1 -> 8 2 0.45 0.25
c:c_2 -> 8 2 0.45 0.25
c:c_3 -> 8 1 0.45 0.10
c:c_4 -> 8 3 0.45 0.40
Order rate: 0.50
a:a_1 6 2 0.25 0.33 => -0.0008
a:a_2 6 2 0.25 0.33 => -0.0008
a:a_3 6 2 0.25 0.34 => -0.0006
b:b_1 6 3 0.30 0.50 => 0.0003
b:b_2 6 3 0.30 0.50 => 0.0003
c:c_1 8 2 0.45 0.25 => 0.0007
c:c_2 8 2 0.45 0.25 => 0.0007
c:c_3 8 1 0.45 0.10 => -0.0002
c:c_4 8 3 0.45 0.40 => 0.0010
a:a_1 -> 6 2 0.25 0.33
a:a_2 -> 6 2 0.25 0.33
a:a_3 -> 6 2 0.25 0.34
b:b_1 -> 6 3 0.30 0.50
b:b_2 -> 6 3 0.30 0.50
c:c_1 -> 9 2 0.45 0.25
c:c_2 -> 9 2 0.45 0.25
c:c_3 -> 9 1 0.45 0.10
c:c_4 -> 9 4 0.45 0.40
Order rate: 0.50
a:a_1 6 2 0.25 0.33 => -0.0005
a:a_2 6 2 0.25 0.33 => -0.0005
a:a_3 6 2 0.25 0.34 => -0.0004
b:b_1 6 3 0.30 0.50 => 0.0006
b:b_2 6 3 0.30 0.50 => 0.0006
c:c_1 9 2 0.45 0.25 => 0.0007
c:c_2 9 2 0.45 0.25 => 0.0007
c:c_3 9 1 0.45 0.10 => -0.0000
c:c_4 9 4 0.45 0.40 => -0.0000
a:a_1 -> 6 2 0.25 0.33
a:a_2 -> 6 2 0.25 0.33
a:a_3 -> 6 2 0.25 0.34
b:b_1 -> 6 3 0.30 0.50
b:b_2 -> 6 3 0.30 0.50
c:c_1 -> 10 3 0.45 0.25
c:c_2 -> 10 2 0.45 0.25
c:c_3 -> 10 1 0.45 0.10
c:c_4 -> 10 4 0.45 0.40
Order rate: 0.50
a:a_1 6 2 0.25 0.33 => -0.0003
a:a_2 6 2 0.25 0.33 => -0.0003
a:a_3 6 2 0.25 0.34 => -0.0001
b:b_1 6 3 0.30 0.50 => 0.0008
b:b_2 6 3 0.30 0.50 => 0.0008
c:c_1 10 3 0.45 0.25 => -0.0003
c:c_2 10 2 0.45 0.25 => 0.0007
c:c_3 10 1 0.45 0.10 => 0.0001
c:c_4 10 4 0.45 0.40 => 0.0001
a:a_1 -> 6 2 0.25 0.33
a:a_2 -> 6 2 0.25 0.33
a:a_3 -> 6 2 0.25 0.34
b:b_1 -> 7 4 0.30 0.50
b:b_2 -> 7 3 0.30 0.50
c:c_1 -> 10 3 0.45 0.25
c:c_2 -> 10 2 0.45 0.25
c:c_3 -> 10 1 0.45 0.10
c:c_4 -> 10 4 0.45 0.40
Order rate: 0.50
a:a_1 6 2 0.25 0.33 => -0.0001
a:a_2 6 2 0.25 0.33 => -0.0001
a:a_3 6 2 0.25 0.34 => 0.0001
b:b_1 7 4 0.30 0.50 => -0.0004
b:b_2 7 3 0.30 0.50 => 0.0008
c:c_1 10 3 0.45 0.25 => -0.0002
c:c_2 10 2 0.45 0.25 => 0.0009
c:c_3 10 1 0.45 0.10 => 0.0002
c:c_4 10 4 0.45 0.40 => 0.0002
a:a_1 -> 6 2 0.25 0.33
a:a_2 -> 6 2 0.25 0.33
a:a_3 -> 6 2 0.25 0.34
b:b_1 -> 7 4 0.30 0.50
b:b_2 -> 7 3 0.30 0.50
c:c_1 -> 11 3 0.45 0.25
c:c_2 -> 11 3 0.45 0.25
c:c_3 -> 11 1 0.45 0.10
c:c_4 -> 11 4 0.45 0.40
Order rate: 0.51
a:a_1 6 2 0.25 0.33 => 0.0002
a:a_2 6 2 0.25 0.33 => 0.0002
a:a_3 6 2 0.25 0.34 => 0.0003
b:b_1 7 4 0.30 0.50 => -0.0003
b:b_2 7 3 0.30 0.50 => 0.0010
c:c_1 11 3 0.45 0.25 => -0.0001
c:c_2 11 3 0.45 0.25 => -0.0001
c:c_3 11 1 0.45 0.10 => 0.0003
c:c_4 11 4 0.45 0.40 => 0.0003
a:a_1 -> 6 2 0.25 0.33
a:a_2 -> 6 2 0.25 0.33
a:a_3 -> 6 2 0.25 0.34
b:b_1 -> 8 4 0.30 0.50
b:b_2 -> 8 4 0.30 0.50
c:c_1 -> 11 3 0.45 0.25
c:c_2 -> 11 3 0.45 0.25
c:c_3 -> 11 1 0.45 0.10
c:c_4 -> 11 4 0.45 0.40
Order rate: 0.47
a:a_1 6 2 0.25 0.33 => 0.0004
a:a_2 6 2 0.25 0.33 => 0.0004
a:a_3 6 2 0.25 0.34 => 0.0005
b:b_1 8 4 0.30 0.50 => -0.0001
b:b_2 8 4 0.30 0.50 => -0.0001
c:c_1 11 3 0.45 0.25 => -0.0001
c:c_2 11 3 0.45 0.25 => -0.0001
c:c_3 11 1 0.45 0.10 => 0.0003
c:c_4 11 4 0.45 0.40 => 0.0003
a:a_1 -> 7 2 0.25 0.33
a:a_2 -> 7 2 0.25 0.33
a:a_3 -> 7 3 0.25 0.34
b:b_1 -> 8 4 0.30 0.50
b:b_2 -> 8 4 0.30 0.50
c:c_1 -> 11 3 0.45 0.25
c:c_2 -> 11 3 0.45 0.25
c:c_3 -> 11 1 0.45 0.10
c:c_4 -> 11 4 0.45 0.40
58 0/1s in rate 45% were generated. 26 1s got in all 58.
ok
> Sum = 7+8+11, [7/Sum,8/Sum,11/Sum].
[0.2692307692307692,0.3076923076923077,0.4230769230769231]
> Sum1 = 2+2+3, [2/Sum1,2/Sum1,3/Sum1].
[0.2857142857142857,0.2857142857142857,0.42857142857142855]
> Sum2 = 4+4, [4/Sum2,4/Sum2].
[0.5,0.5]
> Sum3 = 3+3+1+4, [3/Sum3,3/Sum3,1/Sum3,4/Sum3].
[0.2727272727272727,0.2727272727272727,0.09090909090909091,
 0.36363636363636365]
>
廣告

About 黃耀賢 (Yau-Hsien Huang)

熱愛 Erlang ,並且有相關工作經驗。喜歡程式語言。喜歡邏輯。目前用 Python 工作。
本篇發表於 Application, Erlang。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s