You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							111 lines
						
					
					
						
							3.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							111 lines
						
					
					
						
							3.1 KiB
						
					
					
				| /* min01ks.mod - finding minimal equivalent 0-1 knapsack inequality */ | |
| 
 | |
| /* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */ | |
| 
 | |
| /* It is obvious that for a given 0-1 knapsack inequality | |
|  | |
|       a[1] x[1] + ... + a[n] x[n] <= b,  x[j] in {0, 1}              (1) | |
|  | |
|    there exist infinitely many equivalent inequalities with exactly the | |
|    same feasible solutions. | |
|  | |
|    Given a[j]'s and b this model allows to find an inequality | |
|  | |
|       alfa[1] x[1] + ... + alfa[n] x[n] <= beta,  x[j] in {0, 1},    (2) | |
|  | |
|    which is equivalent to (1) and where alfa[j]'s and beta are smallest | |
|    non-negative integers. | |
|  | |
|    This model has the following formulation: | |
|  | |
|       minimize | |
|  | |
|          z = |alfa[1]| + ... + |alfa[n]| + |beta| =                  (3) | |
|  | |
|            = alfa[1] + ... + alfa[n] + beta | |
|  | |
|       subject to | |
|  | |
|          alfa[1] x[1] + ... + alfa[n] x[n] <= beta                   (4) | |
|  | |
|                               for all x satisfying to (1) | |
|  | |
|          alfa[1] x[1] + ... + alfa[n] x[n] >= beta + 1               (5) | |
|  | |
|                               for all x not satisfying to (1) | |
|  | |
|          alfa[1], ..., alfa[n], beta are non-negative integers. | |
|  | |
|    Note that this model has n+1 variables and 2^n constraints. | |
|  | |
|    It is interesting, as noticed in [1] and explained in [2], that | |
|    in most cases LP relaxation of the MIP formulation above has integer | |
|    optimal solution. | |
|  | |
|    References | |
|  | |
|    1. G.H.Bradley, P.L.Hammer, L.Wolsey, "Coefficient Reduction for | |
|       Inequalities in 0-1 Variables", Math.Prog.7 (1974), 263-282. | |
|  | |
|    2. G.J.Koehler, "A Study on Coefficient Reduction of Binary Knapsack | |
|       Inequalities", University of Florida, 2001. */ | |
| 
 | |
| param n, integer, > 0; | |
| /* number of variables in the knapsack inequality */ | |
| 
 | |
| set N := 1..n; | |
| /* set of knapsack items */ | |
| 
 | |
| /* all binary n-vectors are numbered by 0, 1, ..., 2^n-1, where vector | |
|    0 is 00...00, vector 1 is 00...01, etc. */ | |
| 
 | |
| set U := 0..2^n-1; | |
| /* set of numbers of all binary n-vectors */ | |
| 
 | |
| param x{i in U, j in N}, binary, := (i div 2^(j-1)) mod 2; | |
| /* x[i,j] is j-th component of i-th binary n-vector */ | |
| 
 | |
| param a{j in N}, >= 0; | |
| /* original coefficients */ | |
| 
 | |
| param b, >= 0; | |
| /* original right-hand side */ | |
| 
 | |
| set D := setof{i in U: sum{j in N} a[j] * x[i,j] <= b} i; | |
| /* set of numbers of binary n-vectors, which (vectors) are feasible, | |
|    i.e. satisfy to the original knapsack inequality (1) */ | |
| 
 | |
| var alfa{j in N}, integer, >= 0; | |
| /* coefficients to be found */ | |
| 
 | |
| var beta, integer, >= 0; | |
| /* right-hand side to be found */ | |
| 
 | |
| minimize z: sum{j in N} alfa[j] + beta; /* (3) */ | |
| 
 | |
| phi{i in D}: sum{j in N} alfa[j] * x[i,j] <= beta; /* (4) */ | |
| 
 | |
| psi{i in U diff D}: sum{j in N} alfa[j] * x[i,j] >= beta + 1; /* (5) */ | |
| 
 | |
| solve; | |
| 
 | |
| printf "\nOriginal 0-1 knapsack inequality:\n"; | |
| for {j in 1..n} printf (if j = 1 then "" else " + ") & "%g x%d", | |
|    a[j], j; | |
| printf " <= %g\n", b; | |
| printf "\nMinimized equivalent inequality:\n"; | |
| for {j in 1..n} printf (if j = 1 then "" else " + ") & "%g x%d", | |
|    alfa[j], j; | |
| printf " <= %g\n\n", beta; | |
| 
 | |
| data; | |
| 
 | |
| /* These data correspond to the very first example from [1]. */ | |
| 
 | |
| param n := 8; | |
| 
 | |
| param a := [1]65, [2]64, [3]41, [4]22, [5]13, [6]12, [7]8, [8]2; | |
| 
 | |
| param b := 80; | |
| 
 | |
| end;
 |