set A ;      /* insieme delle attivitą */

param tmax;

set T:=1..tmax;

param tt{t in T}:=t;

set W within A ;    /* sottoinsieme di attivitą che lavorano su CAT */

set V within A;     /* sottoinsieme di attivitą che lavorano su CUS */

set BCV within A ;   /* sottoinsieme di attivitą incompatibili Bcv */

set CAP within A ;   /* sottoinsieme di attivitą incompatibili CAP */

set H within A ;   /* sottoinsieme di attivitą a configurazione manuale */

set I within A ;   /* sottoinsieme di attivitą manuali e/o con monitoraggio */

set TC within T;  /* insieme di ore non lavorative */

param EST{i in A} ; /* EST attivitą */

param LST{i in A} ; /* LST attivitą */

param d{i in A} ;   /* durata attivitą */

param dW{i in W} ;

param dV{i in V} ;

param dBCV{i in BCV} ;

param dCAP{i in CAP} ;

param dI{i in I} ;

param rW{i in W} ;

param rV{i in V} ;

param r{i in A} ;   /* risorsa richiesta da ogni attivitą */

param R ;   /* risorsa complessiva sistema */

var  x{A,T} binary;  /* attivitą svolta in una determinata ora */

 minimize z: sum{i in A, t in T: t>=EST[25]&&t<=LST[45]} tt[t]*x[45,t] ;

subject to UnicitaInizio{i in A}: sum{t in T: t>=EST[i]&&t<=LST[i]} x[i,t]=1 ; /* vincolo unicitą dinizio */

