using CP;
int NbHouses = ...;
range Houses = 1..NbHouses;
{string} WorkerNames = ...;
{string} TaskNames = ...;
{string} TaskNamesFast = ...;
int Duration [t in TaskNames] = ...;
int DurationFast [t in TaskNamesFast] = ...;
string Worker [t in TaskNames] = ...;
tuple Precedence {
string pre;
string post;
};
{Precedence} Precedences = ...;
{Precedence} PrecedencesFast = ...;
int ReleaseDate[Houses] = ...;
int DueDate [Houses] = ...;
float Weight [Houses] = ...;
dvar interval houses[h in Houses] in ReleaseDate[h]..(maxint div 2)-1;
dvar interval itvs [h in Houses][t in TaskNames] size (h>=3)?Duration[t]:((t in TaskNamesFast?Duration[t]:0));
dvar sequence workers[w in WorkerNames] in
all(h in Houses, t in TaskNames: Worker[t]==w && ((h<=2)=>(t in TaskNamesFast))) itvs[h][t] types
all(h in Houses, t in TaskNames: Worker[t]==w && ((h<=2)=>(t in TaskNamesFast))) h;
tuple triplet { int loc1; int loc2; int value; };
{triplet} transitionTimes = { <i,j, ftoi(abs(i-j))> | i in Houses, j in Houses };
execute {
cp.param.FailLimit = 30000;
}
execute{
cp.param.timeLimit=60;
}
minimize sum(h in Houses)
(Weight[h] * maxl(0, endOf(houses[h])-DueDate[h]) + lengthOf(houses[h]));
subject to {
forall(h in Houses:h>=3)
forall(p in Precedences)
endBeforeStart(itvs[h][p.pre], itvs[h][p.post]);
forall(h in Houses:h<=2)
forall(p in PrecedencesFast)
endBeforeStart(itvs[h][p.pre], itvs[h][p.post]);
forall(h in Houses:h>=3)
span(houses[h], all(t in TaskNames) itvs[h][t]);
forall(h in Houses:h<=2)
span(houses[h], all(t in TaskNamesFast) itvs[h][t]);
forall(w in WorkerNames)
noOverlap(workers[w], transitionTimes);
}
NbHouses = 5;
WorkerNames = {"Joe", "Jim" };
TaskNames = {
"masonry",
"carpentry",
"plumbing",
"ceiling",
"roofing",
"painting",
"windows",
"facade",
"garden",
"moving"
};
TaskNamesFast = {
"masonry",
"carpentry",
"ceiling",
"roofing",
"windows",
"facade",
"moving"
};
Duration = [
35,
15,
40,
15,
05,
10,
05,
10,
05,
05
];
DurationFast = [
35,
15,
15,
05,
05,
10,
05
];
Worker = #[
"masonry" : "Joe" ,
"carpentry": "Joe" ,
"plumbing" : "Jim" ,
"ceiling" : "Jim" ,
"roofing" : "Joe" ,
"painting" : "Jim" ,
"windows" : "Jim" ,
"facade" : "Joe" ,
"garden" : "Joe" ,
"moving" : "Jim"
]#;
ReleaseDate = [ 0, 0, 151, 59, 243];
DueDate = [120, 212, 304, 181, 425];
Weight = [100.0, 100.0, 100.0, 200.0, 100.0];
Precedences = {
<"masonry", "carpentry">,
<"masonry", "plumbing">,
<"masonry", "ceiling">,
<"carpentry", "roofing">,
<"ceiling", "painting">,
<"roofing", "windows">,
<"roofing", "facade">,
<"plumbing", "facade">,
<"roofing", "garden">,
<"plumbing", "garden">,
<"windows", "moving">,
<"facade", "moving">,
<"garden", "moving">,
<"painting", "moving">
};
PrecedencesFast = {
<"masonry", "carpentry">,
<"masonry", "ceiling">,
<"carpentry", "roofing">,
<"roofing", "windows">,
<"roofing", "facade">,
<"windows", "moving">,
<"facade", "moving">,
};