32 lines
961 B
MiniZinc
32 lines
961 B
MiniZinc
enum JOB;
|
|
enum TASK;
|
|
TASK: last = max(TASK);
|
|
array [JOB,TASK] of int: d; % 任务持续时间
|
|
int: total = sum(i in JOB, j in TASK)(d[i,j]);% 总持续时间
|
|
int: digs = ceil(log(10.0,int2float(total))); % 输出的数值
|
|
array [JOB,TASK] of var 0..total: s; % 起始时间
|
|
var 0..total: end; % 总结束时间
|
|
|
|
|
|
constraint %% 保证任务按照顺序出现
|
|
forall(i in JOB) (
|
|
forall(j in TASK where j < last)
|
|
(s[i,j] + d[i,j] <= s[i,enum_next(TASK,j)]) /\
|
|
s[i,last] + d[i,last] <= end
|
|
);
|
|
|
|
constraint %% 保证任务之间没有重叠
|
|
forall(j in TASK) (
|
|
forall(i,k in JOB where i < k) (
|
|
s[i,j] + d[i,j] <= s[k,j] \/
|
|
s[k,j] + d[k,j] <= s[i,j]
|
|
)
|
|
);
|
|
|
|
solve minimize end;
|
|
|
|
output ["end = \(end)\n"] ++
|
|
[ show_int(digs,s[i,j]) ++ " " ++
|
|
if j == last then "\n" else "" endif |
|
|
i in JOB, j in TASK ];
|