# specifichiamo di utilizzare CPLEX come Solver # option cplex_options 'writeprob=xxx.lp'; option solver cplex; # cplex gestisce anche i vincoli di interezza. # oppure potremmo utilizzare LPSOLVE come Solver # option solver lpsolve; # lpsolve gestisce anche i vincoli di interezza. # se utilizzassimo MINOS come Solver otterremo delle soluzioni super-ottime, ma frazionarie # option solver minos; # solo PL, non gestisce la PLI printf "Prima chiamata al Solutore di PLI:\n****************\n>>>Solver: "; objective SpazioResiduo; solve; # Stampa della soluzione che minimizza lo spazio residuo sul CD: printf "*************************************\n\nHo computato una soluzione che minimizzi lo spazio inutilizzato sul CD.\nEccone una descrizione:\n"; printf "VALORE TOTALE = "; display ValoreTotaleDelCD; printf "INGOMBRO TOTALE = "; display sum{i in BRANI} INGOMBRO[i] * scelgo[i]; printf "DIMENSIONE DEL CD = "; display CD_DIM; printf "SPAZIO INUTILIZZATO DEL CD = "; display CD_DIM - sum{i in BRANI} INGOMBRO[i] * scelgo[i]; display scelgo; print "Canzoni che scelgo in questa COMPILATION A RESIDUO MINIMO:"; printf " Canzone:\tIngombro\tValore\tIngombro Cum.\tValore Cum.\n"; param ingombroCumulato default 0; param valoreCumulato default 0; for {i in BRANI: scelgo[i] > 0} { let valoreCumulato := valoreCumulato + VALORE[i]; let ingombroCumulato := ingombroCumulato + INGOMBRO[i]; printf "%12s\t%3d\t\t%3d\t\t%3d\t\t%3d\n", i, INGOMBRO[i], VALORE[i], ingombroCumulato, valoreCumulato; }; printf "\nSeconda chiamata al Solutore di PLI:\n****************\n>>>Solver: "; objective ValoreTotaleDelCD; solve; # Stampa della soluzione che massimizza il ValoreTotaleDelCD: printf "*************************************\n\nHo computato una soluzione che massimizza la somma dei valori delle canzoni masterizzate sul CD.\nEccone una descrizione:\n"; # option omit_zero_rows 1; # non voglio vengano visualizzate variabili a zero printf "VALORE TOTALE = "; display ValoreTotaleDelCD; printf "INGOMBRO TOTALE = "; display sum{i in BRANI} INGOMBRO[i] * scelgo[i]; printf "DIMENSIONE DEL CD = "; display CD_DIM; printf "SPAZIO INUTILIZZATO DEL CD = "; display CD_DIM - sum{i in BRANI} INGOMBRO[i] * scelgo[i]; display scelgo; print "Canzoni che scelgo in questa COMPILATION DI VALORE MASSIMO:"; printf " Canzone:\tIngombro\tValore\tIngombro Cum.\tValore Cum.\n"; let ingombroCumulato := 0; let valoreCumulato := 0; for {i in BRANI: scelgo[i] > 0} { let valoreCumulato := valoreCumulato + VALORE[i]; let ingombroCumulato := ingombroCumulato + INGOMBRO[i]; printf "%12s\t%3d\t\t%3d\t\t%3d\t\t%3d\n", i, INGOMBRO[i], VALORE[i], ingombroCumulato, valoreCumulato; }; printf "\n"; quit;