Skip to content

Commit e82ad43

Browse files
author
Carleton
committed
initial checkin of mzn examples
1 parent 5d8ad9e commit e82ad43

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+1407
-0
lines changed

Diff for: array_quest.mzn

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
set of int: COL = 1..5;
2+
set of int: ROW = 1..2;
3+
array[ROW,COL] of int: c =
4+
[| 250, 2, 75, 100, 0
5+
| 200, 0, 150, 150, 75 |];
6+
array[COL,ROW] of int: b = array2d(COL, ROW,
7+
[c[j, i] | i in COL, j in ROW]);
8+
9+
solve satisfy;
10+
11+
output ["b = ["] ++
12+
[ if j = 1 then "| " else "" endif ++
13+
show_int(3,b[i,j]) ++ if j = 2 then "\n " else "," endif
14+
| i in COL, j in ROW ] ++ ["|];"];

Diff for: aust_color/aust_color.mzn

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
% Colouring Australia using 4 colors
2+
int: nc = 4;
3+
4+
var 1..nc: wa; var 1..nc: nt;
5+
var 1..nc: sa; var 1..nc: q;
6+
var 1..nc: nsw; var 1..nc: v;
7+
var 1..nc: t;
8+
9+
constraint wa != nt;
10+
constraint wa != sa;
11+
constraint nt != sa;
12+
constraint nt != q;
13+
constraint sa != q;
14+
constraint sa != nsw;
15+
constraint sa != v;
16+
constraint q != nsw;
17+
constraint nsw != v;
18+
19+
solve satisfy;
20+
21+
output ["wa=\(wa)",
22+
" nt=\(nt)",
23+
" sa=\(sa)\n",
24+
"q=\(q)",
25+
" nsw=\(nsw)",
26+
" v=\(v)\n",
27+
"t=\(t)\n"];

Diff for: aust_color/aust_colord.mzn

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
% Colouring Australia using nc colors
2+
int: nc;
3+
4+
var 1..nc: wa; var 1..nc: nt;
5+
var 1..nc: sa; var 1..nc: q;
6+
var 1..nc: nsw; var 1..nc: v;
7+
var 1..nc: t;
8+
9+
constraint wa != nt;
10+
constraint wa != sa;
11+
constraint nt != sa;
12+
constraint nt != q;
13+
constraint sa != q;
14+
constraint sa != nsw;
15+
constraint sa != v;
16+
constraint q != nsw;
17+
constraint nsw != v;
18+
19+
solve satisfy;
20+
21+
output ["wa=\(wa)",
22+
" nt=\(nt)",
23+
" sa=\(sa)\n",
24+
"q=\(q)",
25+
" nsw=\(nsw)",
26+
" v=\(v)\n",
27+
"t=\(t)\n"];

Diff for: buggy/context.mzn

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
array[1..10] of var bool: x;
2+
var 0..5: y;
3+
predicate atmostone(array[int] of var bool: b);
4+
constraint y != 0 -> atmostone(x);
5+
6+
solve satisfy;

Diff for: buggy/division.mzn

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
var -4..4:x;
2+
var -4..4:y;
3+
constraint divp(x,y,3);
4+
5+
predicate divp(var int:x,var int: y,var int: z)
6+
= assert(lb(y) >= 0,
7+
"divp: y must be non-negative",
8+
let { var 0..ub(y)-1: r } in
9+
x = z * y + r /\ r < y);
10+
11+
solve satisfy;

