跳到主要內容

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)}$  $aaaa$,$bbbb$,$cccc$,$dddd$ 代表全同的情況
$\color{green}{(2)}$  $abcd$,$bcda$,$acbd$,....  代表全異的情況,共 $4!$種
$\color{green}{(3)}$  $abad$,$cbcd$,$bcba$,....  代表二同二異(且$x_{1}=x_{3}$)
$\color{green}{(4)} $ $abcb$,$adcd$,$bcac$,....  代表二同二異(且$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



留言

這個網誌中的熱門文章

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)\approx \left\{

Chain Rule & Identity Function Trick

本文為筆者學習微積分,函數概念與Chain Rule 的時候,遇到的一些概念大坑。本文一一澄清一些個人看法,並分享 Chain Rule 廣義的樣子,以及對於遞迴系統該如何計算...等等看法。 [坑1 : 變數/值符號的認識] 一切從 $y = f(x)$ 開始,我們習慣把 Input 變數用"括號"刮起來,Output y 代表值,f 代表函數。或是可以想成這樣:   $$ x \overset{f}{\longrightarrow} y $$ 這種表示法概念上很嚴謹,但缺點是你必須要用三個符號 $x$,$y$,$f$ 而在微分方程領域出現這種寫法 $y = y(x)$  (把 $f$ 換成 $y$) ,這種寫法就頗簡潔,Chain Rule 通常都是這類表示法。缺點是心裡要能確實明白在哪個場合 $y$ 到底是給定的"值"還是"函數"(註: 通常大多代表函數 $y$,值的話通常會這樣寫 $y(x_{0})$,$y_{0}$) ============================================================== [Bonus] $y=y(x)$這種表示法還有一個好處,如果允許 $f$ 是一對多,那麼 $y(x)$ 就是 $y \text{ is depend on } x$ 的意思,如果你喜歡用集合論來表示可以先定義$f$ 的定義域/對應域 $$ f : X \rightarrow Y$$ 然後 $y(x)$ 可以寫成這樣 $y \in Y_{x}$,其中值域為 $$ f(X):=\bigcup_{x \in X}Y_{x} \subseteq Y$$ ============================================================== [坑2 : Input 的變數到底是哪些] 這邊舉兩個例子提醒: (Ex1) 代換法會重新改變函數的 Input 例如 : $y = f(x) = x+1$ , $ z = g(y) = 2y$  可以代換一下,寫成 $z = g[f(x)] = 2(x+1)$ 如果你用簡記你會發現 $y(x) , z(y) , z(y(x)) \equiv z

Probability Model Of Bingo Game

本文介紹經典的"賓果 Bingo" 遊戲,機率與期望值的解析計算公式的計算概念,相關的數學建模....等等 [遊戲情境] 總共有 $n$ 個相異的號碼彩球,號碼集為 $S:=\{1,2,3,....n\}$,今玩家可以花$1$元,買$1$張賓果卡 ($5 \times 5$) 位置座標集 $Z$, $|Z|=25$,然後從$S$ 隨機均勻選擇 $25$個相異的號碼並排列到一個佇列(queue),而開球只會開前 $m$ 顆球,$25 \leq m\leq n$,而給定獎項圖形集 $\color{red}{p \in P := \{Bingo,王,十,一_1,一_2,...,一_5  \}}$ (可自行設計) ,以及已知賠率表向量 $odds_{P}$。開完球後,把Bingo 卡上的中獎的號碼圈起來形成"中獎圖形" ===================================================== 其中獎項圖形 : "$Bingo$" 代表$25$個號碼全中 "十"代表第 $3$ 列(row)  第 $3$ 行 (column) 有中 (共$9$個號碼) "王"代表第 $1$ , $3$ , $5$ 列(row)  第 $3$ 行 (column) 有中 (共$17$個號碼) "$一_k$" 代表第 $k$ 列有中 (共$5$個號碼) ===================================================== 若中獎圖形有涵蓋獎項圖形大致會獲得,賠率 $odds_{p} \times 1 $ 元,但有些合理規則: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ $[ 規則 1 ]$ 若獎項圖形 $p_1,p_2$ 有完全重疊$(p_1 \subseteq p_2)$,則以大圖形 $odds_{p_2}$ 賠率算 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ $$\color{green}{ 重要假設: 合理的