最大團(tuán)問(wèn)題-分支限界法求解
- 此為課題組所指導(dǎo)本科生和低年級(jí)碩士生學(xué)習(xí)組合優(yōu)化問(wèn)題匯報(bào)
- 所用教材:北京大學(xué)屈婉玲教授《算法設(shè)計(jì)與分析》
- 課程資料:https://www.icourse163.org/course/PKU-1002525003
- 承諾不用于任何商業(yè)用途,僅用于學(xué)術(shù)交流和分享
- 更多內(nèi)容請(qǐng)關(guān)注
許志偉課題組官方中文主頁(yè):https://JaywayXu.github.io/zh-cn/
1. 最大團(tuán)問(wèn)題的定義及子圖與補(bǔ)圖的描述
1.1. 最大團(tuán)問(wèn)題的定義
在一個(gè)無(wú)向圖 \(G = (V, E)\) 中,團(tuán)(Clique) 是一個(gè)完全子圖,即該子圖中的任意兩個(gè)頂點(diǎn)之間都有邊。最大團(tuán)(Maximum Clique) 是所有團(tuán)中包含頂點(diǎn)數(shù)最多的團(tuán),最大團(tuán)問(wèn)題即是尋找無(wú)向圖中包含最多頂點(diǎn)的完全子圖。
數(shù)學(xué)表述:
- 輸入: 給定無(wú)向圖 \(G = (V, E)\),其中 \(V\) 是頂點(diǎn)集,\(E\) 是邊集。
- 目標(biāo): 找到一個(gè)最大子集 \(V' \subseteq V\) 使得 \(V'\) 中任意兩個(gè)頂點(diǎn)之間都有邊,即 \(V'\) 形成一個(gè)完全子圖。

1.2. 子圖的定義
-
子圖(Subgraph) 是從原圖 \(G = (V, E)\) 中選取部分頂點(diǎn)和與這些頂點(diǎn)相關(guān)的邊構(gòu)成的新圖。
形式化定義:
- 設(shè)子圖為 \(G' = (V', E')\),則 \(V' \subseteq V\),且 \(E' \subseteq E\)。
- \(E'\) 包含的邊只能是與 \(V'\) 中的頂點(diǎn)相連的那些邊。
子圖的作用:
通過(guò)選取圖的一部分頂點(diǎn)和邊,可以分析圖的局部結(jié)構(gòu),減少計(jì)算復(fù)雜度,從而簡(jiǎn)化求解過(guò)程。
1.3. 補(bǔ)圖的定義
-
補(bǔ)圖(Complement Graph) 是與原圖的邊關(guān)系互補(bǔ)的圖。對(duì)于原圖 \(G = (V, E)\),其補(bǔ)圖 \(\bar{G} = (V, E')\) 具有相同的頂點(diǎn)集 \(V\),但邊集不同。補(bǔ)圖中的邊集 \(E'\) 是完全圖中的邊集關(guān)于 \(G\) 的補(bǔ)集。
數(shù)學(xué)表述:
- 在原圖 \(G\) 中,若兩個(gè)頂點(diǎn)之間有邊 \((u, v) \in E\),則在補(bǔ)圖 \(\bar{G}\) 中沒(méi)有邊,即 \((u, v) \notin E'\)。
- 反之,若 \((u, v) \notin E\),則 \((u, v) \in E'\)。
形式化:
- \(E' = E_K \setminus E\),其中 \(E_K\) 是包含所有可能頂點(diǎn)對(duì)的完全圖的邊集。
補(bǔ)圖的作用:
補(bǔ)圖的定義使得我們可以將團(tuán)問(wèn)題與獨(dú)立集問(wèn)題建立聯(lián)系,從而簡(jiǎn)化求解過(guò)程。
1.4. 點(diǎn)獨(dú)立集的定義
-
點(diǎn)獨(dú)立集(Independent Set) 是圖 \(G = (V, E)\) 中一個(gè)頂點(diǎn)的子集 \(A \subseteq V\),且該子集中的任意兩個(gè)頂點(diǎn)之間都沒(méi)有邊。
數(shù)學(xué)表述:
- 對(duì)于 \(u, v \in A\),有 \((u, v) \notin E\)。
獨(dú)立集的直觀理解:
獨(dú)立集中的頂點(diǎn)互不相連,因此在某些應(yīng)用中,可以用獨(dú)立集來(lái)表示不沖突的元素或任務(wù)。
1.5. 最大點(diǎn)獨(dú)立集的定義
-
最大點(diǎn)獨(dú)立集(Maximum Independent Set) 是包含最多頂點(diǎn)的獨(dú)立集。
數(shù)學(xué)表述:
- 找到一個(gè)最大子集 \(A \subseteq V\),使得 \(A\) 是獨(dú)立集,即任意兩個(gè)頂點(diǎn) \(u, v \in A\) 都滿足 \((u, v) \notin E\)。
應(yīng)用:
最大點(diǎn)獨(dú)立集常用于調(diào)度、資源分配等問(wèn)題,表示一組互不沖突的選擇。
1.6. 最大團(tuán)與補(bǔ)圖的關(guān)系
- 最大團(tuán)與補(bǔ)圖中的最大點(diǎn)獨(dú)立集的等價(jià)性:
- 在補(bǔ)圖 \(\bar{G}\) 中,尋找最大點(diǎn)獨(dú)立集的問(wèn)題等價(jià)于在原圖 \(G\) 中尋找最大團(tuán)。
- 原因: 如果兩個(gè)頂點(diǎn)在補(bǔ)圖中沒(méi)有邊,則在原圖中它們之間有邊。因此,原圖中的最大團(tuán)對(duì)應(yīng)于補(bǔ)圖中的最大點(diǎn)獨(dú)立集。

2. 最大團(tuán)問(wèn)題的應(yīng)用場(chǎng)景
2.1. 應(yīng)用領(lǐng)域概述
最大團(tuán)問(wèn)題在多個(gè)領(lǐng)域中有廣泛應(yīng)用,包括但不限于:
- 編碼設(shè)計(jì):解決通信信道中的字符混淆問(wèn)題,優(yōu)化傳輸過(guò)程。
- 故障診斷:識(shí)別系統(tǒng)中的故障模塊,確保系統(tǒng)可靠運(yùn)行。
- 計(jì)算機(jī)視覺(jué)與聚類分析:分析圖像數(shù)據(jù)中的密集關(guān)系并進(jìn)行模式識(shí)別。
- 經(jīng)濟(jì)學(xué)與移動(dòng)通信:用于復(fù)雜系統(tǒng)的優(yōu)化分析,如網(wǎng)絡(luò)布局和資源分配。
- VLSI(大規(guī)模集成電路)設(shè)計(jì):提高電路布局的效率,減少?zèng)_突和干擾。
2.2. 混淆圖與編碼設(shè)計(jì)的描述
在通信信道中,由于噪音的存在,字符的傳輸可能會(huì)發(fā)生混淆。例如,字符 \(u\) 在傳輸過(guò)程中可能被誤解為字符 \(v\)。為了描述這種情況,我們使用混淆圖(Confusion Graph)。
- 混淆圖定義:
給定混淆圖 \(G = (V, E)\),其中 \(V\) 為字符集,\(E\) 為邊集。如果 \((u, v) \in E\),則表示字符 \(u\) 和 \(v\) 在傳輸過(guò)程中容易混淆。

在上述圖中,字符 \(u\) 與 \(v\),\(i\) 與 \(j\) 之間的邊表示它們?cè)谠胍舡h(huán)境中可能會(huì)被混淆。
2.3. 字符串混淆與編碼設(shè)計(jì)優(yōu)化
在實(shí)際傳輸過(guò)程中,通常使用字符串而非單個(gè)字符來(lái)傳遞信息。為了描述字符串間的混淆,我們引入以下條件:
- 字符串混淆條件:
字符串 \(xy\) 與 \(uv\) 發(fā)生混淆,當(dāng)且僅當(dāng)以下條件之一成立:- \(x\) 與 \(u\) 混淆,且 \(y\) 與 \(v\) 混淆。
- \(x = u\) 且 \(y\) 與 \(v\) 混淆。
- \(x\) 與 \(u\) 混淆,且 \(y = v\)。
如圖所示,圖 \(G\) 和 \(H\) 的正規(guī)積用于描述字符串混淆的關(guān)系:

在上述圖中,不同字符串之間的邊表示它們可能發(fā)生混淆。
2.4. 混淆圖中的最大點(diǎn)獨(dú)立集
在混淆圖中,為了減少噪音對(duì)傳輸?shù)母蓴_,我們需要找到最大點(diǎn)獨(dú)立集,即字符之間相互獨(dú)立且不會(huì)發(fā)生混淆的最大集合。
- 最大點(diǎn)獨(dú)立集的作用:
通過(guò)在混淆圖中找到最大點(diǎn)獨(dú)立集,確保這些字符之間沒(méi)有邊相連,從而避免混淆。
這意味著在編碼設(shè)計(jì)時(shí),我們可以通過(guò)選擇混淆圖中的最大點(diǎn)獨(dú)立集來(lái)優(yōu)化傳輸?shù)目煽啃浴?/li>
3. 使用分支限界法解決最大團(tuán)問(wèn)題
3.1. 最大團(tuán)問(wèn)題的數(shù)學(xué)描述
問(wèn)題定義:
給定無(wú)向圖 \(G = (V, E)\),其中:
- 頂點(diǎn)集 \(V = \{1, 2, \ldots, n\}\),
- 邊集為 \(E\)。
目標(biāo):
求 \(G\) 中的最大團(tuán)。
解的形式:
解可以表示為一個(gè) \(0-1\) 向量 \(\langle x_1, x_2, \ldots, x_n \rangle\),其中:
- \(x_k = 1\) 當(dāng)且僅當(dāng)頂點(diǎn) \(k\) 屬于最大團(tuán)。
3.2. 蠻力算法的描述
蠻力算法:
- 對(duì)每個(gè)頂點(diǎn)子集進(jìn)行檢查,判斷該子集是否構(gòu)成團(tuán),即檢查其中每對(duì)頂點(diǎn)之間是否都有邊。
- 復(fù)雜度:
對(duì)于 \(n\) 個(gè)頂點(diǎn),有 \(2^n\) 個(gè)子集,故需要至少指數(shù)時(shí)間來(lái)完成計(jì)算。
3.3. 分支限界算法的設(shè)計(jì)
搜索樹(shù)結(jié)構(gòu):
- 搜索樹(shù)為子集樹(shù),每個(gè)結(jié)點(diǎn) \(\langle x_1, x_2, \ldots, x_k \rangle\) 表示已經(jīng)考察了頂點(diǎn) \(1, 2, \ldots, k\)。
- 若 \(x_i = 1\),則表示頂點(diǎn) \(i\) 在當(dāng)前的團(tuán)中;否則表示不在團(tuán)中。
約束條件:
新加入的頂點(diǎn)必須與當(dāng)前團(tuán)中的所有頂點(diǎn)有邊相連。
界:
當(dāng)前已找到的極大團(tuán)的頂點(diǎn)數(shù),作為后續(xù)計(jì)算的界限,用于剪枝。
3.4. 代價(jià)函數(shù)的定義
代價(jià)函數(shù)的設(shè)定:
- 代價(jià)函數(shù)(Cost Function) 用于估計(jì)當(dāng)前團(tuán)可能擴(kuò)展為極大團(tuán)的頂點(diǎn)數(shù)上界:\[F = C_n + (n - k) \]其中:
- \(C_n\) 為當(dāng)前團(tuán)中的頂點(diǎn)數(shù)(初始為 \(0\)),
- \(k\) 為當(dāng)前搜索的深度或?qū)訑?shù)。
代價(jià)函數(shù)的解釋:
- 如果當(dāng)前已考察了 \(k\) 個(gè)頂點(diǎn),其中有 \(C_n\) 個(gè)頂點(diǎn)在團(tuán)內(nèi),則剩余未考察的頂點(diǎn)數(shù)為 \(n - k\)。
- 理論上,最理想的情況是所有剩余的 \(n - k\) 個(gè)頂點(diǎn)全部可以加入團(tuán)。因此,我們將上界設(shè)定為:\[F = C_n + (n - k) \]即:上界 = 已加入團(tuán)的頂點(diǎn)數(shù) + 剩余未考察的頂點(diǎn)數(shù)。
粗糙性分析:
- 這個(gè)估計(jì)較為粗糙,因?yàn)槲纯疾斓?\(n - k\) 個(gè)頂點(diǎn)中,可能有很多頂點(diǎn)不能加入團(tuán)。因此,該上界通常會(huì)偏高。
- 優(yōu)點(diǎn): 這種代價(jià)函數(shù)計(jì)算簡(jiǎn)單,能快速估計(jì)上界。
- 缺點(diǎn): 由于估計(jì)粗糙,在實(shí)際搜索過(guò)程中,裁剪掉的搜索樹(shù)空間較少,因此提高效率的作用有限。
最壞情況分析:
- 在最壞情況下,即使使用了分支限界法,可能也無(wú)法顯著減少搜索空間,導(dǎo)致與蠻力算法的復(fù)雜度相同:\[O(n \cdot 2^n) \]這表明,即使使用該算法,也可能遇到一些實(shí)例無(wú)法大幅裁剪結(jié)點(diǎn),導(dǎo)致計(jì)算時(shí)間接近蠻力法的水平。
4. 實(shí)例推導(dǎo)過(guò)程