Diff for: buggy/missing_solution.mzn

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
% Missing Solutions
2+
int: n; % no of people
3+
set of int: PERSON = 1..n;
4+
int: male = 1; int: female = 2;
5+
set of int: GENDER = male..female;
6+
array[PERSON] of GENDER: gender;
7+
array[PERSON] of int: age;
8+
9+
array[1..n] of var PERSON: order;
10+
11+
include "alldifferent.mzn";
12+
constraint alldifferent(order);
13+
14+
% males and females alternate
15+
constraint forall(i in 1..n)
16+
(i mod 2 = 0 <-> gender[order[i]] = female);
17+
18+
% age does not grow bu more than 10
19+
constraint forall(i in 1..n-1)
20+
(age[order[i+1]] - age[order[i]] <= 10);
21+
22+
solve satisfy;
23+
24+
output [ show(order), "\n"] ++
25+
["["] ++ [ show(age[order[i]]) ++ if i < n then ", " else "]\n" endif
26+
| i in 1..n ] ++
27+
["["] ++ [ show(gender[order[i]]) ++ if i < n then ", " else "]\n" endif
28+
| i in 1..n ];
29+
30+
31+
%n = 6;
32+
%gender = [male,male,male,female,female,female];
33+
%age = [13, 25, 34, 40, 16, 13];
34+
35+
n = 5;
36+
gender = [male,male,female,female,female];
37+
age = [13,25,34,40,16];
38+
39+
%order = [4,2,3,1,5];

Diff for: buggy/test.mzn

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
3+
set of int: A = {1,3,5};
4+
5+
set of int: B = trace("setB",{2,3,6});
6+
7+
array[A union B] of var 0..1: x;
8+
9+
10+
solve satisfy;
11+
12+
output [show(x)];

Diff for: buggy/trace.mzn

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
int: n = 5;
2+
array[1..n] of var 1..n: a;
3+
array[1..n] of 1..n: b = [3,5,2,3,1];
4+
5+
constraint forall(j in 1..n, i in trace("b[\(n-j)]\n",b[n-j]) .. n)
6+
(a[j] < i);
7+
8+
solve satisfy;

Diff for: carpet_cutting/carpet_cutting.mzn

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
int: n; % number of rooms
2+
set of int: ROOM = 1..n;
3+
int: m; % number of rectangle/offsets
4+
set of int: ROFF = 1..m;
5+
array[ROFF,1..4] of int: d; % defns
6+
set of int: ROT = 1..4;
7+
array[ROOM,ROT] of set of ROFF: shape;
8+
int: h; % height of roll
9+
int: maxl; % maximum length of roll
10+
11+
n = 3; m = 7;
12+
d = [| 0,0,3,4 % (xoffset,yoffset,xsize,ysize)
13+
| 0,1,4,3
14+
| 1,4,1,1
15+
| 3,1,1,2
16+
| 4,2,1,1
17+
| 1,0,2,1
18+
| 0,0,4,3 |];
19+
shape = [| {1,3,4}, {2,5,6}, {}, {}
20+
| {1,3,4}, {2,5,6}, {}, {}
21+
| {1}, {7}, {}, {} |];
22+
h = 7; maxl = 12;
23+
24+
array[ROOM] of var 0..maxl: x;
25+
array[ROOM] of var 0..h: y;
26+
array[ROOM] of var ROT: rot;
27+
28+
var 0..maxl: l; % length of carpet used
29+
30+
solve minimize l;
31+
32+
constraint forall(i in ROOM)(shape[i,rot[i]] != {});
33+
34+
constraint forall(i in ROOM)(forall(r in ROFF)
35+
(r in shape[i,rot[i]] ->
36+
(x[i] + d[r,1] + d[r,3] <= l /\
37+
y[i] + d[r,2] + d[r,4] <= h)));
38+
39+
constraint forall(i,j in ROOM where i < j)
40+
(forall(r1,r2 in ROFF)
41+
(r1 in shape[i,rot[i]] /\
42+
r2 in shape[j,rot[j]] ->
43+
(x[i] + d[r1,1] + d[r1,3] <= x[j] + d[r2,1]
44+
\/
45+
x[j] + d[r2,1] + d[r2,3] <= x[i] + d[r1,1]
46+
\/
47+
y[i] + d[r1,2] + d[r1,4] <= y[j] + d[r2,2]
48+
\/
49+
y[j] + d[r2,2] + d[r2,4] <= y[i] + d[r1,2])
50+
));
51+
52+
output ["l = \(l);\nx = \(x);\ny = \(y);\nrot = \(rot);\n"];
53+

