lemon-project-template-glpk
comparison deps/glpk/examples/min01ks.mod @ 11:4fc6ad2fb8a6
Test GLPK in src/main.cc
author | Alpar Juttner <alpar@cs.elte.hu> |
---|---|
date | Sun, 06 Nov 2011 21:43:29 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e55381c005d9 |
---|---|
1 /* min01ks.mod - finding minimal equivalent 0-1 knapsack inequality */ | |
2 | |
3 /* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */ | |
4 | |
5 /* It is obvious that for a given 0-1 knapsack inequality | |
6 | |
7 a[1] x[1] + ... + a[n] x[n] <= b, x[j] in {0, 1} (1) | |
8 | |
9 there exist infinitely many equivalent inequalities with exactly the | |
10 same feasible solutions. | |
11 | |
12 Given a[j]'s and b this model allows to find an inequality | |
13 | |
14 alfa[1] x[1] + ... + alfa[n] x[n] <= beta, x[j] in {0, 1}, (2) | |
15 | |
16 which is equivalent to (1) and where alfa[j]'s and beta are smallest | |
17 non-negative integers. | |
18 | |
19 This model has the following formulation: | |
20 | |
21 minimize | |
22 | |
23 z = |alfa[1]| + ... + |alfa[n]| + |beta| = (3) | |
24 | |
25 = alfa[1] + ... + alfa[n] + beta | |
26 | |
27 subject to | |
28 | |
29 alfa[1] x[1] + ... + alfa[n] x[n] <= beta (4) | |
30 | |
31 for all x satisfying to (1) | |
32 | |
33 alfa[1] x[1] + ... + alfa[n] x[n] >= beta + 1 (5) | |
34 | |
35 for all x not satisfying to (1) | |
36 | |
37 alfa[1], ..., alfa[n], beta are non-negative integers. | |
38 | |
39 Note that this model has n+1 variables and 2^n constraints. | |
40 | |
41 It is interesting, as noticed in [1] and explained in [2], that | |
42 in most cases LP relaxation of the MIP formulation above has integer | |
43 optimal solution. | |
44 | |
45 References | |
46 | |
47 1. G.H.Bradley, P.L.Hammer, L.Wolsey, "Coefficient Reduction for | |
48 Inequalities in 0-1 Variables", Math.Prog.7 (1974), 263-282. | |
49 | |
50 2. G.J.Koehler, "A Study on Coefficient Reduction of Binary Knapsack | |
51 Inequalities", University of Florida, 2001. */ | |
52 | |
53 param n, integer, > 0; | |
54 /* number of variables in the knapsack inequality */ | |
55 | |
56 set N := 1..n; | |
57 /* set of knapsack items */ | |
58 | |
59 /* all binary n-vectors are numbered by 0, 1, ..., 2^n-1, where vector | |
60 0 is 00...00, vector 1 is 00...01, etc. */ | |
61 | |
62 set U := 0..2^n-1; | |
63 /* set of numbers of all binary n-vectors */ | |
64 | |
65 param x{i in U, j in N}, binary, := (i div 2^(j-1)) mod 2; | |
66 /* x[i,j] is j-th component of i-th binary n-vector */ | |
67 | |
68 param a{j in N}, >= 0; | |
69 /* original coefficients */ | |
70 | |
71 param b, >= 0; | |
72 /* original right-hand side */ | |
73 | |
74 set D := setof{i in U: sum{j in N} a[j] * x[i,j] <= b} i; | |
75 /* set of numbers of binary n-vectors, which (vectors) are feasible, | |
76 i.e. satisfy to the original knapsack inequality (1) */ | |
77 | |
78 var alfa{j in N}, integer, >= 0; | |
79 /* coefficients to be found */ | |
80 | |
81 var beta, integer, >= 0; | |
82 /* right-hand side to be found */ | |
83 | |
84 minimize z: sum{j in N} alfa[j] + beta; /* (3) */ | |
85 | |
86 phi{i in D}: sum{j in N} alfa[j] * x[i,j] <= beta; /* (4) */ | |
87 | |
88 psi{i in U diff D}: sum{j in N} alfa[j] * x[i,j] >= beta + 1; /* (5) */ | |
89 | |
90 solve; | |
91 | |
92 printf "\nOriginal 0-1 knapsack inequality:\n"; | |
93 for {j in 1..n} printf (if j = 1 then "" else " + ") & "%g x%d", | |
94 a[j], j; | |
95 printf " <= %g\n", b; | |
96 printf "\nMinimized equivalent inequality:\n"; | |
97 for {j in 1..n} printf (if j = 1 then "" else " + ") & "%g x%d", | |
98 alfa[j], j; | |
99 printf " <= %g\n\n", beta; | |
100 | |
101 data; | |
102 | |
103 /* These data correspond to the very first example from [1]. */ | |
104 | |
105 param n := 8; | |
106 | |
107 param a := [1]65, [2]64, [3]41, [4]22, [5]13, [6]12, [7]8, [8]2; | |
108 | |
109 param b := 80; | |
110 | |
111 end; |