1. 程式人生 > 其它 >最大團問題分支限界法_最大團問題與 Bron-Kerbosch 演算法

最大團問題分支限界法_最大團問題與 Bron-Kerbosch 演算法

技術標籤:最大團問題分支限界法

最近注意到了圖論中的最大團問題。最大團問題是一個 NP 完全問題,在此對它做簡單介紹,並介紹具有代表性的 Bron-Kerbsch 演算法。

什麼是一個團?

最大團問題首先一個圖的問題,假設讀者已經知道圖的概念。

假設一個無向圖

equation?tex=G ,一個 是圖 equation?tex=G 的子圖,該子圖中的所有頂點之間都有邊將它們相連。

極大團指的是,該團不包含於圖

equation?tex=G 的任何其他團,即不是任何其他團的真子集。

最大團指的是結點數量最多的極大團。


最大團問題的 Bron-Kerbosch 演算法

對於一個無向圖,找到其最大團是 NP 完全問題。本文介紹最大團問題的 Bron-Kerbosch 演算法。

Bron–Kerbosch 演算法是由荷蘭科學家 Coenraad Bron 和 Joep Kerbosch 設計的,他們於1973年發表了論文《Algorithm 457: finding all cliques of an undirected graph》。理論上,在輸入更少的最大獨立子集時,演算法執行時間最短。Bron–Kerbosch 演算法和後續演算法通常被認為在實踐中比其他演算法更加有效。

Akkoyunlu(1973)在同時代提出的演算法雖然用不同的術語表示,但由於它生成相同的遞迴搜尋樹,因此可以看作與 Bron-Kerbosch 演算法相同。

無樞軸演算法

Bron–Kerbosch 演算法的基本形式是一種遞歸回溯演算法,用於搜尋給定圖

equation?tex=G 的所有極大團。

總體上,給定三個不相交的頂點集

equation?tex=R%2C+P%2C+X,它找到包含 equation?tex=R 中的所有頂點、 equation?tex=P 中的某些頂點和不在 equation?tex=X 中的頂點的極大團。在演算法的每次呼叫中, equation?tex=Pequation?tex=X 是不相交的集合,它們的並集由新增到 equation?tex=R 時會形成團的那些頂點組成。換句話說, equation?tex=P+%5Ccup+X 是連線到 equation?tex=R 的每個元素的一組頂點。當 equation?tex=Pequation?tex=X 都為空時,沒有其他元素可以新增到 equation?tex=R ,因此 equation?tex=R 是最大團,演算法輸出 equation?tex=R

在開始遞迴演算法前,將

equation?tex=Requation?tex=X 設定為空集,將 equation?tex=P 設定為圖的頂點集。在每個遞迴呼叫中,演算法依次考慮 equation?tex=P 中的頂點。如果沒有這樣的頂點,分為兩種情況:如果 equation?tex=X 為空,將 equation?tex=R
報告為最大團;如果 equation?tex=X 並不為空,進行回溯。對於從 equation?tex=P 中選擇的每個頂點 equation?tex=v ,它將進行遞迴呼叫,其中將 equation?tex=v 新增到 equation?tex=R 中,並且將 equation?tex=Pequation?tex=X 限制為 equation?tex=v 的鄰居集 equation?tex=N%28v%29 ,這將查詢並報告 equation?tex=R 中包含 equation?tex=v 的所有團擴充套件。然後,它將 equation?tex=vequation?tex=P 移到 equation?tex=X ,以在以後的團中將其排除在外,並繼續使用 equation?tex=P 中的下一個頂點。

該演算法可以寫作以下虛擬碼形式:

R := {}
P := node set of G 
X := {}

BronKerbosch1(R, P, X):
    if P and X are both empty:
        report R as a maximal clique
    for each vertex v in P:
        BronKerbosch1(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))
        P := P  {v}
        X := X ⋃ {v}

關於演算法原理,談一些個人理解。演算法開始時,

equation?tex=R 是空集, equation?tex=P 是頂點集;演算法結束時, equation?tex=R 是最大團, equation?tex=P 是空集。搜尋最大團的過程就是頂點 equation?tex=v 從集合 equation?tex=P 移動到集合 equation?tex=R 的過程。

採用回溯策略的原因是,我們並不知道某個頂點

equation?tex=v 最終是否是最大團中的成員。如果遞迴演算法選擇 equation?tex=v 作為最大團的成員時,並沒有找到最大團,那麼應該回溯,並查詢最大團中沒有 equation?tex=v 的解。

在遞迴的過程中,

equation?tex=R 最終要形成一個最大團, equation?tex=R 的元素就是遞迴過程中當前找到的最大團的組成元素。 equation?tex=P 是最大團的候選頂點集合, equation?tex=P 不斷地去掉遞迴完成的頂點 equation?tex=v ,在遞迴時取只在 equation?tex=N%28v%29 中的元素,因為最大團中的每個頂點之間是互相連線的,要找到的最大團的下一個頂點,一定是 equation?tex=v 的鄰接頂點。類似地, equation?tex=X 是回溯過程中被放棄的頂點的集合,遞迴過程中每次也只需關注 equation?tex=N%28v%29 的部分。

該演算法還有很多後續改進的研究,如果學習到將補充在這裡。