Processing math: 0%
跳到主要內容

All Different Expansion & Bell Numbers



本文分享筆者在計算排列組合(combinatorics)時,發現並描述系統性的窮舉公式 :)
暫時命名為 \color{red}{\text{All Different Expansion }} ??  (有歷史文獻名詞歡迎筆者補充)

[情境/動機]
假設箱子裡面有很多種物品,種類集記做 I , 每種物品 i 各有 \#_i 個,向量記做 \#_{I} := (\#_{i})_{i \in I}
\text{箱子裡共有 } \sum_{i \in I} \#_i  \text{ 個物品}   

T := \{1,2,3,....|T|\},今從箱子裡"逐一"抽取物品共 |T| 次 (抽出 |T| 個物品)
=============================================================
\color{blue}{\text{形成序列 : } x_{T} := (x_{t})^{|T|}_{t=1} \in I^{|T|}}
註: x_{t} 代表第 t 次抽到的物品
=============================================================
以下舉個小小的例子,來說明動機~
I := \{a,b,c,d\}|T| = 4 ,且假設物品個數無上限  \color{red}{ \forall i \in I \quad \#_{i} = \infty}
於是我們可以開始窮舉(brute & force)情況 ~~
\color{green}{(1)}  aaaabbbbccccdddd 代表全同的情況
\color{green}{(2)}  abcdbcdaacbd,....  代表全異的情況,共 4!
\color{green}{(3)}  abadcbcdbcba,....  代表二同二異(且x_{1}=x_{3})
\color{green}{(4)} abcbadcdbcac,....  代表二同二異(且x_{2}=x_{4})
...
\color{red}{\text{註: (3),(4) 雖然都為二同二異,但因為出現是有序的,相同位置不同,視為不同類,保持計數靈活性!!} }
顯而易見也是關鍵步驟 ~
可以把 \color{green}{(1)} 類別,標記為 1111
可以把 \color{green}{(2)} 類別,標記為 1234
可以把 \color{green}{(3)} 類別,標記為 1213
可以把 \color{green}{(4)} 類別,標記為 1232
...
於是我們可以系統性的,把所有的 x_{T}  做適當的分類 ~~
但你實際上去標記,會發現有些標法 1324, 1242,... 是不允許的(會混淆的,會重複算的,迷失在對稱裡等窘境)。會遭遇困難~需要系統性的標法!!

[如何標記?!]
令標記數列 y_{T}:=(y_t)^{|T|}_{t=1} \in T^{|T|} \quad  ps. 1232 \equiv \bigg( y_{1}=1,...,y_{4}=2 \bigg)

而且必須滿足以下遞迴式,才不會有"標記窘境"
\color{red}{ \bigwedge_{t\in T} \bigg( y_{t} \leq \underset{t' \in \{1,2,....t-1\}}{\text{max}} y_{t'}+1  \bigg) }

用集合表示可寫成:
\color{red}{\mathcal{D}_{|T|}:= \bigg\{y_{T}\in T^{|T|} :  \bigwedge_{t\in T} \bigg( y_{t} \leq \underset{t' \in \{1,2,....t-1\}}{\text{max}} y_{t'}+1  \bigg)  \bigg\}  }

於是可以寫程式去窮舉 \mathcal{D}_{|T|},去計算 |\mathcal{D}_{|T|}|,以下是實驗結果 !!
=============================================================
|\mathcal{D}_1| =  1 ,\mathcal{D}_{1} = \{1\}
|\mathcal{D}_2| =  2 ,\mathcal{D}_{2} = \{11,12\}
|\mathcal{D}_3| =  5, \mathcal{D}_{3} = \{111,112,121,122,123\}
|\mathcal{D}_4| =  15, \mathcal{D}_{4} =\{1111,1112,1121,1122,1123,1211,1212,1213,1221,1222,1223,1231,1232,1233,1234\}
|\mathcal{D}_5|=52\mathcal{D}_{5} =
|\mathcal{D}_6|=203\mathcal{D}_{6} =
|\mathcal{D}_7|=877\mathcal{D}_{7} =
|\mathcal{D}_8|=4140\mathcal{D}_{8} =
|\mathcal{D}_9|=21147\mathcal{D}_{9} =
|\mathcal{D}_{10}|=115975\mathcal{D}_{10} =
|\mathcal{D}_{11}|=678570\mathcal{D}_{11} =
|\mathcal{D}_{12}|=4213597\mathcal{D}_{12} =
|\mathcal{D}_{13}|=27644437\mathcal{D}_{13} =
==============================================================
[查詢可能的答案?!]
你會發現個數增長的指數快 ....當你跑到 |T| = 14 時,應該會發現電腦無法立即窮舉完,那要如何求得答案 \mathcal{D}_{|T|} , |T| \geq 14 呢??  幸虧我們可以把 1,2,5,15,52,203,877,4140,21147,115975,678570,4213597,27644437,... 這個數列丟進 OEIS (整數數列大百科) ,搜尋後發現跟 Bell Numbers 行為有點像,我們可以很合理臆測(但筆者還未證明),我們"標記計數" 這件事可能就是 Bell Numbers
從 Bell Numbers 得知 \mathcal{D}_{16} \overset{?}{=} 10480142147 
約等於 105 億種標記 = 16張麻將牌型(有序)的種類上界 !!

[標記 y_{T} 的意義?!]
那為何我們要知道 y_{T} \in \mathcal{D}_{|T|} ??,有什麼計算數學意義 ??
\color{red}{\text{答: 可以把每一個"標記"想成一個算式 !!} }
首先我們先定義 s \in \mathcal{S}(y_{T}) = y_{T} \text{ 的數字種類集} , n_{s} =  \text{個別數字$s$的計數}
ex: \color{blue}{ \mathcal{S}(112344) = \{1,2,3,4\} \quad  n_1 = 2 , n_2 = 1 , n_3 = 1 , n_4 = 2}

對於每個y_{T},就可以定義以下的廣義排列數公式 :
\color{red}{ F\bigg(y_{T},\#_I\bigg) = \underbrace{\sum_{i_1 \in I} \sum_{i_2 \in I-\{i_1\}} ... \sum_{i_{|\mathcal{S}(y_{T})|} \in I- \{i_1,i_2,i_3,...,i_{|\mathcal{S}(y_{T})|-1}\}}\bigg(\prod_{k=1}^{|\mathcal{S}(y_{T})|} P^{\#_{i_{k}}}_{n_{k}} \bigg)   }_{\text{all different expansion}}} = \text{該 $y_{T}$ 狀況下的排列數}

註 : P^{m}_{n} :=  \frac{m!}{(m-n)!} 為大家所熟悉的"排列函數"

[極端情況]
F\bigg(\overbrace{11...1}^{|T|},\#_I\bigg) = \sum_{i_1 \in I} P^{\#_{i_1}}_{|T|}

F\bigg(12...|T|,\#_I\bigg) = \sum_{\underbrace{i_1,...i_{|T|}}_{\text{all different }}} \prod_{k=1}^{|T|} P^{\#_{i_k}}_{1} =  \sum_{\underbrace{i_1,...i_{|T|}}_{\text{all different }}} \prod_{k=1}^{|T|} (\#_{i_k})
[特殊情況的優化]
如果 \forall k, n_k = C 是常數,會發現"連乘"是可以交換的,在 \text{all different}裡,很多F值就會是相等的
F = \sum_{\vec{i} \in I^{|\mathcal{S}|}_{\neq}} \bigg(\prod_{k=1}^{|\mathcal{S}|} P^{\#_{i_{k}}}_{C} \bigg) = \color{red}{ |\mathcal{S}|!  \sum_{\vec{i} \in I^{|\mathcal{S}|}_{<}} \bigg(\prod_{k=1}^{|\mathcal{S}|} P^{\#_{i_{k}}}_{C} \bigg)}
其中
I^{|\mathcal{S}|}_{\neq} :=  \bigg\{\vec{i} \in I^{|\mathcal{S}|}:  \underbrace{i_1 \neq i_2 \neq ... \neq i_{|\mathcal{S}|}}_{\text{all different}}   \bigg\}
I^{|\mathcal{S}|}_{<} :=  \bigg\{\vec{i} \in I^{|\mathcal{S}|}:  i_1 < i_2 < ... < i_{|\mathcal{S}|}   \bigg\} \quad  \text{p.s } I \text{需要先排序 }


[應用]
例如兩個玩家玩牌類遊戲時,已知每種牌"剩餘個數"(那些 \#_{I}),當發4張牌(依序玩家1->玩家2->玩家1->玩家2)。則發完後玩家2拿到,同花 or 同點(對子) or 同花同點(同花對)的排列數為
F\bigg(1111,\#_I\bigg) + F\bigg(1121,\#_I\bigg) + F\bigg(1212,\#_I\bigg) + F\bigg(1222,\#_I\bigg) + F\bigg(1232,\#_I\bigg) 
由此可輕鬆計算機率 !! 其中 I 可為 四種花色集 or \{A,2,...,J,Q,K\} or 52種牌集 !!

[未來研究]
如何再化簡計算 F ??  F\bigg(y_{T},\#_I\bigg) 如果是定義為某種測度時??

[小記]
本文介紹一種系統性"窮舉式子","分類序列"的例子,雖然計算複雜度還是很高,但更能理解"排列組合的深奧結構" !!




[以上純為學術經驗交流知識分享,如有錯誤或建議可留言~~] 
by Plus & Minus 2019.04



留言

這個網誌中的熱門文章

Nash Equilibrium & Best Responce Function (BRF) In Continuous Strategies

經濟學重要的賽局理論( Game Theory )領域,用數學描述人與人之間的理性互動,最重要的就是尋找奈許均衡( Nash equilibrium ), 本篇介紹其數學規劃與非線性方程組!!  假設有 p 名玩家(player i),i=1,2,3,4,5,....p , 正在玩一場遊戲(Game)~~,完全不合作,各自獨立作決策 每個人有決策向量 x_i \in \Omega_i \subseteq R^{n_i} (有n_i個決策變數)  定義長向量: \underbrace{x =  (x_1,x_2,x_3,....x_p)}_{\# \text{ of } \sum^{p}_{i=1}n_i \text{ variables }} \in  \prod^{p}_{i=1} \Omega_i = \Omega 對於每個 player i ,長向量可以寫成 x = (x_i , x_{-i})x_{-i} 代表其他人(不是 player i) 能做的決策向量。 所有人各自作決策後,每個人都會個自的存在報酬效用函數 f_i (x)  \in \mathbb{R}  (報酬函數皆為公開已知資訊) 假設每位玩家是理性人(會極大化自己效用) 即 \forall i = 1,2,3,4....p \qquad  \underset{x_i \in \Omega_i}{\text{max }}f_i(x)   [註: 如果為合作可視為多目標規劃問題( multiobjective ),即 x_1,x_2,...x_p 可以由領導人一起決定] [註: 如果為合作而且把效用加總,即目標式變成 \sum_{i=1}^{p} f_i(x) ,可能對集體效益有更大的幫助,但是如何分配效益給 ( player i )會是個議題,可以查關鍵字 fair optimization ] 我們可以定義每個 player i 的 Best Response Function (BRF) or Best Reponce Set S_i(x_{-i}) \subset \Omega_i $$  S_i(x...

Lattice & Multinomial Theorem

本文介紹格子點(Lattice) 幾何意義與多項式定理(Mutinomial Theorem) 的關係,並可協助我們理解計算一些機率問題。 [符號定義] 非負整數 / 非負實數:  \mathbb{Z}_{\geq 0} := \{0,1,2,3,4,......\}  \subseteq [0,\infty) =: \mathbb{R}_{\geq 0} 離散機率向量:  p_{I} := (p_{i})_{i \in I} \text{ s.t } \sum_{i\in I}p_i =1 ,|I|<\infty  發生事件 i \in I 的累積次數向量: k_{I} := (k_i)_{i \in I} \in \mathbb{Z}^{|I|}_{\geq 0} \mathbb{Z}^{|I|}_{\geq 0} 就是 |I| 維格子點 !! [格子點情境] 出發點定義為 k^{start}_{I}:= \overbrace{(0,0...,0)}^{|I|},今發生一次 p_{I} 分布隨機互斥事件,等價於"點的移動"(state transition),數學定義如下:   \text{Event } i  \text{ happens }  \Longleftrightarrow  \overbrace{(\color{red}{k_i},k_{-i})}^{k^{old}_{I}}  \underset{\text{with probability }p_{i}}{\longrightarrow}   \overbrace{(\color{red}{k_i+1},k_{-i})}^{ k^{new}_{I}}    PS1: 其中  k_{-i} := (k_{i'})_{i' \in I-\{i\}} PS2: 不管怎麼走都在第一象限,也就是只能往右,往上,往高.... 當發生 n 次獨立同分布 p_{I} (iid) 的事件後,所有可能點位置在以下的集合上 $$  S_{n}(\col...

Linear Regression By Using Linear Programming

當拿到一筆資料準備玩統計,往往會想要做線性迴歸( Linear Regression ),找出一個模型( mathematical model )來解釋變數間的關係,一般都是使用平方距離,但是如果我們採用絕對值距離呢?? 而剛好在工業工程( Industrial Engineering ),作業研究( Operation Research ) 領域,發展成熟的線性規劃( Linear Programming ) 恰好可以來解決,是一個跨領域的應用 !! 已經存在有許多商業或open source 軟體,如: Gurobi , Cplex , Xpress , Mosek , SCIP  可以輕易求解大型的線性規劃問題。而不僅如此也可以利用整數規劃( Integer Programming )來做特徵選擇 ( Feature Selection ),甚至可以偵測離群值( Detect Outlier ) !! 本文只介紹最小絕對值和,關於 Feature Selection , Detect Outlier 可以參考 Mixed-Integer Linear Programming Robust Regression with Feature Selection , Oleksii Omelchenko , 2010 的論文。 [Data Fitting Problem] 給定n筆實數型訓練資料 (training data) \{(x^{k},y^{k})\}^{n}_{k=1} = \mathcal{D} , x^{k} =(x^{k}_1,x^{k}_2, ... , x^{k}_{p})\in \mathbb{R}^{p} , y^{k} \in \mathbb{R} , 我們目標是想要找到一個函數 f_{\mathcal{D}} : \mathbb{R}^p \rightarrow \mathbb{R} 使得  \forall x \in \mathbb{R}^{p} , f_{\mathcal{D}}(x) \approx y , 精確來說: $$ \text{Find } f_{\mathcal{D}} \text{ such that } f_{\mathcal{D}}(x)\...