/* Optimizing a Constraint problem in Picat. From H. Paul Williams "Model Building in Mathematical Programming", 4th edition Optimizing a constraint, sections 12.18, 13.18 and 14.18. This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import mip. main => go. go ?=> Terms = 8, % variables in constraint Ceils = 6, Roofs = 6, Ceiling = [ [1, 2, 3, 0, 0, 0, 0, 0], [1, 2, 4, 8, 0, 0, 0, 0], [1, 2, 6, 7, 0, 0, 0, 0], [1, 3, 5, 6, 0, 0, 0, 0], [2, 3, 4, 6, 0, 0, 0, 0], [2, 5, 6, 7, 8,0, 0, 0] ], Roofing = [ [1, 2, 3, 8, 0, 0, 0, 0], [1, 2, 5, 7, 0, 0, 0, 0], [1, 3, 4, 7, 0, 0, 0, 0], [1, 5, 6, 7, 8, 0, 0, 0], [2, 3, 4, 5, 0, 0, 0, 0], [3, 4, 6, 7, 8, 0, 0, 0]], % array[terms] of var int: a; % new coefficients % new coefficients A = new_list(Terms), A :: 1..1000, % new right-hand-side B :: 0..10000, RHS #= B - A[3] - A[5], % minimise new right-hand-side % alternative objective: minimise sum of new coefficients SS #= sum([A[J]*J : J in 1..Terms]), B #>= 0, RHS #>= 0, foreach(I in 1..Ceils) sum([A[Ceiling[I,J]] : J in 1..Terms, Ceiling[I,J]>0]) #<= B end, foreach(K in 1..Roofs) sum([A[Roofing[K,J]] : J in 1..Terms, Roofing[K,J]>0]) #>= B+1 end, foreach(J in 1..Terms, J < Terms) A[J]-A[J+1] #>= 0 end, Vars = A ++ [B,RHS,SS], % solve($[min(RHS)],Vars), solve($[min(SS),ff,split],Vars), println(a=A), println(b=B), println(rhs=RHS), println(ss=SS), nl. go => true.