圖的結(jié)構(gòu)及初始定義
圖結(jié)構(gòu):
- 頂點(diǎn):\(\{1, 2, 3, 4, 5\}\)
- 邊:根據(jù)圖中連線給定。
表示方法:
每個(gè)頂點(diǎn) \(x_i = 1\) 表示該頂點(diǎn)進(jìn)入團(tuán),\(x_i = 0\) 表示該頂點(diǎn)不在團(tuán)中。
左子樹(shù)表示 \(x_i = 1\),右子樹(shù)表示 \(x_i = 0\)。
變量說(shuō)明:
- B:界(已找到團(tuán)的最大頂點(diǎn)數(shù))。
- F:代價(jià)函數(shù)值(估計(jì)當(dāng)前團(tuán)的最大擴(kuò)展可能)。

搜索樹(shù)推導(dǎo)步驟
-
起點(diǎn):選擇頂點(diǎn) 1
- 左分支:\(x_1 = 1\),頂點(diǎn) 1 進(jìn)入團(tuán)。
- 右分支:\(x_1 = 0\),頂點(diǎn) 1 不在團(tuán)中。
-
第二步:處理頂點(diǎn) 2
- 選擇 左分支,即 \(x_2 = 1\),頂點(diǎn) 2 加入團(tuán)。
- 因?yàn)?1 號(hào)與 2 號(hào)頂點(diǎn)之間有邊,滿足團(tuán)的條件。
- 選擇 左分支,即 \(x_2 = 1\),頂點(diǎn) 2 加入團(tuán)。
-
第三步:處理頂點(diǎn) 3
- 檢查后發(fā)現(xiàn):頂點(diǎn) 3 與頂點(diǎn) 2 無(wú)邊,不滿足團(tuán)的條件。
- 右分支:\(x_3 = 0\),頂點(diǎn) 3 不在團(tuán)中。
- 檢查后發(fā)現(xiàn):頂點(diǎn) 3 與頂點(diǎn) 2 無(wú)邊,不滿足團(tuán)的條件。
-
第四步:處理頂點(diǎn) 4
- 左分支:\(x_4 = 1\),頂點(diǎn) 4 可以加入團(tuán),因?yàn)樗c頂點(diǎn) 1、2 均有邊。
-
第五步:處理頂點(diǎn) 5
- 頂點(diǎn) 5 無(wú)法加入團(tuán),因?yàn)樗c頂點(diǎn) 2 無(wú)邊。
- 右分支:\(x_5 = 0\)。
- 頂點(diǎn) 5 無(wú)法加入團(tuán),因?yàn)樗c頂點(diǎn) 2 無(wú)邊。
-
第一個(gè)可行解 (a):
- 得到團(tuán) \(\{1, 2, 4\}\),頂點(diǎn)數(shù)為 3,對(duì)應(yīng)的界 \(B = 3\)。
考慮右分支:4 號(hào)頂點(diǎn)不進(jìn)團(tuán)的情況
- 回到第 4 步:4 號(hào)頂點(diǎn)不進(jìn)團(tuán)
- 右分支:\(x_4 = 0\),頂點(diǎn) 4 不在團(tuán)中。
- 在這種情況下,團(tuán)為 \(\{1, 2\}\),頂點(diǎn)數(shù)為 2。代價(jià)函數(shù) \(F = 2 + 1 = 3\)。由于該解不優(yōu)于當(dāng)前界 \(B = 3\),無(wú)需進(jìn)一步搜索。
回溯與繼續(xù)搜索
-
回溯到頂點(diǎn) 2:
- 在之前的路徑中,頂點(diǎn) 1 和 2 已經(jīng)被選擇進(jìn)入團(tuán)。現(xiàn)在嘗試回溯到頂點(diǎn) 2,選擇其右分支,即 \(x_2 = 0\),頂點(diǎn) 2 不進(jìn)入團(tuán)。
-
繼續(xù)處理頂點(diǎn) 3、4、5:
- 由于頂點(diǎn) 1 已經(jīng)在團(tuán)中,現(xiàn)在可以選擇頂點(diǎn) 3、4 和 5 檢查它們是否可以加入團(tuán):
- 頂點(diǎn) 3:可以進(jìn)入團(tuán),因?yàn)樗c頂點(diǎn) 1 之間有邊。
- 左分支:\(x_3 = 1\),頂點(diǎn) 3 進(jìn)入團(tuán)。
- 頂點(diǎn) 4:可以進(jìn)入團(tuán),因?yàn)樗c頂點(diǎn) 1 和 3 之間都有邊。
- 左分支:\(x_4 = 1\),頂點(diǎn) 4 進(jìn)入團(tuán)。
- 頂點(diǎn) 5:也可以進(jìn)入團(tuán),因?yàn)樗c頂點(diǎn) 3 和 4 都有邊。
- 左分支:\(x_5 = 1\),頂點(diǎn) 5 進(jìn)入團(tuán)。
- 頂點(diǎn) 3:可以進(jìn)入團(tuán),因?yàn)樗c頂點(diǎn) 1 之間有邊。
- 由于頂點(diǎn) 1 已經(jīng)在團(tuán)中,現(xiàn)在可以選擇頂點(diǎn) 3、4 和 5 檢查它們是否可以加入團(tuán):
-
生成最大團(tuán):
- 新的團(tuán)為 \(\{1, 3, 4, 5\}\),頂點(diǎn)數(shù)為 4。
-
更新界 \(B\):
- 當(dāng)前找到的團(tuán)頂點(diǎn)數(shù)為 4,因此更新界 \(B = 4\)。
剪枝與停止搜索
- 剪枝判斷:
- 當(dāng)后續(xù)代價(jià)函數(shù) \(F\) 估計(jì)值不超過(guò)當(dāng)前界 \(B = 4\) 時(shí),不再繼續(xù)搜索。
- 所有其他可能路徑的代價(jià)函數(shù)值均不超過(guò) \(F = 4\),因此停止搜索。
搜索樹(shù)總結(jié)
- 第一條路徑: \(\{1, 2, 4\}\),界 \(B = 3\)。
- 第二條路徑: \(\{1, 3, 4, 5\}\),更新界 \(B = 4\)。
最終結(jié)果
- 最大團(tuán): \(\{1, 3, 4, 5\}\),頂點(diǎn)數(shù)為 4。
5. 小結(jié)
5.1. 最大團(tuán)問(wèn)題與點(diǎn)獨(dú)立集的關(guān)系
- 最大團(tuán)問(wèn)題與點(diǎn)獨(dú)立集問(wèn)題之間存在緊密的對(duì)應(yīng)關(guān)系:
- 在補(bǔ)圖中尋找最大點(diǎn)獨(dú)立集,等價(jià)于在原圖中尋找最大團(tuán)。
- 通過(guò)這種對(duì)應(yīng)關(guān)系,可以將問(wèn)題轉(zhuǎn)化為求解補(bǔ)圖中的獨(dú)立集,從而簡(jiǎn)化求解過(guò)程。
5.2. 分支限界算法的設(shè)計(jì)
樹(shù)的結(jié)構(gòu):
- 子集樹(shù):分支限界法使用子集樹(shù)結(jié)構(gòu),對(duì)每個(gè)頂點(diǎn)進(jìn)行逐一選擇(進(jìn)入團(tuán)或不進(jìn)入團(tuán)),從而構(gòu)造搜索空間。
分支約束條件:
- 新加入團(tuán)的頂點(diǎn)必須與當(dāng)前團(tuán)中所有頂點(diǎn)都有邊相連,否則不進(jìn)行進(jìn)一步分支。
代價(jià)函數(shù)與界的設(shè)定:
-
代價(jià)函數(shù)估計(jì)當(dāng)前團(tuán)可能擴(kuò)展為極大團(tuán)的頂點(diǎn)數(shù)上界:
\[F = C_n + (n - k) \]- \(C_n\) 為當(dāng)前團(tuán)中的頂點(diǎn)數(shù)(初始為 0)。
- \(k\) 為當(dāng)前已考察的層數(shù)(深度)。
-
界 \(B\):找到的最大團(tuán)的頂點(diǎn)數(shù)用于更新界,幫助剪枝。
5.3. 時(shí)間復(fù)雜度分析
- 最壞情況時(shí)間復(fù)雜度:\[O(n \cdot 2^n) \]
- 即使使用了分支限界法,在某些最壞情況下,仍然需要指數(shù)級(jí)時(shí)間搜索所有可能子集。
5.4. 小結(jié)與展望
- 分支限界算法通過(guò)使用剪枝策略,在保證找到最優(yōu)解的前提下減少了計(jì)算量,提高了算法的實(shí)際效率。
- 最大團(tuán)問(wèn)題在編碼設(shè)計(jì)、計(jì)算機(jī)視覺(jué)、故障診斷等多個(gè)領(lǐng)域中有著廣泛應(yīng)用,且求解該問(wèn)題為解決其他復(fù)雜問(wèn)題提供了理論支持。

浙公網(wǎng)安備 33010602011771號(hào)