1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
Jip J. Dekker fad1b07018 Squashed 'software/minizinc/' content from commit 4f10c8205
git-subtree-dir: software/minizinc
git-subtree-split: 4f10c82056ffcb1041d7ffef29d77a7eef92cf76
2021-06-16 14:06:46 +10:00

35 lines
1.2 KiB
MiniZinc

int: jobs; % 作业的数量
set of int: JOB = 1..jobs;
int: tasks; % 每个作业的任务数量
set of int: TASK = 1..tasks;
array [JOB,TASK] of int: d; % 任务持续时间
int: total = sum(i in JOB, j in TASK)(d[i,j]);% 总持续时间
int: digs = ceil(log(10.0,total)); % 输出的数值
array [JOB,TASK] of var 0..total: s; % 起始时间
var 0..total: end; % 总结束时间
% nooverlap
predicate no_overlap(var int:s1, int:d1, var int:s2, int:d2) =
s1 + d1 <= s2 \/ s2 + d2 <= s1;
constraint %% 保证任务按照顺序出现
forall(i in JOB) (
forall(j in 1..tasks-1)
(s[i,j] + d[i,j] <= s[i,j+1]) /\
s[i,tasks] + d[i,tasks] <= end
);
constraint %% 保证任务之间没有重叠
forall(j in TASK) (
forall(i,k in JOB where i < k) (
no_overlap(s[i,j], d[i,j], s[k,j], d[k,j])
)
);
solve minimize end;
output ["end = \(end)\n"] ++
[ show_int(digs,s[i,j]) ++ " " ++
if j == tasks then "\n" else "" endif |
i in JOB, j in TASK ];