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 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[25]} tt[t]*x[25,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 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[3] ;  /* 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 H, t in TC: (t+ d[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 ;

