Kernighan-Lin算法通過迭代改進進行划分,1970年提出,用於求解所有節點都有相同權重的二分圖。該算法可以擴展到多元(k-way)且元胞可以是任意大小。
算法簡介
KL算法用於電路所表征的圖上,其中節點代表元胞,邊代表元胞之間的鏈接。形式上,讓圖G(V,E)有|V| = 2n個節點,所有節點有相同的權重,所有邊有一條非負權重。KL算法將V划分稱為兩個不相交的子集A和B,割數最小,且|A|==|B|==n。
KL算法基於互換一對節點的位置,其中所有節點都屬於不同划分。如果兩個節點在割數減少量最高時,互換這兩個節點。為了防止直接反轉和撤銷操作帶來的無限循環,KL算法在節點交換后將其鎖定。知道被鎖定的節點編程自由節點前,這些被鎖定的節點是不能夠被交換的。
KL算法經過多輪運行。每輪可以從任意初始化分開始。在特定的輪次下,當所有的節點都被鎖定后,算法選取對交換中所得到的最大增益(也就是最少的花費)的一對節點進行交換。所有節點依照同樣的操作移動。當所有的節點都移動后,本輪結束,所有的節點又再次成為自由節點。在隨后的倫茨中,算法從上一輪所得到的兩個划分開始。所有可能的對交換被重新計算。如果在給定的輪次中划分結果質量沒有改進,則算法終止。
割代價
一個無權圖或有統一邊權重的圖的割大小或割代價是所有系欸但在多個划分中的邊的數量。對於有權重的邊,割代價等於所有割邊的權重之和。
從划分A移動一個節點到B的划分代價D(v),
D(v) = |Eb(v)| + |Ea(v)|
Eb(v)是v的被割線所切割的關聯邊的集合;Ea(v)則是v的沒有被割線所切割的關聯邊的集合。代價(D>0)高的表明節點需要移動,代價低(D<0)表明節點仍保留在原來的划分中。
交換增益
交換一對節點a和b的增益是該對節點交換前后所引起的割邊代價的變化。正增益表示割邊代價減少了,而負增益表示割邊代價增加了。交換a和b節點的增益為
c(a,b)表示a和b之間連接權重。如果a和b之間不存在一條邊,則c(a,b) = 0。
最大正增益
最大正增益表示給定輪次中,進行m次交換中的最好結果。在這m次交換中,可能會找到具有最小割代價的划分。最大正增益等於第一輪m次交換的交換增益的和,結束時,最大正增益選擇最大的值。
步驟
首先,將圖G划分為任意兩個部分A和B,然后將最大正增益設置為無窮大。在每輪中,計算每個節點的代價D(v),並將節點v設置為自由的。當所有節點都沒有被鎖定時,進行選擇和交換,然后將這兩個自由節點a和b鎖定,其中a屬於A,b屬於B,此時交換增益為最大的。更新所有與a和b相連的自由節點的D(v)。
當所有節點都被鎖定后,找到使最大正增益最大的移動序列,如果最大正增益使整的,執行移動序列。否則終止。
總結
KL算法並不能總是得到最優解,在時間中,處理幾百個節點的圖時,可以得到相當好的結果。KL算法的運行時間是由兩個因素決定的,增益更新和交換點的選擇。算法選擇n對節點進行交換,n是每個划分中的節點總數。對於每個節點v,更新和比較增益的時間復雜度為O(n)。也就是說,在移動i中交換節點a和b最多(2n - 2i)個自由節點的增益被更新。因此在每輪中,n個移動的增益更新所花費的時間最多為O(n^2)。在給定的移動i中的一對節點進行比較是,執行n對比較所需時間結界是O(n^3)。則總的時間復雜度為O(n^3)。
實際的優化KL算法,可以對D(v)進行排序,得到的時間復雜度為O(n^2*logn)