Diff for: carpet_cutting/carpet_cutting_geost.mzn

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
int: n; % number of rooms
2+
set of int: ROOM = 1..n;
3+
int: m; % number of rectangle/offsets
4+
set of int: ROFF = 1..m;
5+
array[ROFF,1..4] of int: d; % defns
6+
set of int: ROT = 1..4;
7+
array[ROOM,ROT] of set of ROFF: shape;
8+
int: h; % height of roll
9+
int: maxl; % maximum length of roll
10+
11+
n = 3; m = 7;
12+
d = [| 0,0,3,4 % (xoffset,yoffset,xsize,ysize)
13+
| 0,1,4,3
14+
| 1,4,1,1
15+
| 3,1,1,2
16+
| 4,2,1,1
17+
| 1,0,2,1
18+
| 0,0,4,3 |];
19+
shape = [| {1,3,4}, {2,5,6}, {}, {}
20+
| {1,3,4}, {2,5,6}, {}, {}
21+
| {1}, {7}, {}, {} |];
22+
h = 7; maxl = 12;
23+
24+
array[ROOM] of var 0..maxl: x;
25+
array[ROOM] of var 0..h: y;
26+
27+
set of int: DIM = 1..2;
28+
array[ROFF,DIM] of int: rect_size =
29+
array2d(ROFF,DIM, [ d[r,i] | r in ROFF, i in 3..4]);
30+
array[ROFF,DIM] of int: rect_offset =
31+
array2d(ROFF,DIM, [ d[r,i] | r in ROFF, i in 1..2]);
32+
array[int] of set of ROFF: shapes = [ {1,3,4}, {2,5,6}, {1}, {7} ];
33+
set of int: SHAPE = index_set(shapes);
34+
%array[int] of set of RECT: s = sort([shapes[i,j] | i in 1..n, j in 1..4]);
35+
36+
array[ROOM] of var SHAPE: kind;
37+
array[ROOM,DIM] of var int: coords =
38+
array2d(ROOM,DIM, [ if j = 1 then x[i] else y[i] endif
39+
| i in ROOM, j in 1..2 ]);
40+
41+
42+
43+
include "geost.mzn";
44+
45+
constraint geost_bb(2,
46+
rect_size,
47+
rect_offset,
48+
shapes,
49+
coords,
50+
kind,
51+
[0,0],
52+
[l,h]);
53+
54+
var 0..maxl: l; % length of carpet used
55+
56+
solve minimize l;
57+
58+
constraint forall(i in ROOM)
59+
(exists(r in ROT where shape[i,r] != {})
60+
(shapes[kind[i]] = shape[i,r]));
61+
62+
63+
output ["rect_size = \(rect_size);\nrect_offset = \(rect_offset);\n"] ++
64+
["l = \(l);\nx = \(x);\ny = \(y);\nkind = \(kind);\n"];
65+

