Rodzaj |
problemu podziału grafu na 2 równe części |
---|---|
Struktura danych |
graf ważony |
Złożoność | |
Czasowa |
|
Algorytm Kernighana-Lina – heurystyczny algorytm o złożoności obliczeniowej rozwiązywania problemu podziału grafu na 2 równe części. Może pracować na grafach o dodatnich, jak i ujemnych wagach krawędzi.
Niech będzie grafem, gdzie to zbiór jego wierzchołków, a zbiór krawędzi. Algorytm próbuje znaleźć podział na dwa rozłączne, jednakowo liczne podzbiory i tak, by sumaryczna waga krawędzi między wierzchołkami z podzbioru i oznaczona przez była jak najmniejsza.
Niech będzie wewnętrznym kosztem , czyli sumą kosztów wszystkich krawędzi między i resztą wierzchołków z natomiast zewnętrznym kosztem czyli sumą kosztów krawędzi między i wierzchołkami z
Zdefiniujmy jako:
czyli różnicę między zewnętrznym i wewnętrznym kosztem W momencie wymiany i zysk wyraża się wyrażeniem:
gdzie jest kosztem krawędzi między i
Algorytm stara się znaleźć najkorzystniejszą sekwencję wymian wierzchołków między i przez maksymalizację funkcji celu określonej jako:
Należy pamiętać, że po wyborze optymalnych wierzchołków następuje ich zamiana, ale w kolejnej iteracji są one nie ruszane – rozpatruje się wierzchołków w każdym z podzbiorów, i tak dalej, aż nie pozostanie więcej wierzchołków do rozpatrzenia.
Co więcej, gdy wszystkie zyski z zamian w danej iteracji będą ujemne (zamiana zwiększy sumę krawędzi łączących podgrafy), to algorytm działa dalej, gdyż być może kolejne zamiany okażą się lepsze.
1 function Kernighan-Lin(G(V,E)): 2 determine a balanced initial partition of the nodes into sets A and B 3 do 2 A1 := A; B1 := B 4 compute D values for all a in A1 and b in B1 5 for (i := 1 to |V|/2) 6 find a[i] from A1 and b[i] from B1, such that g[i] = D[a[i]] + D[b[i]] - 2*c[a][b] is maximal 7 move a[i] to B1 and b[i] to A1 8 remove a[i] and b[i] from further consideration in this pass 9 update D values for the elements of A1 = A1 / a[i] and B1 = B1 / b[i] 10 end for 11 find k which maximizes g_max, the sum of g[1],...,g[k] 12 if (g_max > 0) then 13 Exchange a[1],a[2],...,a[k] with b[1],b[2],...,b[k] 14 until (g_max <= 0) 15 return G(V,E)