cumulative
cumulative |
Purpose
This constraint states that the tasks requiring a resource do not exceed the resource capacity. The primary use of this constraint is to express resource constraints.
Synopsis
function cumulative(starts: array(integer) of cpvar, durations:array(integer) of cpvar, ends: array(integer) of cpvar, usages: array(integer) of cpvar, sizes: array(integer) of cpvar, C: integer) : cpctr
function cumulative(starts: array(integer) of cpvar, durations:array(integer) of cpvar, ends: array(integer) of cpvar, usages: array(integer) of cpvar, sizes: array(integer) of cpvar, C: array(integer) of integer) : cpctr
Arguments
starts
|
Array of variables representing the start times of the tasks
|
ends
|
Array of variables representing the completion times of the tasks
|
durations
|
Array of variables representing the durations of the tasks
|
usages
|
Array of variables representing the resource consumptions of the tasks
|
sizes
|
Array of variables representing the sizes of the tasks
|
C
|
integer representing the initial capacity of the resource (constant over time or capacity value for each time period)
|
Return value
A cumulative constraint ensuring that the maximal resource capacity is never exceded. More formally the constraint ensures that
startsj + durationsj = endsj for all j in Tasks
usagesj · durationsj = sizesj for all j in Tasks
∑j ∈ Tasks | t ∈ [UB(startj)..LB(endj)] usagesj ≤ Ct for all times t in the planning period
Example
The following example shows how to use the cumulative constraint to express resource constraints for five tasks using the same resource:
model "Cumulative scheduling" uses "kalis" declarations TASKS = 1..5 obj : cpvar starts, ends, durations, usages, sizes : array(TASKS) of cpvar end-declarations C := 2 ! Resource capacity HORIZON := 10 ! Time horizon ! Setting up the variables representing task properties forall (t in TASKS) do starts(t).name:= "T"+t+".start" ends(t).name:= "T"+t+".end" durations(t).name:= "T"+t+".duration" sizes(t).name:= "T"+t+".size" usages(t).name:= "T"+t+".use" 0 <= starts(t); starts(t) <= HORIZON 0 <= ends(t); ends(t) <= HORIZON t <= durations(t); durations(t) <= t+1 1 <= sizes(t); sizes(t) <= 100 1 <= usages(t); usages(t) <= 1 obj >= ends(t) end-do ! Cumulative resource constraint cumulative(starts, durations, ends, usages, sizes, C) ! Define the branching strategy cp_set_branching(assign_var(KALIS_SMALLEST_MIN,KALIS_MIN_TO_MAX)) ! Solve the problem if cp_minimize(obj) then cp_show_sol write("Resource use profile: ") forall(t in TASKS, time in 0..HORIZON) if (starts(t).sol <= time) and (ends(t).sol > time) then rload(time) += usages(t).sol end-if forall(time in 0..HORIZON) write(rload(time)) writeln else writeln("No solution found") end-if end-model
Related topics