Diff for: carpet_cutting/cc_geost.mzn

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
int: n; % number of rooms
2+
set of int: ROOM = 1..n;
3+
int: m; % number of rectangle/offsets
4+
set of int: ROFF = 1..m;
5+
array[ROFF,1..4] of int: d; % defns
6+
set of int: ROT = 1..4;
7+
array[ROOM,ROT] of set of ROFF: shape;
8+
int: h; % height of roll
9+
int: maxl; % maximum length of roll
10+
11+
n = 3; m = 7;
12+
d = [| 0,0,3,4 % (xoffset,yoffset,xsize,ysize)
13+
| 0,1,4,3
14+
| 1,4,1,1
15+
| 3,1,1,2
16+
| 4,2,1,1
17+
| 1,0,2,1
18+
| 0,0,4,3 |];
19+
shape = [| {1,3,4}, {2,5,6}, {}, {}
20+
| {1,3,4}, {2,5,6}, {}, {}
21+
| {1}, {7}, {}, {} |];
22+
h = 7; maxl = 12;
23+
24+
25+
array[ROOM] of var 0..maxl: x;
26+
array[ROOM] of var 0..h: y;
27+
28+
set of int: SHAPE = 1..4;
29+
array[ROOM] of var SHAPE: kind;
30+
31+
constraint geost_bb(2,
32+
[| 3,4 | 4,3 | 1,1 | 1,2 | 1,1 | 2,1 | 4,3 |],
33+
[| 0,0 | 0,1 | 1,4 | 3,1 | 4,2 | 1,0 | 0,0 |],
34+
[ {1,3,4}, {2,5,6}, {1}, {7} ],
35+
[| x[1], y[1] | x[2],y[2] | x[3],y[3] |],
36+
kind,
37+
[ 0,0 ],
38+
[ l, h]);
39+
40+
constraint kind[1] in {1,2};
41+
constraint kind[2] in {1,2};
42+
constraint kind[3] in {3,4};
43+
include "geost.mzn";
44+
45+
var 0..maxl: l; % length of carpet used
46+
47+
solve minimize l;
48+
49+
output ["l = \(l);\nx = \(x);\ny = \(y);\nkind = \(kind);\n"];
50+

Diff for: cell_block/.DS_Store

6 KB
Binary file not shown.

Diff for: cell_block/cell_block.dzn

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
k = 10;
2+
n = 4;
3+
m = 4;
4+
danger = {1,3,8};
5+
female = {1,2,3,4,5};
6+
7+
cost = [| 3, 4, 5, 8
8+
| 1, 3, 5, 6
9+
| 4, 5, 3, 2
10+
| 7, 4, 5, 6 |];

Diff for: cell_block/cell_block.mzn

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
int: k;
2+
set of int: PRISONER = 1..k;
3+
int: n;
4+
set of int: ROW = 1..n;
5+
int: m;
6+
set of int: COL = 1..m;
7+
set of PRISONER: danger;
8+
set of PRISONER: female;
9+
set of PRISONER: male = PRISONER diff female;
10+
array[ROW,COL] of int: cost;
11+
12+
13+
array[PRISONER] of var ROW: r;
14+
array[PRISONER] of var COL: c;
15+
16+
%constraint forall(p1, p2 in PRISONER where p1 < p2)
17+
% (abs(r[p1] - r[p2]) + abs(c[p1] - c[p2]) > 0);
18+
include "alldifferent.mzn";
19+
constraint alldifferent([r[p] * m + c[p] | p in PRISONER]);
20+
21+
constraint forall(p in PRISONER, d in danger where p != d)
22+
( abs(r[p] - r[d]) + abs(c[p] - c[d]) > 1 );
23+
24+
constraint forall(p in female)(r[p] <= (n + 1) div 2);
25+
constraint forall(p in male)(r[p] >= (n - 1) div 2);
26+
27+
var int: totalcost = sum(p in PRISONER)(cost[r[p],c[p]]);
28+
solve minimize totalcost;
29+
30+
output ["cost = \(totalcost)\n"] ++
31+
[ "Prisoner \(p) " ++ if p in female then "(F)" else "(M)" endif ++
32+
" in [\(r[p]),\(c[p])].\n"
33+
| p in PRISONER ];

Diff for: cluster/cluster.dzn

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
n = 5;
2+
3+
dist = [| 0, 1, 2, 3, 4
4+
| 1, 0, 3, 2, 1
5+
| 2, 3, 0, 4, 1
6+
| 3, 2, 4, 0, 1
7+
| 4, 1, 1, 1, 0 |];
8+
9+
k = 3;
10+
11+
maxdiam = 3;

0 commit comments

Comments
 (0)