A set of benchmarks to compare a new prototype MiniZinc implementation
1include "bin_packing_load_fn.mzn";
2
3%------------------------------------------------------------------------------%
4% Parameters
5
6par int: nbOrders;
7par int: nbColours;
8
9par set of int: sizes;
10
11array[int] of par int: ordSize;
12array[int] of par int: ordCol;
13
14par int: nbSlabs = nbOrders;
15
16%------------------------------------------------------------------------------%
17% Variables
18
19array[1..nbOrders] of var 1..nbSlabs: assign;
20
21array[int] of par int: order = arg_sort(ordSize);
22
23array[int] of var 1..nbSlabs: ordered = [ assign[order[nbOrders-p+1]] | p in 1..nbOrders ];
24
25constraint forall(i in 1..nbSlabs) (
26 sum([ bool2int(exists(o in 1..nbOrders where ordCol[o]=c)(assign[o] = i)) | c in 1..nbColours ]) <= 2
27 );
28
29array[1..nbSlabs] of var 0..max(sizes): loads = bin_packing_load(assign, [ordSize[i] | i in 1..nbOrders]);
30
31array[0..max(sizes)] of par int: frees =
32 array1d(0..max(sizes), [min([c - l | c in sizes where c >= l]) | l in 0..max(sizes)]);
33
34
35constraint symmetry_breaking_constraint(
36 forall(i in 1..nbSlabs-1) (loads[i] = 0 -> loads[i+1] = 0));
37
38constraint symmetry_breaking_constraint(
39 forall(i in 1..nbOrders, j in 1..nbOrders where j > i)(
40 (ordSize[i] = ordSize[j] /\ ordCol[i] = ordCol[j]) -> assign[i] <= assign[j]));
41
42int: objub = max(frees)*nbSlabs;
43var 0..objub: objective;
44
45constraint objective = sum(j in 1..nbSlabs)(frees[loads[j]]);
46
47solve
48 :: int_search(ordered, first_fail, indomain_min, complete)
49 minimize objective;
50
51output [
52 "assign = \(assign);\n",
53 "objective = \(objective);\n",
54];