#------------ parameters --------------------- param m integer > 0; # numero di investimenti param n integer > 0; # numero di mesi param A{i in 1..m, j in 1..n} binary; # A[i,j] = 1 se investimento i è disponibile all'inizio del mese j # A[i,j] = 0 se investimento i NON è disponibile all'inizio del mese j param scadenza{i in 1..m} > 0; # scadenza[i] = mesi alla scadenza dell'investimento i param rendimento{i in 1..m} > 0; # rendimento[i] = rendimento alla scadenza dell'investimento i param pagamento{j in 2..n+1} >= 0; # pagamento[j] = pagamento richiesto all'inizio del mese j #------------- variabili ------------------- var x{i in 1..m, j in 1..n: A[i,j]=1} >= 0; # x[i,j] = migliaia di dollari investiti nell'investimento i # all'inizio del mese j #------------- funzione obiettivo ------------------- minimize InvestimentoIniziale: sum{i in 1..m: A[i,1]=1} x[i,1]; #------------- constraints ------------------- s.t. FlussoCassa{j in 2..n+1}: sum{i in 1..m: j-scadenza[i]>=1 and A[i,j-scadenza[i]]=1} (1+rendimento[i])*x[i,j-scadenza[i]] = sum{i in 1..m: j<=n and A[i,j]=1} x[i,j] + pagamento[j]; # all'inizio del mese j: # ricavi dovuti ad investimenti passati # = nuovi investimenti + pagamenti