this repo has no description
1/***
2!Test
3solvers: [gecode]
4expected:
5- !Result
6 status: OPTIMAL_SOLUTION
7 solution: !Solution
8 cost: 48
9 s: [4, 1, 2, 3, 6, 5]
10 dur: [!!set {2, 4}, !!set {1, 2, 4}, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 3}, !!set {1, 3}]
11 bef: [!!set {}, !!set {2, 4}, !!set {1, 2, 4}, !!set {1, 2, 3, 4}, !!set {1, 2, 3, 4}, !!set {1, 2, 3, 4}]
12 aft: [!!set {1, 2, 3, 4}, !!set {1, 2, 3, 4}, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 3}, !!set {}]
13 a: [!!set {1, 2}, !!set {2, 3}, !!set {3, 4}, !!set {2, 4}, !!set {1, 3}, !!set {1, 4}]
14- !Result
15 status: OPTIMAL_SOLUTION
16 solution: !Solution
17 cost: 48
18 s: [4, 1, 2, 3, 6, 5]
19 dur: [!!set {2, 4}, !!set {1, 2, 4}, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 3}, !!set {1, 3}]
20 bef: [!!set {}, !!set {2, 4}, !!set {1, 2, 4}, !Range 1..4, !Range 1..4, !Range 1..4]
21 aft: [!Range 1..4, !Range 1..4, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 3}, !!set {}]
22 a: [!Range 1..2, !Range 2..3, !Range 3..4, !!set {2, 4}, !!set {1, 3}, !!set {1, 4}]
23- !Result
24 status: OPTIMAL_SOLUTION
25 solution: !Solution
26 cost: 48
27 s: [5, 3, 2, 1, 4, 6]
28 dur: [!!set {1, 3}, !!set {1, 3, 4}, !!set {1, 2, 4}, !!set {1, 2, 4}, !!set {1, 4}, !!set {1, 4}]
29 bef: [!!set {}, !!set {1, 3}, !!set {1, 3, 4}, !Range 1..4, !Range 1..4, !Range 1..4]
30 aft: [!Range 1..4, !Range 1..4, !!set {1, 2, 4}, !!set {1, 2, 4}, !!set {1, 4}, !!set {}]
31 a: [!Range 1..2, !Range 2..3, !Range 3..4, !!set {2, 4}, !!set {1, 3}, !!set {1, 4}]
32- !Result
33 status: OPTIMAL_SOLUTION
34 solution: !Solution
35 cost: 48
36 s: [4, 1, 2, 3, 5, 6]
37 dur: [!!set {2, 4}, !!set {1, 2, 4}, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 4}, !!set {1, 4}]
38 bef: [!!set {}, !!set {2, 4}, !!set {1, 2, 4}, !Range 1..4, !Range 1..4, !Range 1..4]
39 aft: [!Range 1..4, !Range 1..4, !!set {1, 3, 4}, !!set {1, 3, 4}, !!set {1, 4}, !!set {}]
40 a: [!Range 1..2, !Range 2..3, !Range 3..4, !!set {2, 4}, !!set {1, 3}, !!set {1, 4}]
41***/
42
43% mzn2fzn and minizinc aborted on this model with an error message about
44% being unable to compute set bounds. This was fixed in r8782.
45% (This is derived from the talent scheduling model in the MiniZinc
46% benchmarks.)
47
48include "all_different.mzn";
49
50int: numActors; % number of actors
51int: numScenes; % numer of scenes
52
53%-- Types ---------------------------------------------------------------------
54set of int: Actors = 1..numActors;
55set of int: Scenes = 1..numScenes;
56
57array[Actors,Scenes] of 0..1: ia; % 01 definition of actors in scenes
58array[Scenes] of set of Actors: a :: add_to_output =
59 [ { j | j in Actors where ia[j,i] == 1} | i in Scenes] ; % actors for each scene
60array[Scenes] of int: d; % duration of each scene
61array[Actors] of int: c; % cost of each actor
62
63numScenes = 6;
64numActors = 4;
65ia = [|
661,0,0,0,1,1|
671,1,0,1,0,0|
680,1,1,0,1,0|
690,0,1,1,0,1|];
70c = [1,1,1,1];
71d = [1,2,3,4,5,6];
72
73%-- Decision variables --------------------------------------------------------
74
75array[Scenes] of var Scenes: s :: add_to_output; % schedule of scenes
76
77%-- Auxilliary variables ------------------------------------------------------
78
79array[Scenes] of var set of Actors: bef :: add_to_output; % actors appearing before time t
80array[Scenes] of var set of Actors: aft :: add_to_output; % actors appearing after time t
81array[Scenes] of var set of Actors: dur :: add_to_output; % actors on set at time t
82
83var int: cost :: add_to_output;
84
85%-- Constraints ---------------------------------------------------------------
86
87constraint all_different(s); % each scene scheduled once
88
89constraint
90 bef[1] = {} /\ % no actors before time 1
91 aft[numScenes] = {} /\ % no actors after time numScenes
92 forall(t in 1..numScenes-1)(
93 bef[t+1] = a[s[t]] union bef[t] /\
94 aft[t] = a[s[t+1]] union aft[t+1] );
95
96constraint
97 dur[1] = a[s[1]] /\
98 forall(t in 2..numScenes-1)(
99 dur[t] = bef[t+1] intersect aft[t]
100 ) /\
101 dur[numScenes] = a[s[numScenes]];
102
103constraint cost = sum(i in Scenes)(
104 sum(j in Actors)(
105 c[j] * d[s[i]] * bool2int(j in dur[i])
106 )
107 );
108
109%-- symmetry breaking constraint
110constraint s[1] < s[numScenes];
111
112%-- Solving objective and solution output -------------------------------------
113
114solve :: int_search(s, first_fail, indomain, complete)
115 minimize cost;