this repo has no description
1/***
2!Test
3expected:
4- !Result
5 solution: !Solution
6 ful: [false, false, false, true, false, true, false, false, true, false, false, false, true, true, true, true, true]
7 objective: 8
8 pos: [0, 1, 4, 3, 2, 8, 5, 6, 7]
9 satisfies: 8
10- !Result
11 solution: !Solution
12 ful: [false, true, true, false, true, false, false, false, false, true, true, false, false, true, true, false, true]
13 objective: 8
14 pos: [3, 8, 6, 0, 2, 1, 5, 4, 7]
15 satisfies: 8
16- !Result
17 solution: !Solution
18 ful: [false, true, false, false, false, false, false, true, false, false, true, false, true, true, true, true, true]
19 objective: 8
20 pos: [1, 3, 4, 2, 0, 8, 5, 6, 7]
21 satisfies: 8
22- !Result
23 solution: !Solution
24 ful: [false, true, true, false, true, true, false, false, true, false, true, false, false, true, false, true, false]
25 objective: 8
26 pos: [5, 8, 2, 3, 4, 0, 1, 6, 7]
27 satisfies: 8
28***/
29
30%-----------------------------------------------------------------------------
31% Placing people on a photo
32%
33% Guido Tack
34% 2007-02-22
35%
36% Ported from the Gecode example
37%
38%-----------------------------------------------------------------------------
39
40% A group of people wants to take a group photo. Each person can give
41% preferences next to whom he or she wants to be placed on the
42% photo. The problem to be solved is to find a placement that
43% satisfies as many preferences as possible.
44
45include "globals.mzn";
46
47%-----------------------------------------------------------------------------
48% Specification
49
50int: n_names;
51int: n_prefs;
52array[1..n_prefs,1..2] of int: prefs;
53
54% Instance
55
56n_names = 9;
57n_prefs = 17;
58prefs = array2d(1..n_prefs, 1..2,
59 [| 1,3 | 1,5 | 1,8 | 2,5 | 2,9 | 3,4 | 3,5 | 4,1 | 4,5 |
60 5,6 | 5,1 | 6,1 | 6,9 | 7,3 | 7,8 | 8,9 | 8,7 |]
61);
62
63%-----------------------------------------------------------------------------
64% Model
65
66array[1..n_names] of var 0..n_names-1: pos;
67var 0..n_names-1: satisfies;
68
69array[1..n_prefs] of var bool: ful;
70
71constraint
72 forall (i in 1..n_prefs) (
73 let {
74 int: pa = prefs[i,1],
75 int: pb = prefs[i,2]
76 } in
77 ful[i] = (pos[pb]-pos[pa] == 1 xor pos[pa]-pos[pb] == 1)
78 );
79
80constraint
81 sum (i in 1..n_prefs) (bool2int(ful[i])) = satisfies;
82
83constraint
84 alldifferent(pos);
85
86% Break some symmetry
87constraint
88 pos[1] < pos[2];
89
90% Justification for annotation, from Guido:
91% I've had a closer look at the FlatZinc file for photo again. The real
92% problem is branching! Currently, if nothing is annotated, I branch on
93% all the variables, just naively in the order they're given in the source
94% file. For photo, this is apparently the worst you can do. You have to
95% branch on the pos array (that's what the Gecode version does), but this
96% array appears only after loads of Boolean variables. I've added a
97% search annotation to photo.mzn, which should solve this issue.
98solve :: int_search(pos, first_fail, indomain, complete)
99 maximize satisfies;
100
101output ["Positions: ", show(pos), "\n",
102 "Preferences satisfied: ", show(satisfies), "\n"];