lemon-project-template-glpk
diff deps/glpk/examples/maxcut.mod @ 9:33de93886c88
Import GLPK 4.47
author | Alpar Juttner <alpar@cs.elte.hu> |
---|---|
date | Sun, 06 Nov 2011 20:59:10 +0100 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/deps/glpk/examples/maxcut.mod Sun Nov 06 20:59:10 2011 +0100 1.3 @@ -0,0 +1,85 @@ 1.4 +/* MAXCUT, Maximum Cut Problem */ 1.5 + 1.6 +/* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */ 1.7 + 1.8 +/* The Maximum Cut Problem in a network G = (V, E), where V is a set 1.9 + of nodes, E is a set of edges, is to find the partition of V into 1.10 + disjoint sets V1 and V2, which maximizes the sum of edge weights 1.11 + w(e), where edge e has one endpoint in V1 and other endpoint in V2. 1.12 + 1.13 + Reference: 1.14 + Garey, M.R., and Johnson, D.S. (1979), Computers and Intractability: 1.15 + A guide to the theory of NP-completeness [Network design, Cuts and 1.16 + Connectivity, Maximum Cut, ND16]. */ 1.17 + 1.18 +set E, dimen 2; 1.19 +/* set of edges */ 1.20 + 1.21 +param w{(i,j) in E}, >= 0, default 1; 1.22 +/* w[i,j] is weight of edge (i,j) */ 1.23 + 1.24 +set V := (setof{(i,j) in E} i) union (setof{(i,j) in E} j); 1.25 +/* set of nodes */ 1.26 + 1.27 +var x{i in V}, binary; 1.28 +/* x[i] = 0 means that node i is in set V1 1.29 + x[i] = 1 means that node i is in set V2 */ 1.30 + 1.31 +/* We need to include in the objective function only that edges (i,j) 1.32 + from E, for which x[i] != x[j]. This can be modeled through binary 1.33 + variables s[i,j] as follows: 1.34 + 1.35 + s[i,j] = x[i] xor x[j] = (x[i] + x[j]) mod 2, (1) 1.36 + 1.37 + where s[i,j] = 1 iff x[i] != x[j], that leads to the following 1.38 + objective function: 1.39 + 1.40 + z = sum{(i,j) in E} w[i,j] * s[i,j]. (2) 1.41 + 1.42 + To describe "exclusive or" (1) we could think that s[i,j] is a minor 1.43 + bit of the sum x[i] + x[j]. Then introducing binary variables t[i,j], 1.44 + which represent a major bit of the sum x[i] + x[j], we can write: 1.45 + 1.46 + x[i] + x[j] = s[i,j] + 2 * t[i,j]. (3) 1.47 + 1.48 + An easy check shows that conditions (1) and (3) are equivalent. 1.49 + 1.50 + Note that condition (3) can be simplified by eliminating variables 1.51 + s[i,j]. Indeed, from (3) it follows that: 1.52 + 1.53 + s[i,j] = x[i] + x[j] - 2 * t[i,j]. (4) 1.54 + 1.55 + Since the expression in the right-hand side of (4) is integral, this 1.56 + condition can be rewritten in the equivalent form: 1.57 + 1.58 + 0 <= x[i] + x[j] - 2 * t[i,j] <= 1. (5) 1.59 + 1.60 + (One might note that (5) means t[i,j] = x[i] and x[j].) 1.61 + 1.62 + Substituting s[i,j] from (4) to (2) leads to the following objective 1.63 + function: 1.64 + 1.65 + z = sum{(i,j) in E} w[i,j] * (x[i] + x[j] - 2 * t[i,j]), (6) 1.66 + 1.67 + which does not include variables s[i,j]. */ 1.68 + 1.69 +var t{(i,j) in E}, binary; 1.70 +/* t[i,j] = x[i] and x[j] = (x[i] + x[j]) div 2 */ 1.71 + 1.72 +s.t. xor{(i,j) in E}: 0 <= x[i] + x[j] - 2 * t[i,j] <= 1; 1.73 +/* see (4) */ 1.74 + 1.75 +maximize z: sum{(i,j) in E} w[i,j] * (x[i] + x[j] - 2 * t[i,j]); 1.76 +/* see (6) */ 1.77 + 1.78 +data; 1.79 + 1.80 +/* In this example the network has 15 nodes and 22 edges. */ 1.81 + 1.82 +/* Optimal solution is 20 */ 1.83 + 1.84 +set E := 1.85 + 1 2, 1 5, 2 3, 2 6, 3 4, 3 8, 4 9, 5 6, 5 7, 6 8, 7 8, 7 12, 8 9, 1.86 + 8 12, 9 10, 9 14, 10 11, 10 14, 11 15, 12 13, 13 14, 14 15; 1.87 + 1.88 +end;