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.

140 lines
4.6 KiB
MiniZinc

%-----------------------------------------------------------------------------%
% vim: ts=4 sw=4 et wm=0 tw=0
%-----------------------------------------------------------------------------%
% Copyright (C) 2009-2016 The University of Melbourne and NICTA.
% See the file COPYING for license information.
%-----------------------------------------------------------------------------%
% Model example for Resource-Constrained Project Scheduling Problems with
% Weighted Earliness/Tardiness objective (RCPSP/WET)
%
% A RCPSP consists of resources, tasks, and precedences between some tasks
% where resources have of a specific capacity and tasks need some capacity of
% some resource to be executed.
% Here, we consider resources with a constant discrete capacity over time and
% tasks with a constant discrete duration and resource requirements.
% The objective is to find a optimal schedule so that tasks start as close as
% possible to the given start time for each task, penalizing earliness or
% tardiness according to the given weight for earliness and tardiness per task.
%
%-----------------------------------------------------------------------------%
include "cumulative.mzn";
%-----------------------------------------------------------------------------%
% Model parameters.
% Resources
%
int: n_res; % The number of resources
set of int: Res = 1..n_res; % The set of all resources
array [Res] of int: rc; % The resource capabilities
% Tasks
%
int: n_tasks; % The number of tasks
set of int: Tasks = 1..n_tasks; % The set of all tasks
array [Tasks] of int : d ; % The task durations
array [Res, Tasks] of int : rr ; % The resource requirements
array [Tasks] of set of int: suc; % The task successors
% Deadlines
%
% deadline[i, 1] is the desired start time for task i,
% deadline[i, 2] is the earliness cost per time unit of earliness,
% deadline[i, 3] is the tardiness cost per time unit of tardiness.
array [Tasks, 1..3] of int: deadline;
% Planning horizon
%
% Note that our RCPSP/WET instance generator requires a solution to the
% equivalent RCPSP problem in order to generate the instances, so it gives
% us a planning horizon = the makespan of the RCPSP problem, plus 20% slop
int: t_max; %= sum(i in Tasks)(d[i]); % End time of the planning horizon
set of int: Times = 0..(t_max - 1); % Possible start times
%-----------------------------------------------------------------------------%
% Model variables.
array [Tasks] of var Times: s; % The start times
var 0..sum(i in Tasks) (
max(
deadline[i, 2] * deadline[i, 1],
deadline[i, 3] * (t_max - deadline[i, 1])
)
): objective;
%-----------------------------------------------------------------------------%
% Constraints.
% Precedence constraints
%
constraint
forall ( i in Tasks, j in suc[i] )
(
s[i] + d[i] <= s[j]
);
% Redundant non-overlapping constraints
%
constraint
redundant_constraint(
forall ( i, j in Tasks where i < j )
(
if exists(r in Res)(rr[r, i] + rr[r, j] > rc[r]) then
s[i] + d[i] <= s[j] \/ s[j] + d[j] <= s[i]
else
true
endif
)
);
% Cumulative resource constraints
%
constraint
forall ( r in Res )
(
let {
set of int: RTasks =
{ i | i in Tasks
where rr[r, i] > 0 /\ d[i] > 0 },
int: sum_rr = sum(i in RTasks)(rr[r, i])
} in (
if RTasks != {} /\ sum_rr > rc[r] then
cumulative(
[ s[i] | i in RTasks ],
[ d[i] | i in RTasks ],
[ rr[r, i] | i in RTasks ],
rc[r]
)
else
true
endif
)
);
% Weighted Earliness/Tardiness objective
constraint
objective = sum (i in Tasks) (
% earliness
deadline[i, 2] * max(0, deadline[i, 1] - s[i]) +
% tardiness
deadline[i, 3] * max(0, s[i] - deadline[i, 1])
);
%-----------------------------------------------------------------------------%
% Objective.
constraint trace("% init_area = \(ub(objective));\n", true);
%-----------------------------------------------------------------------------%
output [
"s = \(s);\n",
"objective = \(objective);\n",
];
%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%