include "globals.mzn"; % Ressources int: n_res; % Le nombre de ressources array [1..n_res] of int: res_cap; % La capacité des ressources % Tâches int: n_tasks; % Le nombre de tâches array [1..n_tasks] of int: duration; % Les durées des tâches array [1..n_res, 1..n_tasks] of int: res_req; % Les besoins en ressources pour chaque tâche array [1..n_tasks] of set of int: suc; % Les successeurs de la tâche (contraintes de précédence) % Horizon de planification int: t_max = sum(i in 1..n_tasks)(duration[i]); % Fin de l'horizon de planification % Variables array [1..n_tasks] of var 0..t_max: start; % Les dates de debut var 0..t_max: makespan; % Makespan % Contraintes de précédence constraint forall(i in 1..n_tasks, j in suc[i])(start[i] + duration[i] <= start[j]); % Cumulative contraintes pour les ressources constraint forall(r in 1..n_res)(cumulative(start,duration,[res_req[r,i] | i in 1..n_tasks], res_cap[r])); % Contraintes pour le makespan constraint forall(i in 1..n_tasks)(start[i] + duration[i] <= makespan); % Objectif solve minimize makespan; output [ "[start-(dur)-end]:\n" ] ++ [ "Task " ++ show(i) ++ " [" ++ show(start[i]) ++ "-(" ++ show(duration[i]) ++ ")-" ++ show(start[i] + duration[i]) ++ "]\n" | i in 1..n_tasks ] ++ [ "makespan: " ++ show(makespan) ++ "\n" ];