A set of benchmarks to compare a new prototype MiniZinc implementation
at develop 1.5 kB view raw
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];