Originally posted by: SatishKumarA
Hi All,
Please find the sample code attached. I defined a master task that will overlap with two slave tasks that are processed in parallel.
Start time of master task and both slave tasks will be same,whereas end time of master task will be maximum of end time of both slave tasks.
However, this logic is not able to produce the desired result.
Please check the code and let me know what I missed.
using CP;
int No_of_Tyres = 6;
int No_of_TMBs = 2;
range TyresList = 1..No_of_Tyres;
range TBMList = 1..No_of_TMBs;
{int} Tyres = {1,2,3,4,5,6};
{int} TBM = {1,2};
int Tyre_Type[TyresList] = [1,1,2,2,2,2];
int TBM_Capacity[TBMList] = [2,2];
/* Tasks that can be processed at a time on a TBM with capacity 2 */
tuple ParallelTasks1 {
int t1;
int t2;
};
{ParallelTasks1} ParallelTasks = {
<1, 2>, <3, 4>, <3,5>, <3,6>,
<4, 5>, <4, 6> , <5,6>};
dvar interval tb_task[t1 in Tyres, t2 in TBM] optional in 0..1000 size 10*t1;
cumulFunction tbmUsage[t2 in TBM] = sum(t1 in Tyres) pulse(tb_task[t1][t2], 1);
dvar interval tyre_task[t1 in Tyres] in 0..1000 size 10*t1;
dvar interval master_tyre_task[t2 in TBM,p in ParallelTasks] optional in 0..1000 size 0..1000;
dvar sequence all_master_sequences[t2 in TBM,t in Tyres] in
append(all(p in ParallelTasks:t!=p.t1 && t!=p.t2) master_tyre_task[t2][p],
all(t1 in Tyres:t==t1) tb_task[t1][t2])
;
execute {
cp.param.timeLimit =5;
}
minimize max(t1 in Tyres, t2 in TBM) endOf(tb_task[t1][t2])
subject to {
forall(t2 in TBM)
tbmUsage[t2] <= TBM_Capacity[t2];
forall(t1 in Tyres)
alternative(tyre_task[t1], all (t2 in TBM) tb_task[t1][t2]);
forall(p in ParallelTasks){
sum(t2 in TBM) presenceOf(master_tyre_task[t2][p]) == 1;}
forall(t2 in TBM,p in ParallelTasks) {
ct3: presenceOf(tb_task[p.t1][t2])==1 && presenceOf(tb_task[p.t2][t2])==1 &&
startOf(tb_task[p.t1][t2])==startOf(tb_task[p.t2][t2])
=> presenceOf(master_tyre_task[t2][p]) == 1 ;
ct3_1: presenceOf(tb_task[p.t1][t2])==0 && presenceOf(tb_task[p.t2][t2])==1 => presenceOf(master_tyre_task[t2][p]) == 0;
ct3_2: presenceOf(tb_task[p.t1][t2])==1 && presenceOf(tb_task[p.t2][t2])==0 => presenceOf(master_tyre_task[t2][p]) == 0;
;}
forall(t2 in TBM,t in Tyres)
ct11: noOverlap(all_master_sequences[t2][t]);
}
Thanks,
Satish
#DecisionOptimization#OPLusingCPOptimizer