Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- include "globals.mzn";
- int: n;
- int: k;
- int: EndTime;
- int: ConstTime;
- array[1..n] of var 0..EndTime: Begins;
- array[1..n] of var 0..EndTime: Ends;
- array[1..n] of 0..EndTime: Durations;
- array[1..n] of var 0..EndTime: NeedEnds;
- array[1..n] of var 0..1: TimeCondition;
- array[1..n] of 0..EndTime: Start_time;
- array[1..k] of 0..EndTime: B;
- array[1..k] of 0..EndTime: E;
- array[1..n] of var 0..1: NeedCh;
- array[1..n] of var 1..n: x;
- array[1..n] of 0..EndTime: FirstTime;
- array[1..n,1..n] of 0..EndTime: Time;
- % No overlapping
- predicate no_overlap(var int:s1, var int:d1, var int:z1, int:h1, var int:s2, var int:d2, var int:z2, int:h2) =
- s1 + d1 + z1 + h1 <= s2 / s2 + d2 + z2 + h2 <= s1;
- predicate in_interval(var int:c, int:k,
- var int:b,
- var int:s,
- array[int] of var int:B_int,
- array[int] of var int:E_int) =
- (let {
- array[1..k] of var 0..1: res,
- int: i = 1
- } in
- forall(i in 1..k) (res[i] = (if (b >=B_int[i]
- / b+s <=E_int[i]) / c = 0
- then 1 else 0 endif ))
- /
- sum(res) > 0);
- % general constraints
- constraint
- all_different(x)
- /
- forall(i in 1..n) (Ends[x[i]] = Begins[x[i]] + ConstTime + Start_time[x[i]] + Durations[x[i]])
- /
- forall(i,j in 1..n where i < j) (
- no_overlap(Begins[x[i]], Durations[x[i]], Start_time[x[i]], ConstTime, Begins[x[j]], Durations[x[j]], Start_time[x[j]], ConstTime)
- /
- forall(i in 1..n) (in_interval(NeedCh[x[i]], k, Begins[x[i]]+ConstTime, Start_time[x[i]], B, E))
- /
- forall(i in 1..n) (TimeCondition[x[i]] = (NeedEnds[x[i]] >= Ends[x[i]]))
- )
- ;
- solve :: int_search(x ++ Begins, first_fail,
- indomain_split,
- complete) maximize sum(i in 1..n) (TimeCondition[i]);
- output [
- " [A1, A2, A3, A4n",
- "x: ", show(x), "n",
- "Begins: ", show(Begins), "n",
- "First time: ", show(FirstTime), "n",
- "Start times: ", show(Start_time), "n",
- "Durations: ", show(Durations), "n",
- "Ends: ", show(Ends), "n",
- "Need: ", show(NeedEnds), "n",
- "TimeCondition: ", show(TimeCondition), "n",
- ];
- n = 4;
- k = 1;
- Durations = [6,5,10,7];
- NeedEnds = [20,20,10,30];
- EndTime = 40000000000;
- Start_time = [1,2,1,4];
- B = [100];
- E = [200];
- NeedCh = [0,0,0,0];
- ConstTime = 5;
- %[A1, A2, A3, A4
- FirstTime = [1, 2, 3, 4];
- Time = [| 0, 12, 13, 14, %A1
- | 21, 0, 23, 24, %A2
- | 31, 32, 0, 34, %A3
- | 41, 42, 43, 0|]; %A4
Add Comment
Please, Sign In to add comment