# subject to PrecTemp{i in A,j in A:EST[j]>=EST[i]}: sum{t in T: t>=EST[j]&&t<=LST[j]} tt[t]*x[j,t] >= sum{t in T :t>=EST[i]&&t<=LST[i]} tt[t]*x[i,t] + d[i] ;  /* vincolo precedenze temporali */

 subject to PrecTemp1{i in A,j in A}: sum{t in T: t>=EST[2]&&t<=LST[2]} tt[t]*x[2,t] >= sum{t in T :t>=EST[1]&&t<=LST[1]} tt[t]*x[1,t] + d[1] ;  /* vincolo precedenze temporali */

 subject to PrecTemp2{i in A,j in A}: sum{t in T: t>=EST[3]&&t<=LST[3]} tt[t]*x[3,t] >= sum{t in T :t>=EST[1]&&t<=LST[1]} tt[t]*x[1,t] + d[1] ;  /* vincolo precedenze temporali */

 subject to PrecTemp3{i in A,j in A}: sum{t in T: t>=EST[4]&&t<=LST[4]} tt[t]*x[4,t] >= sum{t in T: t>=EST[2]&&t<=LST[2]} tt[t]*x[2,t] + d[2] ;  /* vincolo precedenze temporali */

 subject to PrecTemp4{i in A,j in A}: sum{t in T: t>=EST[5]&&t<=LST[5]} tt[t]*x[5,t] >= sum{t in T: t>=EST[4]&&t<=LST[4]} tt[t]*x[4,t] + d[4] ;  /* vincolo precedenze temporali */

 subject to PrecTemp5{i in A,j in A}: sum{t in T: t>=EST[6]&&t<=LST[6]} tt[t]*x[6,t] >= sum{t in T: t>=EST[5]&&t<=LST[5]} tt[t]*x[5,t] + d[5] ;  /* vincolo precedenze temporali */

 subject to PrecTemp6{i in A,j in A}: sum{t in T: t>=EST[7]&&t<=LST[7]} tt[t]*x[7,t] >= sum{t in T: t>=EST[6]&&t<=LST[6]} tt[t]*x[6,t] + d[6] ;  /* vincolo precedenze temporali */

 subject to PrecTemp7{i in A,j in A}: sum{t in T: t>=EST[8]&&t<=LST[8]} tt[t]*x[8,t] >= sum{t in T: t>=EST[6]&&t<=LST[6]} tt[t]*x[6,t] + d[6] ;  /* vincolo precedenze temporali */

 subject to PrecTemp8{i in A,j in A}: sum{t in T: t>=EST[9]&&t<=LST[9]} tt[t]*x[9,t] >= sum{t in T: t>=EST[7]&&t<=LST[7]} tt[t]*x[7,t] + d[7] ;  /* vincolo precedenze temporali */

 subject to PrecTemp9{i in A,j in A}: sum{t in T: t>=EST[9]&&t<=LST[9]} tt[t]*x[9,t] >= sum{t in T: t>=EST[8]&&t<=LST[8]} tt[t]*x[8,t] + d[8] ;  /* vincolo precedenze temporali */

 subject to PrecTemp10{i in A,j in A}: sum{t in T: t>=EST[10]&&t<=LST[10]} tt[t]*x[10,t] >= sum{t in T: t>=EST[9]&&t<=LST[9]} tt[t]*x[9,t] + d[9] ;  /* vincolo precedenze temporali */

 subject to PrecTemp11{i in A,j in A}: sum{t in T: t>=EST[10]&&t<=LST[10]} tt[t]*x[10,t] >= sum{t in T: t>=EST[3]&&t<=LST[3]} tt[t]*x[3,t] + d[3] ;  /* vincolo precedenze temporali */

 subject to PrecTemp12{i in A,j in A}: sum{t in T: t>=EST[20]&&t<=LST[20]} tt[t]*x[20,t] >= sum{t in T: t>=EST[9]&&t<=LST[9]} tt[t]*x[9,t] + d[9] ;  /* vincolo precedenze temporali */

 subject to PrecTemp13{i in A,j in A}: sum{t in T: t>=EST[11]&&t<=LST[11]} tt[t]*x[11,t] >= sum{t in T: t>=EST[10]&&t<=LST[10]} tt[t]*x[10,t] + d[10] ;  /* vincolo precedenze temporali */

 subject to PrecTemp14{i in A,j in A}: sum{t in T: t>=EST[17]&&t<=LST[17]} tt[t]*x[17,t] >= sum{t in T: t>=EST[11]&&t<=LST[11]} tt[t]*x[11,t] + d[11] ;  /* vincolo precedenze temporali */

 subject to PrecTemp15{i in A,j in A}: sum{t in T: t>=EST[16]&&t<=LST[16]} tt[t]*x[16,t] >= sum{t in T: t>=EST[11]&&t<=LST[11]} tt[t]*x[11,t] + d[11] ;  /* vincolo precedenze temporali */

 subject to PrecTemp16{i in A,j in A}: sum{t in T: t>=EST[17]&&t<=LST[17]} tt[t]*x[17,t] >= sum{t in T: t>=EST[16]&&t<=LST[16]} tt[t]*x[16,t] + d[16] ;  /* vincolo precedenze temporali */

 subject to PrecTemp17{i in A,j in A}: sum{t in T: t>=EST[12]&&t<=LST[12]} tt[t]*x[12,t] >= sum{t in T: t>=EST[1]&&t<=LST[1]} tt[t]*x[1,t] + d[1] ;  /* vincolo precedenze temporali */

 subject to PrecTemp18{i in A,j in A}: sum{t in T: t>=EST[13]&&t<=LST[13]} tt[t]*x[13,t] >= sum{t in T: t>=EST[12]&&t<=LST[12]} tt[t]*x[12,t] + d[12] ;  /* vincolo precedenze temporali */
 
 subject to PrecTemp19{i in A,j in A}: sum{t in T: t>=EST[14]&&t<=LST[14]} tt[t]*x[14,t] >= sum{t in T: t>=EST[13]&&t<=LST[13]} tt[t]*x[13,t] + d[13] ;  /* vincolo precedenze temporali */

 subject to PrecTemp20{i in A,j in A}: sum{t in T: t>=EST[15]&&t<=LST[15]} tt[t]*x[15,t] >= sum{t in T: t>=EST[14]&&t<=LST[14]} tt[t]*x[14,t] + d[14] ;  /* vincolo precedenze temporali */

 subject to PrecTemp21{i in A,j in A}: sum{t in T: t>=EST[16]&&t<=LST[16]} tt[t]*x[16,t] >= sum{t in T: t>=EST[15]&&t<=LST[15]} tt[t]*x[15,t] + d[15] ;  /* vincolo precedenze temporali */

 subject to PrecTemp22{i in A,j in A}: sum{t in T: t>=EST[18]&&t<=LST[18]} tt[t]*x[18,t] >= sum{t in T: t>=EST[15]&&t<=LST[15]} tt[t]*x[15,t] + d[15] ;  /* vincolo precedenze temporali */

 subject to PrecTemp23{i in A,j in A}: sum{t in T: t>=EST[19]&&t<=LST[19]} tt[t]*x[19,t] >= sum{t in T: t>=EST[12]&&t<=LST[12]} tt[t]*x[12,t] + d[12] ;  /* vincolo precedenze temporali */

 subject to PrecTemp24{i in A,j in A}: sum{t in T: t>=EST[21]&&t<=LST[21]} tt[t]*x[21,t] >= sum{t in T: t>=EST[19]&&t<=LST[19]} tt[t]*x[19,t] + d[19] ;  /* vincolo precedenze temporali */

 subject to PrecTemp25{i in A,j in A}: sum{t in T: t>=EST[21]&&t<=LST[21]} tt[t]*x[21,t] >= sum{t in T: t>=EST[20]&&t<=LST[20]} tt[t]*x[20,t] + d[20] ;  /* vincolo precedenze temporali */

 subject to PrecTemp26{i in A,j in A}: sum{t in T: t>=EST[22]&&t<=LST[22]} tt[t]*x[22,t] >= sum{t in T: t>=EST[21]&&t<=LST[21]} tt[t]*x[21,t] + d[21] ;  /* vincolo precedenze temporali */

 subject to PrecTemp27{i in A,j in A}: sum{t in T: t>=EST[23]&&t<=LST[23]} tt[t]*x[23,t] >= sum{t in T: t>=EST[22]&&t<=LST[22]} tt[t]*x[22,t] + d[22] ;  /* vincolo precedenze temporali */

 subject to PrecTemp28{i in A,j in A}: sum{t in T: t>=EST[24]&&t<=LST[24]} tt[t]*x[24,t] >= sum{t in T: t>=EST[23]&&t<=LST[23]} tt[t]*x[23,t] + d[23] ;  /* vincolo precedenze temporali */

 subject to PrecTemp29{i in A,j in A}: sum{t in T: t>=EST[25]&&t<=LST[25]} tt[t]*x[25,t] >= sum{t in T: t>=EST[24]&&t<=LST[24]} tt[t]*x[24,t] + d[24] ;  /* vincolo precedenze temporali */

 subject to PrecTemp30{i in A,j in A}: sum{t in T: t>=EST[26]&&t<=LST[26]} tt[t]*x[26,t] >= sum{t in T: t>=EST[25]&&t<=LST[25]} tt[t]*x[25,t] + d[25] ;  /* vincolo precedenze temporali */

 subject to PrecTemp31{i in A,j in A}: sum{t in T: t>=EST[27]&&t<=LST[27]} tt[t]*x[27,t] >= sum{t in T: t>=EST[26]&&t<=LST[26]} tt[t]*x[26,t] + d[26] ;  /* vincolo precedenze temporali */

 subject to PrecTemp32{i in A,j in A}: sum{t in T: t>=EST[28]&&t<=LST[28]} tt[t]*x[28,t] >= sum{t in T: t>=EST[27]&&t<=LST[27]} tt[t]*x[27,t] + d[27] ;  /* vincolo precedenze temporali */

 subject to PrecTemp33{i in A,j in A}: sum{t in T: t>=EST[29]&&t<=LST[29]} tt[t]*x[29,t] >= sum{t in T: t>=EST[28]&&t<=LST[28]} tt[t]*x[28,t] + d[28] ;  /* vincolo precedenze temporali */

 subject to PrecTemp34{i in A,j in A}: sum{t in T: t>=EST[30]&&t<=LST[30]} tt[t]*x[30,t] >= sum{t in T: t>=EST[29]&&t<=LST[29]} tt[t]*x[29,t] + d[29] ;  /* vincolo precedenze temporali */

 subject to PrecTemp35{i in A,j in A}: sum{t in T: t>=EST[31]&&t<=LST[31]} tt[t]*x[31,t] >= sum{t in T: t>=EST[30]&&t<=LST[30]} tt[t]*x[30,t] + d[30] ;  /* vincolo precedenze temporali */

 subject to PrecTemp36{i in A,j in A}: sum{t in T: t>=EST[32]&&t<=LST[32]} tt[t]*x[32,t] >= sum{t in T: t>=EST[31]&&t<=LST[31]} tt[t]*x[31,t] + d[31] ;  /* vincolo precedenze temporali */

 subject to PrecTemp37{i in A,j in A}: sum{t in T: t>=EST[33]&&t<=LST[33]} tt[t]*x[33,t] >= sum{t in T: t>=EST[32]&&t<=LST[32]} tt[t]*x[32,t] + d[32] ;  /* vincolo precedenze temporali */

 subject to PrecTemp38{i in A,j in A}: sum{t in T: t>=EST[34]&&t<=LST[34]} tt[t]*x[34,t] >= sum{t in T: t>=EST[33]&&t<=LST[33]} tt[t]*x[33,t] + d[33] ;  /* vincolo precedenze temporali */

 subject to PrecTemp39{i in A,j in A}: sum{t in T: t>=EST[35]&&t<=LST[35]} tt[t]*x[35,t] >= sum{t in T: t>=EST[34]&&t<=LST[34]} tt[t]*x[34,t] + d[34] ;  /* vincolo precedenze temporali */

 subject to PrecTemp40{i in A,j in A}: sum{t in T: t>=EST[36]&&t<=LST[36]} tt[t]*x[36,t] >= sum{t in T: t>=EST[35]&&t<=LST[35]} tt[t]*x[35,t] + d[35] ;  /* vincolo precedenze temporali */

 subject to PrecTemp41{i in A,j in A}: sum{t in T: t>=EST[37]&&t<=LST[37]} tt[t]*x[37,t] >= sum{t in T: t>=EST[36]&&t<=LST[36]} tt[t]*x[36,t] + d[36] ;  /* vincolo precedenze temporali */

 subject to PrecTemp42{i in A,j in A}: sum{t in T: t>=EST[37]&&t<=LST[37]} tt[t]*x[37,t] >= sum{t in T: t>=EST[26]&&t<=LST[26]} tt[t]*x[26,t] + d[26] ;  /* vincolo precedenze temporali */

 subject to PrecTemp43{i in A,j in A}: sum{t in T: t>=EST[38]&&t<=LST[38]} tt[t]*x[38,t] >= sum{t in T: t>=EST[37]&&t<=LST[37]} tt[t]*x[37,t] + d[37] ;  /* vincolo precedenze temporali */

 subject to PrecTemp44{i in A,j in A}: sum{t in T: t>=EST[39]&&t<=LST[39]} tt[t]*x[39,t] >= sum{t in T: t>=EST[38]&&t<=LST[38]} tt[t]*x[38,t] + d[38] ;  /* vincolo precedenze temporali */

 subject to PrecTemp45{i in A,j in A}: sum{t in T: t>=EST[40]&&t<=LST[40]} tt[t]*x[40,t] >= sum{t in T: t>=EST[39]&&t<=LST[39]} tt[t]*x[39,t] + d[39] ;  /* vincolo precedenze temporali */

 subject to PrecTemp46{i in A,j in A}: sum{t in T: t>=EST[41]&&t<=LST[41]} tt[t]*x[41,t] >= sum{t in T: t>=EST[40]&&t<=LST[40]} tt[t]*x[40,t] + d[40] ;  /* vincolo precedenze temporali */

 subject to PrecTemp47{i in A,j in A}: sum{t in T: t>=EST[42]&&t<=LST[42]} tt[t]*x[42,t] >= sum{t in T: t>=EST[41]&&t<=LST[41]} tt[t]*x[41,t] + d[41] ;  /* vincolo precedenze temporali */

 subject to PrecTemp48{i in A,j in A}: sum{t in T: t>=EST[43]&&t<=LST[43]} tt[t]*x[43,t] >= sum{t in T: t>=EST[42]&&t<=LST[42]} tt[t]*x[42,t] + d[42] ;  /* vincolo precedenze temporali */

 subject to PrecTemp49{i in A,j in A}: sum{t in T: t>=EST[44]&&t<=LST[44]} tt[t]*x[44,t] >= sum{t in T: t>=EST[43]&&t<=LST[43]} tt[t]*x[43,t] + d[43] ;  /* vincolo precedenze temporali */

 subject to PrecTemp50{i in A,j in A}: sum{t in T: t>=EST[45]&&t<=LST[45]} tt[t]*x[45,t] >= sum{t in T: t>=EST[44]&&t<=LST[44]} tt[t]*x[44,t] + d[44] ;  /* vincolo precedenze temporali */

 subject to PrecTemp51{i in A,j in A}: sum{t in T: t>=EST[45]&&t<=LST[45]} tt[t]*x[45,t] >= sum{t in T: t>=EST[17]&&t<=LST[17]} tt[t]*x[17,t] + d[17] ;  /* vincolo precedenze temporali */

 subject to PrecTemp52{i in A,j in A}: sum{t in T: t>=EST[45]&&t<=LST[45]} tt[t]*x[45,t] >= sum{t in T: t>=EST[18]&&t<=LST[18]} tt[t]*x[18,t] + d[18] ;  /* vincolo precedenze temporali */

 subject to PrecTemp53{i in A,j in A}: sum{t in T: t>=EST[45]&&t<=LST[45]} tt[t]*x[45,t] >= sum{t in T: t>=EST[20]&&t<=LST[20]} tt[t]*x[20,t] + d[20] ;  /* vincolo precedenze temporali */
 
 subject to DispRis1{t in T}: sum{i in W} sum{q in T:q>=max(t-dW[i],EST[i])&&q<=min(t-1,LST[i])} rW[i]*x[i,q] <= R ; /* vincolo disponibilitą risorsa server CAT */

 subject to DispRis2{t in T}: sum{i in V} sum{q in T:q>=max(t-dV[i],EST[i])&&q<=min(t-1,LST[i])} rV[i]*x[i,q] <= R ; /* vincolo disponibilitą risorsa server CUS */

 subject to IncompFunz1{t in T}: sum{i in BCV} sum{q in T:q>=max(t-dBCV[i],EST[i])&&q<=min(t-1,LST[i])} x[i,q] <= 1 ; /* vincolo incompatibilitą attivitą BCV */

 subject to IncompFunz2{t in T}: sum{i in CAP} sum{q in T:q>=max(t-dCAP[i],EST[i])&&q<=min(t-1,LST[i])} x[i,q] <= 1 ; /* vincolo incompatibilitą attivitą CAP */

 subject to VincStraordinari1{i in H, t in TC}: x[i,t]=0 ; /* vincolo sulle attivitą a configurazione manuale */

 subject to VincStraordinari2{i in I, t in T :(t+dI[i]) in TC}: x[i,t]=0 ; /* vincolo sulle attivitą a configurazione manuale */

subject to VincTemp1{i in A,t in T: t<=EST[i]-1}: x[i,t]=0 ;

subject to VincTemp2{i in A,t in T: t>=LST[i]+1}: x[i,t]=0 ;

end ;

