this repo has no description
1/***
2!Test
3solvers: [gecode, chuffed] # Too slow on cbc
4expected:
5- !Result
6 solution: !Solution
7 x: [0, 70, 75, 0, 79, 50, 0, 50, 46, 27, 52, 35, 59, 35, 35, 50, 27, 52, 46, 75, 50]
8 y: [0, 70, 33, 50, 0, 0, 85, 29, 88, 93, 70, 65, 54, 50, 82, 54, 85, 63, 82, 29, 63]
9***/
10
11% TOO LONG mzn20_fd_linear
12% TOO LONG mzn20_mip
13%-----------------------------------------------------------------------------
14% Packing squares into a rectangle
15%
16% Guido Tack, tack@gecode.org
17% 2007-02-22
18%
19% Ported from the Gecode example
20%
21%-----------------------------------------------------------------------------
22
23%-----------------------------------------------------------------------------
24% Specification
25
26int: pack_x;
27int: pack_y;
28int: n;
29array[1..n] of int: pack_s;
30
31% Instance
32
33%pack_x = 4;
34%pack_y = 4;
35%n = 4;
36%pack_s = [2,2,2,2];
37
38pack_x = 112;
39pack_y = 112;
40n = 21;
41pack_s = [50,42,37,35,33,29,27,25,24,19,18,17,16,15,11,9,8,7,6,4,2];
42
43%-----------------------------------------------------------------------------
44% Model
45
46array[1..n] of var 0..pack_x-1: x;
47array[1..n] of var 0..pack_y-1: y;
48
49constraint
50 forall (i in 1..n) (
51 x[i] <= pack_x - pack_s[i] /\
52 y[i] <= pack_y - pack_s[i]
53 )
54 /\
55 forall (i in 1..n, j in i+1..n) (
56 x[j] - x[i] >= pack_s[i] \/
57 x[i] - x[j] >= pack_s[j] \/
58 y[j] - y[i] >= pack_s[i] \/
59 y[i] - y[j] >= pack_s[j]
60 );
61
62% Symmetry breaking
63
64constraint
65 forall (i in 1..n-1) (
66 if pack_s[i]=pack_s[i+1] then
67 x[i] <= x[i+1]
68 else
69 true
70 endif
71 );
72
73% Capacity constraints
74
75constraint
76 forall (cx in 0..pack_x-1) (
77 sum (i in 1..n) (pack_s[i]*bool2int(x[i] in cx-pack_s[i]+1..cx)) = pack_x
78 )
79 /\
80 forall (cy in 0..pack_y-1) (
81 sum (i in 1..n) (pack_s[i]*bool2int(y[i] in cy-pack_s[i]+1..cy)) = pack_y
82 );
83
84solve ::seq_search([int_search(x,smallest,indomain_min,complete),
85 int_search(y,smallest,indomain_min,complete)])
86 satisfy;
87
88output [
89 "packing ",show(n)," squares into a ",show(pack_x),"x",show(pack_y),
90 " rectangle:\n"] ++
91 [ "square "++show(i)++
92 ", size "++show(pack_s[i])++"x"++show(pack_s[i])++
93 ", at ("++show(x[i])++", "++show(y[i])++")\n" | i in 1..n];