Kernighan–Lin algorithm
Heuristic algorithm for finding partitions of graphs
- 2 min read
- 2 chapters
Related on Lably
Through Graph (discrete mathematics)
Description
The input to the algorithm is an undirected graph G = (V, E) with vertex set V, edge set E, and (optionally) numerical weights on the edges in E. The goal of the algorithm is to partition V into two disjoint subsets A and B of equal (or nearly equal) size, in a way that minimizes the sum T of the weights of the subset of edges that cross from A to B. If the graph is unweighted, then instead the goal is to minimize the number of crossing edges; this is equivalent to assigning weight one to each edge. The algorithm maintains and improves a partition, in each pass using a greedy algorithm to pair up vertices of A with vertices of B, so that moving the paired vertices from one side of the partition to the other will improve the partition. After matching the vertices, it then performs a subset of the pairs chosen to have the best overall effect on the solution quality T. Given a graph with n vertices, each pass of the algorithm runs in time O(n2 log n).
In more detail, for each , let be the internal cost of a, that is, the sum of the costs of edges between a and other nodes in A, and let be the external cost of a, that is, the sum of the costs of edges between a and nodes in B. Similarly, define , for each . Furthermore, let
be the difference between the external and internal costs of s. If a and b are interchanged, then the reduction in cost is
where is the cost of the possible edge between a and b.
The algorithm attempts to find an optimal series of interchange operations between elements of and which maximizes and then executes the operations, producing a partition of the graph to A and B.
Sign in to keep reading
One more chapter is free with a Lably account.
Pseudocode
Source:
<b id="mwVQ">function</b> Kernighan-Lin(<i id="mwVg">G(V, E)</i>) <b id="mwVw">is</b> determine a balanced initial partition of the nodes into sets A and B <b id="mwWA">do</b> compute D values for all a in A and b in B let gv, av, and bv be empty lists <b id="mwWQ">for</b> n := 1 <b id="mwWg">to</b> |V| / 2 <b id="mwWw">do</b> find a from A and b from B, such that g = D[a] + D[b] − 2×c(a, b) is maximal remove a and b from further consideration in this pass add g to gv, a to av, and b to bv update D values for the elements of A = A \ a and B = B \ b <b id="mwXA">end for</b> find k which maximizes g_max, the sum of gv[1], ..., gv[k] <b id="mwXQ">if</b> g_max > 0 <b id="mwXg">then</b> Exchange av[1], av[2], ..., av[k] with bv[1], bv[2], ..., bv[k] <b id="mwXw">until (g_max ≤ 0)</b> <b id="mwYA">return G(V, E)</b>

