producer_consumer
producer_consumer |
function producer_consumer(starts:array(range) of cpvar, ends:array(range) of cpvar, durations:array(range) of cpvar, productions:array(range) of cpvar, prod_sizes:array(range) of cpvar, consumptions:array(range) of cpvar, conso_sizes:array(range) of cpvar, C:array(range) of integer) : cpctr
starts
|
array of starting times
|
ends
|
array of ending times
|
durations
|
array of durations
|
productions
|
array of tasks' requirements
|
prod_sizes
|
array of tasks' productions
|
consumptions
|
array of tasks' provisions
|
conso_sizes
|
array of tasks' consumptions
|
C
|
initial resource capacity array indexed by time
|
model "Cumulative Scheduling" uses "kalis" setparam("KALIS_DEFAULT_LB",0) setparam("KALIS_DEFAULT_UB",100) declarations ! Task indices Masonry = 1; Carpentry= 2; Roofing = 3; Windows = 4 Facade = 5; Garden = 6; Plumbing = 7; Ceiling = 8 Painting= 9; MovingIn =10; InitialPayment=11; SecondPayment=12 BUILDTASKS = 1..10 PAYMENTS = 11..12 TASKS = BUILDTASKS+PAYMENTS TNAMES: array(TASKS) of string obj:cpvar ! Objective variable starts : array(TASKS) of cpvar ! Start times variables ends : array(TASKS) of cpvar ! Completion times durations: array(TASKS) of cpvar ! Durations of tasks consos : dynamic array(TASKS) of cpvar ! Res. consumptions sizes : dynamic array(TASKS) of cpvar ! Consumption sizes prods : dynamic array(TASKS) of cpvar ! Res. production sizep : dynamic array(TASKS) of cpvar ! Production sizes Strategy : cpbranching ! Branching strategy end-declarations TNAMES:: (1..12)["Masonry", "Carpentry", "Roofing", "Windows", "Facade", "Garden", "Plumbing", "Ceiling", "Painting", "MovingIn", "InitialPayment", "SecondPayment"] ! Setting the names of the variables forall(j in TASKS) do starts(j).name := TNAMES(j)+".start" ends(j).name := TNAMES(j)+".end" durations(j).name := TNAMES(j)+".duration" end-do ! Creating consumption variables forall(j in BUILDTASKS) do create(sizes(j)) sizes(j).name := TNAMES(j)+".size" create(consos(j)) consos(j).name := TNAMES(j)+".conso" end-do ! Setting durations of building tasks durations(Masonry) =7; durations(Carpentry)=3; durations(Roofing) =1 durations(Windows) =1; durations(Facade) =2; durations(Garden) =1 durations(Plumbing)=8; durations(Ceiling) =3; durations(Painting)=2 durations(MovingIn)=1 ! Precedence constraints among building tasks starts(Carpentry) >= ends(Masonry) starts(Roofing) >= ends(Carpentry) starts(Windows) >= ends(Roofing) starts(Facade) >= ends(Roofing) starts(Garden) >= ends(Roofing) starts(Plumbing) >= ends(Masonry) starts(Ceiling) >= ends(Masonry) starts(Painting) >= ends(Ceiling) starts(MovingIn) >= ends(Windows) starts(MovingIn) >= ends(Facade) starts(MovingIn) >= ends(Garden) starts(MovingIn) >= ends(Painting) ! Setting task consumptions consos(Masonry) = 7; consos(Carpentry) = 3; consos(Roofing) = 1 consos(Windows) = 1; consos(Facade) = 2; consos(Garden) = 1 consos(Plumbing) = 8; consos(Ceiling) = 3; consos(Painting) = 2 consos(MovingIn) = 1 ! Production (amount) of payment tasks forall(j in PAYMENTS) do create(prods(j)) prods(j).name := TNAMES(j)+".prod" create(sizep(j)) sizep(j).name := TNAMES(j)+".sizep" end-do ! Payment data prods(InitialPayment) = 20; prods(SecondPayment) = 9 durations(InitialPayment) = 1; durations(SecondPayment) = 1 starts(InitialPayment) = 0; starts(SecondPayment) = 15 ! Objective: makespan of the schedule obj = maximum({ ends(Masonry) , ends(Carpentry), ends(Roofing), ends(Windows), ends(Facade), ends(Garden), ends(Plumbing), ends(Ceiling), ends(Painting), ends(MovingIn)}) ! Posting the producer_consumer constraint producer_consumer(starts,ends,durations,prods,sizep,consos,sizes) ! Setting the search strategy Strategy:= assign_var(KALIS_SMALLEST_MIN, KALIS_MIN_TO_MAX, starts) cp_set_branching(Strategy) ! Find the optimal solution if cp_minimize(obj) then writeln("Minimum makespan: ", obj.sol) forall(j in BUILDTASKS) writeln(TNAMES(j), ": ", starts(j).sol, " - ", ends(j).sol) else writeln("No solution found") end-if end-model
© 2001-2020 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.