import org.ssclab.log.SscLogger; import org.ssclab.pl.milp.*; public class Portafoglio { public static void main(String[] args) throws Exception { String pl_problem= "max : 0.261XA +0.308XB +0.105XC +0.189XD +99XE+0.28XF +0.49XH +0.56XI +0.25XL +0.90XM +0.50XN +0.31XO +"+ "0.03XG1 +0.03XG2 +0.03XG4 + 0.028XG7 -50JM -50JN -50JO \n"+ "LQ1+ XA + XB + XC +XD + XF +XG1 + XH + XI + XM +XN +XO = 100000 \n"+ "XG2 + XL +LQ2 = XG1+LQ1 +0.031XA +0.044XB +0.035XC +0.027XD +0.04XF +0.03XG1 +0.07XH +0.07XI \n"+ " +LQ3 = XG2+LQ2 +0.036XA +0.044XB +0.035XC +0.027XD +0.04XF +0.03XG2 +0.07XH +0.07XI +0.0625XL \n"+ "XG4 +LQ4 = LQ3+XC +0.041XA +0.044XB +0.035XC +0.027XD +0.04XF +0.07XH +0.08XI +0.0625XL \n"+ "1000XE +LQ5 = XG4+LQ4 +0.046XA +0.044XB +0.027XD +0.04XF +0.03XG4 +0.07XH +0.08XI +0.0625XL \n"+ " +LQ6 = LQ5+XL +0.051XA +0.044XB +33XE +0.027XD +0.04XF +0.07XH +0.08XI +0.0625XL \n"+ "XG7 +LQ7 = LQ6+XA +0.056XA +0.044XB +33XE +0.027XD +0.04XF +0.07XH +0.09XI \n"+ " 6XA + 7XB + 4.5XC + 7XD + 4500XE +14XF +XG1 +XG2 +XG4 +XG7 + 21XH+ 28XI +6XL +28XM +28XN +7XO <= "+ "12XA +14XB + 6XC +14XD + 6000XE +14XF +2XG1 +2XG2 +2XG4+2XG7 + 14XH+ 14XI +8XL +14XM +14XN +14XO \n"+ "XB + XM <= 30000 \n"+ "XA <=15000 \n"+ "EM1 + EM2 <=1 \n"+ "XI <= 100000EM1 \n"+ "XL <= 100000EM2 \n"+ "XO <=100000JO \n"+ "XM <=100000JM \n"+ "XN <=100000JN \n"+ "int XE \n"+ "bin EM1, EM2, JM, JN, JO"; MILP milp = new MILP(pl_problem); SolutionType solution_type=milp.resolve(); if(solution_type==SolutionType.OPTIMUM) { Solution soluzione=milp.getSolution(); for(Variable var:soluzione.getVariables()) { SscLogger.log("Nome variabile :"+var.getName() + " valore :"+var.getValue()); } SscLogger.log("Valore ottimo:"+soluzione.getOptimumValue()); } else SscLogger.log("Soluzione non ottima:" + solution_type); } }
Automezzi tipo \( A_1\) | Automezzi tipo \( A_2\) | |
---|---|---|
Km percorribili al giorno (\(km_k\)) | 500 | 450 |
Portata in Tonnellate (\(q_k\)) | 14 | 5 |
Costo trasporto al km in Euro (\(ct_k\)) | 7,5 | 3 |
Discarica \( D_1\) | Discarica \( D_2\) | Discarica \( D_3\) | |
---|---|---|---|
Sito produttivo \( P_1\) | 30 | 40 | 50 |
Sito produttivo \( P_2\) | 60 | 55 | 40 |
Discarica \(D_1\) | Discarica \(D_2\) | Discarica \(D_3\) | |
---|---|---|---|
Quantità smaltibile in tonnellate | 147 | 115 | 95 |
Costo di smaltimento in Euro per tonnellata (\(cs_j\)) | 200 | 220 | 185 |
Sito produttivo\( P_1\) | Sito produttivo\( P_2\) | |
---|---|---|
Quantita in tonnellate da smaltire | 185 | 210 |
Caratteristica | Km automezzi tipo \( A_1\) | Km automezzi tipo \( A_2\) |
---|---|---|
Sito produttivo\( P_1\) | 500 | \( 450 * 2\) |
Sito produttivo\( P_2\) | \( 500 * 2\) | 450 |
import org.ssclab.log.SscLogger; import org.ssclab.pl.milp.MILP; import org.ssclab.pl.milp.Solution; import org.ssclab.pl.milp.SolutionType; import org.ssclab.pl.milp.Variable; import org.ssclab.ref.InputString; public class Smaltimento { public static void main(String arg[]) throws Exception { String lp_string = " 3250 3680 3340 3700 3905 3190 1180 1340 1225 1360 1430 1165 100000 100000 min . \n" + " 60 80 100 0 0 0 0 0 0 0 0 0 0 0 le 500 \n" + " 0 0 0 0 0 0 60 80 100 0 0 0 0 0 le 900 \n" + " 0 0 0 120 110 80 0 0 0 0 0 0 0 0 le 1000 \n" + " 0 0 0 0 0 0 0 0 0 120 110 80 0 0 le 450 \n" + " 14 0 0 14 0 0 5 0 0 5 0 0 0 0 le 147 \n" + " 0 14 0 0 14 0 0 5 0 0 5 0 0 0 le 115 \n" + " 0 0 14 0 0 14 0 0 5 0 0 5 0 0 le 95 \n" + " 14 14 14 0 0 0 5 5 5 0 0 0 1 0 eq 185 \n" + " 0 0 0 14 14 14 0 0 0 5 5 5 0 1 eq 210 \n" + " 1 1 1 1 1 1 1 1 1 1 1 1 0 0 integer . "; InputString lp_input = new InputString(lp_string); lp_input.setInputFormat("X111-X113:double,X121-X123:double, X211-X213:double," + "X221-X223:double,Y1-Y2:double, TYPE:varstring(9), RHS:double"); MILP lp = new MILP(lp_input); SolutionType solution_type = lp.resolve(); if (solution_type == SolutionType.OPTIMUM) { double scorporo = 0; Solution solution = lp.getSolution(); for (Variable var : solution.getVariables()) { SscLogger.log("Nome variabile :" + var.getName() + " valore:" + var.getValue()); if (var.getName().equals("Y1") || var.getName().equals("Y2")) scorporo += var.getValue() * 100000; } double valore_ottimo = solution.getOptimumValue(); SscLogger.log("Valore ottimo:" + (valore_ottimo - scorporo)); } else SscLogger.log("Soluzione non ottima:" + solution_type); } }
Linea di produzione | Disponibilità di ore sulla linea in un mese | Quantià \(d_{ij}\) in decilitri prodotto in un ora sulla relativa linea di produzione | |||
---|---|---|---|---|---|
Componente \( C_1\) | Componente \( C_2\) | Componente \( C_3\) | |||
Linea \(L_1\) | 800 | 9 | 14 | 5 | |
Linea \(L_2\) | 800 | 13 | 10 | 6 | |
Linea \(L_3\) | 500 | 18 | 4 | 9 | |
Linea \(L_4\) | 350 | 10 | 16 | 18 |
Tipo di farmaco \( F_k\) | Ricavo \( r_k\) in Euro al decilitro | Quantità minima da produrre in decilitri in un mese | Quantità \(p_{jk}\) in decilitri necessaria per ogni decilitro di farmaco prodotto | |||
---|---|---|---|---|---|---|
Componente \( C_1\) | Componente \( C_2\) | Componente \( C_3\) | ||||
Farmaco \(F_a\) | 20 | 6000 | 0.18 | 0.20 | 0.62 | |
Farmaco \(F_b\) | 32 | - | 0.25 | 0.26 | 0.49 | |
Costi di produzione \( c_j\) in Euro dei componenti al decilitro | 15 | 9 | 2 |
import org.ssclab.log.SscLogger; import org.ssclab.pl.milp.*; public class Farmaceutico { public static void main(String[] args) throws Exception { String pl_problem= "max: 20Qa +32Qb -15q1a -15q1b -9q2a -9q2b -2q3a -2q3b \n" +"0.18Qa <= q1a \n" +"0.20Qa <= q2a \n" +"0.62Qa <= q3a \n" +"0.25Qb <= q1b \n" +"0.26Qb <= q2b \n" +"0.49Qb <= q3b \n" +"9x11 + 13x21 + 18x31 + 10x41 = q1a + q1b \n" +"14x12 + 10x22 + 4x32 + 16x42 = q2a +q2b \n" +"5x13 + 6x23 + 9x33 + 18x43 = q3a + q3b \n" +"x11 + x12 + x13 <= 800 \n" +"x21 + x22 + x23 <= 800 \n" +"x31 + x32 + x33 <= 500 \n" +"x41 + x42 + x43 <= 350 \n" +"Qa>=6000 \n" +"int x* "; MILP milp = new MILP(pl_problem); SolutionType solution_type=milp.resolve(); if(solution_type==SolutionType.OPTIMUM) { Solution soluzione=milp.getSolution(); for(Variable var:soluzione.getVariables()) { SscLogger.log("Nome variabile :"+var.getName() + " valore :"+var.getValue()); } SscLogger.log("Valore ottimo:"+soluzione.getOptimumValue()); } else SscLogger.log("Soluzione non ottima:" + solution_type); } }
Costi \( c_{ij}\) in migliaia di Euro |
città 1 | città 2 | città 3 | città 4 | città 5 | città 6 | città 7 | città 8 | città 9 | città 10 |
---|---|---|---|---|---|---|---|---|---|---|
città 1 | 0 | 10 | 11 | 15 | 23 | 0 | 0 | 33 | 5 | 0 |
città 2 | 11 | 0 | 10 | 0 | 17 | 18 | 0 | 29 | 3 | 0 |
città 3 | 13 | 10 | 0 | 8 | 12 | 0 | 0 | 18 | 0 | 0 |
città 4 | 15 | 0 | 12 | 0 | 0 | 0 | 0 | 15 | 0 | 0 |
città 5 | 25 | 17 | 12 | 0 | 0 | 5 | 5 | 15 | 0 | 5 |
città 6 | 0 | 18 | 0 | 0 | 5 | 0 | 6 | 0 | 20 | 0 |
città 7 | 0 | 0 | 0 | 0 | 5 | 6 | 0 | 20 | 0 | 6 |
città 8 | 33 | 29 | 18 | 15 | 15 | 0 | 20 | 0 | 0 | 9 |
città 9 | 8 | 3 | 0 | 0 | 0 | 20 | 0 | 0 | 0 | 0 |
città 10 | 0 | 0 | 0 | 0 | 5 | 0 | 6 | 7 | 0 | 0 |
import org.ssclab.log.SscLogger; import org.ssclab.pl.milp.MILP; import org.ssclab.pl.milp.Solution; import org.ssclab.pl.milp.SolutionType; import org.ssclab.pl.milp.Variable; public class CommessoViaggiatore { public static void main(String[] args) throws Exception { //matrice dei costi double cij[][] = { { 0, 10, 11, 15, 23, 0, 0, 33, 5, 0 }, { 11, 0, 10, 0, 17, 18, 0, 29, 3, 0 }, { 13, 10, 0, 8, 12, 0, 0, 18, 0, 0 }, { 15, 0, 12, 0, 0, 0, 0, 15, 0, 0 }, { 25, 17, 12, 0, 0, 5, 5, 15, 0, 5 }, { 0, 18, 0, 0, 5, 0, 6, 0,20, 0 }, { 0, 0, 0, 0, 5, 6, 0, 20, 0, 6 }, { 33, 29, 18, 15, 15, 0, 20, 0, 0, 9 }, { 8, 3, 0, 0, 0, 20, 0, 0, 0, 0 }, { 0, 0, 0, 0, 5, 0, 6, 7, 0, 0 }}; char ispettori[] = { 'A', 'B' }; int numero_tratte=5; // definizione funzione obiettivo. String fo = "min:"; for (int d = 0; d < ispettori.length; d++) { for (int t = 0; t < numero_tratte; t++) { for (int i = 0; i < cij.length; i++) { for (int j = 0; j < cij[0].length; j++) { if (cij[i][j] != 0) { fo += "+" + cij[i][j] + "X" + ispettori[d] + (i + 1) + "" + (j + 1) + "" + (t + 1); } } } } } SscLogger.log(fo); // Vincoli1: gli ispettori A partono dalla citta 1 durante il tratto 1 String vincoli1 = "\n"; for (int j = 0; j < cij[0].length; j++) { if (cij[0][j] != 0) { vincoli1 += " +XA1" + (j + 1) + "1"; } } vincoli1 += " =1\n"; SscLogger.log(vincoli1); // Vincoli2: gli ispettori A ritornano alla citta 1 durante il tratto 5 String vincoli2 = ""; for (int i = 0; i < cij.length; i++) { if (cij[i][0] != 0) { vincoli2 += " +XA" + (i + 1) + "15"; } } vincoli2 += " =1\n"; SscLogger.log(vincoli2); // Vincoli3: gli ispettori B partono dalla citta 5 durante il tratto 1 String vincoli3 = ""; for (int j = 0; j < cij[4].length; j++) { if (cij[4][j] != 0) { vincoli3 += " +XB5" + (j + 1) + "1"; } } vincoli3 += " =1\n"; SscLogger.log(vincoli3); // Vincoli4: gli ispettore B ritornano alla citta 5 durante il tratto 5 String vincoli4 = ""; for (int i = 0; i < cij.length; i++) { if (cij[i][4] != 0) { vincoli4 += " +XB" + (i + 1) + "55"; } } vincoli4 += " =1\n"; SscLogger.log(vincoli4); // Vincoli5: ogni gruppo deve visitare una citta una sola volta. String vincoli5 = ""; for (int j = 0; j < cij[0].length; j++) { for (int d = 0; d < ispettori.length; d++) { for (int t = 0; t < numero_tratte; t++) { for (int i = 0; i < cij.length; i++) { if (cij[i][j] != 0) { vincoli5 += " +X" + ispettori[d] + (i + 1) + "" + (j + 1) + "" + (t + 1); } } } } vincoli5 += " =1\n"; } SscLogger.log(vincoli5); // Vincoli6: ciascun gruppo deve effettuare ciascun tratto solo una volta String vincoli6 = ""; for (int d = 0; d < ispettori.length; d++) { for (int t = 0; t < numero_tratte; t++) { for (int i = 0; i < cij.length; i++) { for (int j = 0; j < cij[0].length; j++) { if (cij[i][j] != 0) { vincoli6 += " +X" + ispettori[d] + (i + 1) + "" + (j + 1) + "" + (t + 1); } } } vincoli6 += " =1\n"; } } SscLogger.log(vincoli6); // Vincoli7: per ciascun gruppo la localita di arrivo nel tratto t // deve conincidere con quella di partenza nel tratto t+1 String vincoli7 = ""; for (int d = 0; d < ispettori.length; d++) { for (int t = 0; t < numero_tratte-1; t++) { for (int k = 0; k < cij.length; k++) { for (int i = 0; i < cij.length; i++) { if (cij[i][k] != 0) { vincoli7 += " +X" + ispettori[d] + (i + 1) + "" + (k + 1) + "" + (t + 1); } } vincoli7+= " ="; for (int j = 0; j < cij[0].length; j++) { if (cij[k][j] != 0) { vincoli7 += " +X" + ispettori[d] + (k + 1) + "" + (j + 1) + "" + (t + 2); } } vincoli7 += "\n"; } vincoli7 += "\n"; } } SscLogger.log(vincoli7); String pl_problem = fo + vincoli1 + vincoli2 + vincoli3 + vincoli4 + vincoli5 + vincoli6 + vincoli7 + "\n bin ALL"; MILP milp = new MILP(pl_problem); SolutionType solution_type = milp.resolve(); if (solution_type == SolutionType.OPTIMUM) { Solution soluzione = milp.getSolution(); for (Variable var : soluzione.getVariables()) { if(var.getValue()!=0) SscLogger.log("Variable name :" + var.getName() + " value :" + var.getValue()); } SscLogger.log("valore f.o. :" + soluzione.getOptimumValue()); } else SscLogger.log("Soluzione non ottima:" + solution_type); } }
titolo
tilolo \( k\) nell'anno \( t\) come
frazione di un Euro investito
(\( c_{kt}\))
cedole
(\( c_{k}\))
in anni
(\( d_{k}\))
rischio
(\( r_{k}\))
fissi
in Euro
(\(f_k\))
in
Euro
(\(I_k\))
titolo
(\( k\))
anno
anno
anno
anno
anno
anno
anno
Distribuz.
Distribuz.
Distribuz.
Distribuz.
Distribuz.
Distribuz.
Distribuz.
Distribuz.
Distribuz.
Distribuz.
Distribuz.
Distribuz.
Accumulaz.
Accumulaz.
Accumulaz.
La tabella sopra riportata elenca per ogni titolo \( k\) le quantità \( c_{kt}\), ovvero o le cedole annuali attese nell'anno \( t\) (nel caso di titolo a distribuzione) o il rendimento a scadenza atteso nell'anno \( t=7\) (nel caso di titolo ad accumulazione), il loro totale \( c_{k}\), il tipo di titolo (azioni/obbligazioni), la durata \( d_{k}\), il livello di rischio \( r_{k}\), la presenza di costi fissi in entrata \( f_{k}\), la valuta ed infine il taglio minimo di acquisto (Increment) \( I_{k}\).
In base alla caratteristiche del cliente, il consulente ritiene che la propensione media al rischio debba essere, su una scala che va da 1 a 5, al livello di 2 (rischio medio). Inoltre, sempre nella ricerca della riduzione del rischio, introduce ulteriori limitazioni legate in particolar modo alla diversificazione degli investimenti.
In definitiva per impostare un livello di rischio adeguato, impone che:
1) Il rischio medio totale non superi il livello di 2.
2) L'investimento in dollari non superi il 30% (30.000 Euro).
3) L'investimento in sterline non superi il 15% (15.000 Euro).
4) Nel caso di più tipologie di investimento, tutte relative ad una stessa società emittente, occorre investire solamente in uno tra gli strumenti finanziari ad essa riconducibili (ad esempio, obbligazioni ed azioni di una stessa società).
Tra i titoli selezionati occorre distinguere tra quelli che distribuiscono cedole annuali (distribuzione), dagli altri che reinvestono automaticamente i proventi ed i dividendi nello stesso titolo (accumulazione). Nel caso di questi ultimi, al momento della scadenza o della liquidazione dell'investimento, si riceve la remunerazione sia del capitale investito che dei dividendi/interessi accumulati, mentre nel caso dei primi i dividenti/interessi acquistiti al termine di ciascun anno possono essere reinvestiti in altri strumenti nell'anno successivo.
Le durate in anni dei titoli riportate nella tabella sopra descritta o sono relative alla naturale scadenza di obbligazioni o alla durata che si ritiene più opportuna per investire in un titolo; ad esempio per i titoli azionari e per gli ETF il consulente si propone di investire per l'intero arco temporale di 7 anni. La presenza nella tabella, nella sezione cedole, del simbolo trattino (-) , sta ad indicare che quel titolo non è valido in quello specifico anno e che quindi non può restituire cedole.
Una volta definite tutte queste limitazioni il consulente finanziario cerca di determinare con quali proporzioni (ottime) suddividere i 100.000 euro tra i titoli selezionati al fine di massimizzare il rendimento totale. Per determinare tali quote è sufficiente risolvere un problema di programmazione lineare.
Con \( X_{k}\) indichiamo una variabile che rappresenta (in euro) l'ammontare investito nel titolo k-esimo (con \( k \in \{A,B,C,...,O \} \)), mentre con \( LQ_{t}\) una variabile (liquidità) che rapprenta l'ammontare temporaneamente non investito nell'anno t-esimo (con \( t \in \{1,2,3,...,7\} \)). Inoltre indichiamo con \( \mathbb{I}_t\) l'insieme dei titoli la cui validità inizia nell'anno t-esimo; con \( \mathbb{F}_t\) l'insieme dei titoli la cui scadenza cade alla fine dell'anno t-esimo ed infine con \( \mathbb{A}_t\) l'insieme dei titoli "attivi" nell'anno t-esimo, ovvero quei titoli che distribuiscono utili nell'anno t-esimo in quanto tale anno è compreso od uguale all'anno di inizio e fine validità.
Sul titolo con codice \( E\) (ovvero con \(k = E\)) è prevista una condizione di acquisto con un taglio minimo: il titolo può essere acquistato in tagli minimi di 1000 Euro o suoi multipli. Questo vincolo può essere implementato imponendo che le variabili \( X_{k}\) soggette a tale limitazione siano numeri interi. Queste variabili intere rappresentano il numero di tagli/pezzi su cui investire e devono essere incluse nei vincoli e nella funzione obiettivo moltiplicate per un coefficiente pari all'importo del taglio \( I_{k}\). Nel nostro caso la variabile \( X_{E}\) dovrà assumere solo valori interi positivi. Sulla base di queste premesse, i vincoli sono i seguenti:
Vincolo relativo al primo anno di investimento. L'ammontare dei titoli su cui si investe nell'anno \( t = 1\), sommato alla parte di ammontare non investito (liquidità) sarà uguale alla somma messa a disposizione dal cliente (100.000 Euro):
\[ LQ_{1} + \sum_{k \in \mathbb{I}_1 } I_{k} * X_{k} = 100000 \] \[ X_{E} \in \mathbb{N} \] \[ X_{k} \ge 0 , \forall k \in \{A,B,C,...,O\}\] \[ LQ_t \ge 0 , \forall t \in \{1,2,3,...,7\}\]
Vincoli relativi agli anni successivi al primo. Al termine dell'anno \( t\) l'ammontare dei titoli che giungono a scadenza e che vengono disinvestiti, insieme alla liquidità e agli utili ricavati nel medesimo anno, possono nell'anno successivo \( t+1\) o essere reinvestiti negli strumenti finanziari che iniziano a rendersi disponibili o essere temporaneamente mantenuti come liquidità:
\[ LQ_{t+1} + \sum_{k \in \mathbb{I}_{t+1} } I_{k} * X_{k} = LQ_{t} + \sum_{k \in \mathbb{F}_t } I_{k} * X_{k} +\sum_{k \in \mathbb{A}_t } I_{k} * X_{k}*c_{kt} \,\,\,\,\,\, \forall t \in \{1,2,3,4,5,6\} \]
Vincolo relativo al livello di rischio. Il rischio deve essere in media minore di 2, per fare ciò ponderiamo gli ammontari dei titoli col relativo rischio e si impone che in media il valore sia minore rispetto al rischio desiderato (\( \le 2\)); occore però osservare che i titoli hanno spesso durate diversificate, per cui ponderiamo gli ammontari anche con la loro durata \( d_k\) per dare l'appropriato peso ai titoli che presentano durate maggiori:
\[ \sum_{k=A}^{O} I_{k}*X_{k}*d_k*r_k \le 2 * \sum_{k=A}^{O} I_{k}*X_{k}*d_k \]
Il portafoglio titoli presenta sia obbligazioni che azioni della società EMNEL. Per soddisfare il vincolo relativo alla condizione che occorre al massimo investire solo su uno dei due strumenti, introduciano le variabili binarie \( EM_1 , EM_2 \). Impostando opportunamente tali variabili è possibile costruire dei vincoli che permettono che solo su uno dei due titoli sia possibile investire:
\[ EM_1 + EM_2 \le 1 \] \[ X_I \le 100000*EM_1 \] \[ X_L \le 100000*EM_2 \] \[ EM_1,EM_2 \in \{0,1\} \]
Inoltre, occorre inserire i vincoli relativi ai punti 2) e 3), ovvero quelli che limitano l'investimento in dollari e sterline rispettivamente del 30% ed 15%:
\[ X_B + X_M \le 30000 \] \[ X_A \le 15000 \]
Per poter rappresentare dei costi fissi (nell'esempio sono stati inseriti sugli ETF) occorre introdurre una ulteriore variabile binaria per ogni titolo che presenta tali costi. Questa variabile binaria, che chiamiamo \( J_k\), rappresenta la decisione di investire o meno nel titolo k-esimo e, se si decide di investire in tale titolo, assume il valore 1. Questo avviene tramite la costruizione dei vincoli \( (a)\) che associano la decisione di investire nel titolo k-esimo solo se la corrispettiva variabile binaria \( J_k\) assume valore pari ad 1, in questo modo il costo fisso \( f_k\) relativo a ciascun titolo viene incorporato nella funzione obiettivo tramite la stessa variabile binaria introdotta \( (b)\):
\[ X_k \le 100000*J_k \,\,\,\,\forall k \in \{M,N,O\} \,\,\,\,\,(a)\] \[ \sum_{k=M}^{O} J_{k}*f_k \,\,\,\,\,(b)\] \[ J_{k} \in \{0,1\} \,\,\,\,\forall k \in \{M,N,O\} \]
Infine possiamo esplicitare la funzione obiettivo, che ha come finalità quella di massimizzare il rendimento totale meno i costi fissi:
\[ max : \sum_{k=A}^{O} I_{k}*X_{k}*c_k - \sum_{k=M}^{O} J_{k}*f_k \]
Sostituendo nella funzione obiettivo e nei vincoli i valori reali otteniamo il seguente problema di programmazione lineare:
\[ max : 0.261X_A+0.308X_B+0.105X_C+0.189X_D+99X_E+0.28X_F+0.03X_{G1}+0.03X_{G2}+0.03X_{G4}+ \] \[ 0.028X_{G7}+0.49X_H+0.56X_I+0.25X_L+0.90X_M+0.60X_N+0.31X_O -50J_M -50J_N -50J_O \]
vincolato a: \[ (vincoli\,\, relativi\,\, alle\,\, somme\,\, investite) \] \[ LQ_1+X_A+X_B+X_C+X_D+X_F+X_{G1}+X_H+X_I+X_M+X_N+X_O = 100000 \,\,\,(1^{\circ}\,anno)\] \[ LQ_2+X_{G2}+X_L = X_{G1}+LQ_1+0.031X_A+0.044X_B+0.035X_C+0.027X_D+0.04X_F+0.03X_{G1}+0.07X_H+0.07X_I \,\,\,(2^{\circ}\,anno)\] \[ LQ_3 = X_{G2}+LQ_2+0.036X_A+0.044X_B+0.035X_C+0.027X_D+0.04X_F+0.03X_{G2}+0.07XH+0.07X_I+0.0625X_L \,\,\,(3^{\circ}\,anno)\] \[ LQ_4+X_{G4} = LQ_3+X_C+0.041X_A+0.044X_B+0.035X_C+0.027X_D+0.04X_F+0.07X_H+0.08X_I+0.0625X_L \,\,\,(4^{\circ}\,anno)\] \[ LQ_5+1000X_E = X_{G4}+LQ_4+0.046X_A+0.044X_B+0.027X_D+0.04X_F+0.03X_{G4}+0.07X_H+0.08X_I+0.0625X_L \,\,\,(5^{\circ}\,anno)\] \[ LQ_6 = LQ_5 +X_L+0.051X_A+0.044X_B+33X_E+0.027X_D+0.04X_F+0.07X_H+0.08X_I+0.0625X_L \,\,\,(6^{\circ}\,anno)\] \[ LQ_7+X_{G7} = LQ_6+X_A+0.056X_A+0.044X_B+33X_E+0.027X_D+0.04X_F+0.07X_H+0.09X_I \,\,\,(7^{\circ}\,anno)\]
\[ X_{E} \in \mathbb{Z} \] \[ X_{k} \ge 0 , \forall k \in \{A,B,C,...,O\}\] \[ LQ_t \ge 0 , \forall t \in \{1,2,3,...,7\}\]
\[ (vincolo\,\, relativo\,\, al\,\, rischio\,\, \le 2) \] \[ 6X_A+7X_B+4.5X_C+7X_D+4500X_E+14X_F+X_{G1}+X_{G2}+X_{G4}+X_{G7}+21X_H+28X_I+6X_L+28X_M+28X_N+7X_O <= \] \[ 12X_A+14X_B+6X_C+14X_D+6000X_E+14X_F+2X_{G1}+2X_{G2}+2X_{G4}+2X_{G7}+14X_H+14X_I+8X_L+14X_M+14X_N+14X_O \]
\[ (ulteriori\,\, vincoli) \] \[ X_A \le 15000 \] \[ X_B + X_M \le 30000 \]
\[ EM_1 + EM_2 \le 1 \] \[ X_I \le 100000EM_1 \] \[ X_L \le 100000EM_2 \] \[ EM_1,EM_2 \in \{0,1\} \]
\[ X_M \le 100000J_M \] \[ X_N \le 100000J_N \] \[ X_O \le 100000J_O \] \[ J_M,J_N,J_O \in \{0,1\} \]
Risolvendo il problema SSC sotto riportato otteniamo la seguente soluzione ottima, ricordando che la variabile \( X_{E}\) deve essere moltiplicata per il suo taglio \( I_{k}\):
\[ X_A=15000, X_B=0, X_C=0, X_D=0, X_E=3, X_F=0, X_{G1}=0, X_{G2}=0, X_{G4}=2086,\] \[ X_{G7}=18861, X_H=5871, X_I=0, X_L=876, X_M=30000, X_N=0, X_O=49129 \]
Per un rendimento complessivo di 50028 Euro.