(!******************************************************
CP Example Problems
===================
file renewa.mos
```````````````
Provision/requirement of a renewable resource.
(c) 2008 Artelys S.A. and Fair Isaac Corporation
Creation: 2007, rev. Sep. 2018
*******************************************************!)
model "Renewable resource"
uses "kalis", "mmsystem"
forward public procedure solution_found
declarations
FIRST = {'P1','P2'}
FINAL = {'P3','P4','P5'}
JOBS = FIRST+FINAL
MIND,MAXD: array(JOBS) of integer ! Limits on job durations
RESAMT: array(JOBS) of integer ! Resource use/production
HORIZON: integer ! Time horizon
PROFIT: array(FINAL) of real ! Profit from production
COST: array(JOBS) of real ! Cost of production
CAP: integer ! Available resource quantity
totalProfit: cpfloatvar
task: array(JOBS) of cptask ! Task objects for jobs
intermProd: cpresource ! Non-renewable resource (intermediate prod.)
end-declarations
initializations from 'Data/renewa.dat'
[MIND,MAXD] as 'DUR' RESAMT HORIZON PROFIT COST CAP
end-initializations
! Setting up resources
set_resource_attributes(intermProd, KALIS_DISCRETE_RESOURCE, CAP)
setname(intermProd, "IntP")
! Setting up the tasks
forall(j in JOBS) do
setname(task(j), j)
setduration(task(j), MIND(j), MAXD(j))
setdomain(getend(task(j)), 0, HORIZON)
end-do
! Providing tasks
forall(j in FIRST) provides(task(j), RESAMT(j), intermProd)
! Requiring tasks
forall(j in FINAL) requires(task(j), RESAMT(j), intermProd)
! Objective function: total profit
totalProfit = sum(j in FINAL) PROFIT(j)*getduration(task(j)) -
sum(j in JOBS) COST(j)*getduration(task(j))
cp_set_solution_callback("solution_found")
setparam("KALIS_MAX_COMPUTATION_TIME", 30)
! Solve the problem
starttime:= gettime
if cp_schedule(totalProfit,true)=0 then
exit(1)
end-if
! Solution printing
writeln("Total profit: ", getsol(totalProfit))
writeln("Job\tStart\tEnd\tDuration")
forall(j in JOBS)
writeln(j, "\t ", getsol(getstart(task(j))), "\t ", getsol(getend(task(j))),
"\t ", getsol(getduration(task(j))))
public procedure solution_found
writeln(gettime-starttime , " sec. Solution found with total profit = ",
getsol(totalProfit))
forall(j in JOBS)
write(j, ": ", getsol(getstart(task(j))), "-", getsol(getend(task(j))),
"(", getsol(getduration(task(j))), "), ")
writeln
end-procedure
end-model
|
(!******************************************************
CP Example Problems
===================
file renewb.mos
```````````````
Production/consumption of a non-renewable resource.
(c) 2008 Artelys S.A. and Fair Isaac Corporation
*******************************************************!)
model "Non-renewable resource"
uses "kalis"
declarations
FIRST = {'P1','P2'}
ENDFIRST = {'EndP1', 'EndP2'}
FINAL = {'P3','P4','P5'}
JOBS = FIRST+ENDFIRST+FINAL
MIND,MAXD: array(JOBS) of integer ! Limits on job durations
RESAMT: array(JOBS) of integer ! Resource use/production
HORIZON: integer ! Time horizon
PROFIT: array(FINAL) of real ! Profit from production
COST: array(JOBS) of real ! Cost of production
CAP: integer ! Available resource quantity
totalProfit: cpfloatvar
task: array(JOBS) of cptask ! Task objects for jobs
intermProd: cpresource ! Non-renewable resource (intermediate prod.)
end-declarations
initializations from 'Data/renewb.dat'
[MIND,MAXD] as 'DUR' RESAMT HORIZON PROFIT COST CAP
end-initializations
! Setting up resources
set_resource_attributes(intermProd, KALIS_DISCRETE_RESOURCE, CAP)
setname(intermProd, "IntP")
! Setting up the tasks
forall(j in JOBS) do
setname(task(j), j)
setduration(task(j), MIND(j), MAXD(j))
setdomain(getend(task(j)), 0, HORIZON)
end-do
! Production tasks
forall(j in ENDFIRST) produces(task(j), RESAMT(j), intermProd)
forall(j in FIRST) getend(task(j)) = getend(task("End"+j))
! Consumer tasks
forall(j in FINAL) consumes(task(j), RESAMT(j), intermProd)
! Objective function: total profit
totalProfit = sum(j in FINAL) PROFIT(j)*getduration(task(j)) -
sum(j in JOBS) COST(j)*getduration(task(j))
if cp_schedule(totalProfit,true)=0 then
exit(1)
end-if
writeln("Total profit: ", getsol(totalProfit))
writeln("Job\tStart\tEnd\tDuration")
forall(j in JOBS)
writeln(j, "\t ", getsol(getstart(task(j))), "\t ", getsol(getend(task(j))),
"\t ", getsol(getduration(task(j))))
end-model
|
(!******************************************************
CP Example Problems
===================
file renewb2.mos
````````````````
Production/consumption of a non-renewable resource.
- Formulation with producer_consumer constraint -
(c) 2008 Artelys S.A. and Fair Isaac Corporation
Creation: 2007, rev. Mar. 2013
*******************************************************!)
model "Non-renewable resource"
uses "kalis"
setparam("KALIS_DEFAULT_LB", 0)
declarations
FIRST = {'P1','P2'}
ENDFIRST = {'EndP1', 'EndP2'}
FINAL = {'P3','P4','P5'}
JOBS = FIRST+ENDFIRST+FINAL
PCJOBS = ENDFIRST+FINAL
MIND,MAXD: array(JOBS) of integer ! Limits on job durations
RESAMT: array(JOBS) of integer ! Resource use/production
HORIZON: integer ! Time horizon
PROFIT: array(FINAL) of real ! Profit from production
COST: array(JOBS) of real ! Cost of production
CAP: integer ! Available resource quantity
totalProfit: cpfloatvar
fstart,fdur,fcomp: array(FIRST) of cpvar! Start, duration & completion of jobs
start,dur,comp: array(PCJOBS) of cpvar ! Start, duration & completion of jobs
produce,consume: array(PCJOBS) of cpvar ! Production/consumption per time unit
psize,csize: array(PCJOBS) of cpvar ! Cumulated production/consumption
end-declarations
initializations from 'Data/renewb.dat'
[MIND,MAXD] as 'DUR' RESAMT HORIZON PROFIT COST CAP
end-initializations
! Setting up the tasks
forall(j in PCJOBS) do
setname(start(j), j)
setdomain(dur(j), MIND(j), MAXD(j))
setdomain(comp(j), 0, HORIZON)
start(j) + dur(j) = comp(j)
end-do
forall(j in FIRST) do
setname(fstart(j), j)
setdomain(fdur(j), MIND(j), MAXD(j))
setdomain(fcomp(j), 0, HORIZON)
fstart(j) + fdur(j) = fcomp(j)
end-do
! Production tasks
forall(j in ENDFIRST) do
produce(j) = RESAMT(j)
consume(j) = 0
end-do
forall(j in FIRST) fcomp(j) = comp("End"+j)
! Consumer tasks
forall(j in FINAL) do
consume(j) = RESAMT(j)
produce(j) = 0
end-do
! Resource constraint
producer_consumer(start, comp, dur, produce, psize, consume, csize)
! Objective function: total profit
totalProfit = sum(j in FINAL) PROFIT(j)*dur(j) -
sum(j in FIRST) COST(j)*fdur(j)
if not cp_maximize(totalProfit) then
exit(1)
end-if
writeln("Total profit: ", getsol(totalProfit))
writeln("Job\tStart\tEnd\tDuration")
forall(j in FIRST)
writeln(j, "\t ", getsol(fstart(j)), "\t ", getsol(fcomp(j)),
"\t ", getsol(fdur(j)))
forall(j in PCJOBS)
writeln(j, "\t ", getsol(start(j)), "\t ", getsol(comp(j)),
"\t ", getsol(dur(j)))
end-model
|