using CP; //----------------------------------------------------------------------------------------------------------- //--DATA DECLARATION {string} Houses = ...; {string} ActivityTypes = ...; int requiredQuantities [Houses] = ...; int order = 6; {string} ManNames = ...; int maxPieces_HA = 4; int Cost_HA[1..maxPieces_HA] =...; int maxPieces_HB = 15; int Cost_HB[1..maxPieces_HB] =...; //-------------------------------------------------------------------------------------------------------- tuple ActivityInfo { key string activity; int duration; int wait; {string} precedences; }; {ActivityInfo} activities[Houses] = ...; tuple BatchActivityMatch { ActivityInfo activity; string Houses; int nOrders; }; {BatchActivityMatch} allActivities = { | c in Houses, a in activities[c], j in 1..requiredQuantities[c]}; {BatchActivityMatch} precedences[a in allActivities] = { b | b in allActivities : a.Houses == b.Houses && a.nOrders == b.nOrders && b.activity.activity in a.activity.precedences }; //------------------------------------------------------------------------------------------------------- tuple YRAB{ string Houses ; int requiredQuantities; }; {YRAB} allActivities_2 = { | c in Houses, j in 1..requiredQuantities[c] }; //--DECISION VARIABLES--------------------------------------------------------------------------------------- dvar interval activity[a in allActivities][b in allActivities_2] size (a.Houses==b.Houses && a.nOrders==b.requiredQuantities)? a.activity.duration:0; dvar interval itvs[a in allActivities_2]in 0..(maxint div 2)-1; dvar interval wtasks [a in allActivities_2][m in ManNames] optional; dvar interval pieces_HA[a in allActivities_2][1..maxPieces_HA] optional size 0..2;// intensity FF2; dexpr float n [a in allActivities_2]= lengthOf(itvs[a])/15; cumulFunction C_HA = sum(a in allActivities_2,j in 1..maxPieces_HA:a.Houses=="HA") pulse(pieces_HA[a][j],Cost_HA[j]);//HA dvar interval pieces_HB[a in allActivities_2][1..maxPieces_HA] optional size 0..15; cumulFunction C_HB = sum(a in allActivities_2,j in 1..maxPieces_HB:a.Houses=="HB") pulse(pieces_HB[a][j],Cost_HB[j]);//HB cumulFunction total_cost = C_HA+C_HB; int TT=14; int C[1..maxPieces_HA][0..TT] = [ [10, 10, 10, 15, 12, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8], [10, 10, 10, 15, 12, 12, 10, 13, 5, 8, 25, 9, 18, 22, 17], [10, 10, 10, 15, 12, 12, 8, 8, 8, 8, 8, 7, 8, 8, 8], [10, 10, 10, 15, 12, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8] ]; pwlFunction Cost[i in 1..maxPieces_HA] = piecewise(t in 0..TT-1) {C[i][t+1]-C[i][t]-> 2*(t+1); 0}(0,C[i][0]); execute { settings.bigmapthreshold = 50000; cp.param.TimeLimit=60; } //--OBJECTIVE FUNCTION-------------------------------------------------------------------------------------- minimize sum(a in allActivities_2,i in 1..maxPieces_HA) startEval(pieces_HA[a][i], Cost[i]); //--CONSTRAINTS-------------------------------------------------------------------------------------------- subject to { // constraints for HA forall (a,b in allActivities_2,j in 1..maxPieces_HA,m in ManNames : a.Houses==b.Houses && a.Houses=="HA" && a.requiredQuantities==b.requiredQuantities) presenceOf(pieces_HA[a][j])==presenceOf(itvs[b]); forall(a,b in allActivities_2,j in 1..maxPieces_HA-1: a.Houses==b.Houses && a.requiredQuantities==b.requiredQuantities && a.Houses=="HA") endAtStart(pieces_HA[a][j], pieces_HA[b][j+1]); forall (a,b in allActivities_2,j in 1..maxPieces_HA : a.Houses==b.Houses && a.requiredQuantities==b.requiredQuantities && a.Houses=="HA") (sum(j in 1..maxPieces_HA) (sizeOf(pieces_HA[a][j]))) == sizeOf(itvs[b]); forall (a,b in allActivities_2,j in 1..maxPieces_HA : j==1 && a.Houses==b.Houses && a.requiredQuantities==b.requiredQuantities && a.Houses=="HA") startAtStart(pieces_HA[a][j],itvs[b]); // constraints for HB forall (a,b in allActivities_2,j in 1..maxPieces_HB,m in ManNames : a.Houses==b.Houses && a.Houses=="HB" && a.requiredQuantities==b.requiredQuantities) presenceOf(pieces_HB[a][j])==presenceOf(itvs[b]); forall(a,b in allActivities_2,j in 1..maxPieces_HB-1: a.Houses==b.Houses && a.requiredQuantities==b.requiredQuantities && a.Houses=="HB") endAtStart(pieces_HB[a][j], pieces_HB[b][j+1]); forall (a,b in allActivities_2,j in 1..maxPieces_HB : a.Houses==b.Houses && a.requiredQuantities==b.requiredQuantities && a.Houses=="HB") (sum(j in 1..maxPieces_HB) (sizeOf(pieces_HB[a][j]))) == sizeOf(itvs[b]); forall (a,b in allActivities_2,j in 1..maxPieces_HB : j==1 && a.Houses==b.Houses && a.requiredQuantities==b.requiredQuantities && a.Houses=="HB") startAtStart(pieces_HB[a][j],itvs[b]); Precedence_all: forall (a in allActivities, b in allActivities_2,p in precedences[a]: a.Houses==b.Houses && a.nOrders==b.requiredQuantities) endBeforeStart(activity[p][b],activity[a][b],p.activity.wait); Optional: forall(b in allActivities_2) alternative(itvs[b], all(m in ManNames) wtasks[b][m]); NoOverlap_between_wtasks: forall (m in ManNames) noOverlap (all(h in allActivities_2) wtasks[h][m]); Span_itvs_with_all_activities: forall (t in allActivities,h in allActivities_2 : t.Houses==h.Houses) span(itvs[h],all (t in allActivities) activity[t][h]); };